@Hackerman1
17 лет, плохое зрение.

Как мне из функции Thread2() вызвать функцию main() из функции Thread1()?

Вот код:
from DataBase_0_2_0 import *
import json
import pyttsx3
import os
import sys
import speech_recognition as sr
import time
import datetime
from fuzzywuzzy import fuzz
import tkinter as tk
from PIL import ImageTk, Image
import webbrowser as wb
from threading import Thread

filename = "settings.json"

#=============================================================Датабаза
def Thread1():
    def _save(settings):
        with open (filename, 'w', encoding='utf-8') as f:
            json.dump(settings, f, indent = 4, ensure_ascii = False)
            f.close()       
 
    def _getDate():
        with open (filename, 'r', encoding='utf-8') as f:
            load = json.load(f)
            dates = list(load.values())
            return dates
            f.close() 

#==============================================================

    def speak(what): # Сказать
        print(what)
        x = pyttsx3.init()
        voice = x.getProperty('voice')
        x.setProperty(voices, voices[0].id)
        x.say(what)
        x.runAndWait()
        x.stop

    def hear(): # Записать
        global error
        r = sr.Recognizer()
        try:
            with sr.Microphone() as source:  # Запись аудио
                r.adjust_for_ambient_noise(source, duration=0.5)  # шумоподавление
                print("Скажите что-нибудь: ")
                audio = r.listen(source)
            text = r.recognize_google(audio, language="ru-RU") # Преобразование речи в текст
            error = 0 # Возвращает 0 в ложные запросы
            return text.lower()  # Возврат

        except:
            return hear()

    def debug_Mode(): # Режим отладки
        speak("Введи ключ доступа")
        cod = input("--> ")
        if cod == "2004":
            speak("Запускаю режим отладки")
            print("=" * 40)
            mod = True
        else:
            speak("Ошибка доступа")

        while mod == True:
            zapros = hear()
            print("[log]:" + zapros)
            if zapros == "выход":
                mod = False
                speak("закрываю режим отладки")
                print("=" * 40)

    def Search(zapros): # Функция поиска
        speak("Открываю в поиске: " + zapros)
        url = "https://www.google.ru/search?q=" + zapros
        wb.open_new(url)
        play = False

    def main(): # Главная функция
        settings = {}
        date = _getDate()

        speak("Здравствуй, я голосовой ассистент Юля. Версия 0.2.0.")

        while True: # Главный цикл

            request = hear() # Прослушмваем

            result = [key for key, val in database.items() if request in val]  # Проверяем наличие нашего запроса в базе, помещаем ответ в переменную
            result = "".join(result)  # Преобразуем список в строку

            if result:

                if result == "Режим отладки":
                    debug_Mode()

                elif result == exit_:
                    speak(result)
                    os.system("TASKKILL /F /IM python.exe")

                elif result == Real_Need:
                    speak(result)

                elif result == Your_History:
                    speak(result)

                elif result == Program1:
                    Program1way = Program.get()
                    settings['Program1way'] = Program1way
                    _save(settings)
                    speak(result)

                elif result == Program1Start:
                    os.startfile(Program1way)
                    speak(result)

                elif result == Programn2:
                    Program2way = Program2.get()
                    settings['Program2way'] = Program2way
                    _save(settings)
                    speak(result)

                elif result == Program2Start:
                    os.startfile(Program2way)
                    speak(result)

                elif result == FindIt:
                    speak("Скажите запрос")
                    Findit = hear()
                    Search(Findit)

                else:
                    speak(result)
            else:
                speak("Команда не распознана")
                continue




#=========================================================== Ход работы
def Thread2():
    def _from_rgb(rgb): # Для работы TKinter
        return "#%02x%02x%02x" % rgb

    error = 0
    root = tk.Tk() # Задаем новое окно

    root.geometry('400x500') # Определяем размеры
    root.resizable(width=False, height=False) # Закрепляем размеры
    root.title("Голосовой ассистент Юля")

#======= Непонятный код ======

    image = Image.open("Background.png")
    width = 500
    ratio = (width / float(image.size[0]))
    height = int((float(image.size[1]) * float(ratio)))
    image = image.resize((width, height), Image.ANTIALIAS)
    image = ImageTk.PhotoImage(image)
    canvas = tk.Canvas(root, width=width, height=height)
    canvas.pack(side="top", fill="both", expand="no")
    canvas.create_image(0, 0, anchor="nw", image=image)

#==============================

    canvas.create_text(200, 25, text="Юлия 0.2.0", fill="Purple", font='Helvetica 30') # Текст
    canvas.create_text(200, 50, text="Голосовой помощник, созданный для общения", fill="Purple", font='Times 13') # Текст

    button = tk.Button(root, text='Запуск', font="Times 30", bg=_from_rgb((189, 223, 249))) # Настройки для кнопки
    canvas.create_window((125, 400), anchor="nw", window=button) # Вывод кнопки.
    button.config(command=lambda: Thread1.main()) # Вызов кнопкой функции main()
    Program = tk.Entry(root, width=61)
    Program2 = tk.Entry(root, width=61)
    canvas.create_text(200, 75, text="Программа №1", fill="Purple", font='Times 13')
    canvas.create_window((10, 85), anchor="nw", window=Program)
    canvas.create_text(200, 115, text="Программа №2", fill="Purple", font='Times 13')
    canvas.create_window((10, 125), anchor="nw", window=Program2) 

    Program1way = ""
    Program2way = ""
    root = tk.mainloop() # Запуск окна
Thr1 = Thread(target=Thread1)
Thr2 = Thread(target=Thread2) 
Thr1.start()
Thr2.start()
#==========================================================

Вот ошибка:
Exception in Tkinter callback
Traceback (most recent call last):
File "F:\Programming\Python3.9.2\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "F:\Programming\Yulia\Yulia_0_2_0.py", line 174, in
button.config(command=lambda: main()) # Вызов кнопкой функции main()
NameError: name 'main' is not defined
  • Вопрос задан
  • 95 просмотров
Пригласить эксперта
Ответы на вопрос 1
MinTnt
@MinTnt
Вообще, зачем добавлять эту строчку.
Thr1 = Thread(target=Thread1)
Если функция Thread1 как сама, ничего не выполняет, поток завершиться спустя пару секунд после запуска.

Ну а вообще. Если нужно просто вызвать функцию main из первой, то
1) Добавьте в конец функции Thread1 строчку
Thread1.main = main
И после этого, один раз в основном коде, используйте Thread1(), это обновит её атрибуты

Если же нужно чтоб первый поток шёл паралельно второму. То первую функцию нужно так же зациклить, и добавить проверку, чтоб при изменении какого-то определенного элемента - выполнять какое-то действие в первой.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы