Tkinter с другим бесконечным циклом (для преобразования речи в текст) - PullRequest
1 голос
/ 01 июля 2019

Графический интерфейс Tkinter не отображается при параллельной работе с другим бесконечным циклом: я пробовал использовать многопроцессорные методы многопоточности, в то время как в основном коде использовал графический интерфейс и вызывал код livepeech или наоборот; и определение обоих кодов в функции и вызова из основного потока. Но проблема остается; ниже приведен другой результат, хотя вы находите это комментарием, но тоже попробовали этот метод,

    #*********************************** IMPORTING MODULES*****************
import tkinter
from tkinter import*
import tkinter.messagebox
import sqlite3
import os
from multiprocessing import Process
from pocketsphinx import LiveSpeech, get_model_path
import threading
from time import sleep

model_path = get_model_path()

#*************** TKINTER GUI CODE******************
def gui():
 window = tkinter.Tk()
 window.title("Smart Notice Board")

 top = Canvas(window,width=400,height=200)
 top.pack(fill=X)

 button_5 = Button(text='PORTAL SYSTEM', height = 2, width=17, activebackground = '#33B5e5', bg = 'brown', fg = 'white',command  = portal )
 top.create_window(80,80, anchor='nw', window = button_5)


def portal():
   print("2")



#****************  speech TO text CODE***************

def speech(): 
    speech = LiveSpeech(
        verbose=False,
        sampling_rate=16000,
        buffer_size=2048,
        no_search=False,
        full_utt=False,
        hmm=os.path.join(model_path, 'en-us'),
        lm=os.path.join(model_path, '8582.lm'),
        dic=os.path.join(model_path, '8582.dict')
    )

    for phrase in speech:
        print(phrase)
        a=str(phrase)
        print(a)

#************************** MAIN LOOP************************

if __name__ == "__main__":

    #************ FOR THREADING************
    #thread1 = threading.Thread(target=gui)
    #thread2 = threading.Thread(target=speech)
    #thread1.daemon = True
    #thread1.start()
    #thread2.start()

    #thread1.join()
    #thread2.join()


    #************ FOR MULTIPROCESSING****************

    #processes=[]
    #P1 = Process(target=gui)
    #P2 = Process(target=speech)
    #processes.append(P1)
    #processes.append(P2)
    #P2.daemon = True
    # Will execute both in parallel
    #P1.start()
    #P2.start()
    # Joins threads back to the parent process, which is this
    # program
    #P1.join()
    #P2.join()


    #****************** live speech code*************
    window = tkinter.Tk()
    window.title("Smart Notice Board")

    top = Canvas(window,width=400,height=200)
    top.pack(fill=X)

    button_5 = Button(text='PORTAL SYSTEM', height = 2, width=17, activebackground = '#33B5e5', bg = 'brown', fg = 'white',command  = portal )
    top.create_window(80,80, anchor='nw', window = button_5)

both as fn and call from main loop

now livespeech in main loop and calling GUI,only livespeech works and GUI not shows up

В многопроцессорном корпусе; нет ошибки, но ничего не работает

1 Ответ

0 голосов
/ 01 июля 2019

Это код, который я использую, чтобы получить позицию курсора события перемещения мыши из очереди и действовать соответственно:

def check_mouse(self):
    while True:
        item = self.mouse.get_item()
        if item is None:
            break
        else:
            self.master.after_idle(self.mouse_move, *item)

    self.master.after(INTERVAL, self.check_mouse)

и впервые вызывается непосредственно перед вызовом mainloop, с еще одним self.master.after(INTERVAL, self.check_mouse).

Так что заставьте Tkinter GUI выполнять свою работу в основном цикле, и вы должны создать еще один цикл с задачей, которая будет выполняться после INTERVAL (в миллисекундах), и он будет вызывать себя каждый период INTERVAL после завершения своей работы.

...