2015-09-02 5 views
1

Я построил счетчик, который я тестировал, чтобы работать вместе с другой игрой, в которую я играю. Теперь я хочу использовать Tkinter GUI для отображения этого счетчика по мере его увеличения.Python - Tkinter Freezing w/PyHook

Я плохо понимаю, что есть проблема с запуском mainloop от Tkinter одновременно с запуском части PumpMessages, необходимой для моего PyHook. Я пробовал фрагменты кода для внесения исправлений, но я не могу найти ничего, что я могу подключить.

Как обновить код, чтобы графический интерфейс Tkinter не просто замерзал?

import pyHook, pythoncom, sys, win32api, win32con, time, ctypes 
from Tkinter import * 
from threading import Thread 

Fc, JKc = 0, 0 
x, j, i = '', '', '' 

def killProgram(): 
    ctypes.windll.user32.PostQuitMessage(0) 
    root.destroy() 
    rootThread.join() 

#this is my counter input 
def onKeyboardEvent(event): 
    global i, x, Fc, JKc, j 
    i = event.Key 
    if i=='F4': 
     killProgram 
    elif i=='Return': 
     if 'f ' == x[:2] and len(x) >= 3: 
      Fc = Fc + 1 
     elif 'jk ' == x[:3] and len(x) >= 4: 
      JKc = JKc + 1 
     j = x 
     x = '' 
    elif i=='Up': 
     x = j 
    else: 
     x = x + chr(event.Ascii) 
    return True 

hooks_manager = pyHook.HookManager() 
hooks_manager.KeyDown = onKeyboardEvent 
hooks_manager.HookKeyboard() 

#My GUI 
root = Tk() 

wlabel = Label(root, text='Weapon') 
wlabel.grid(column=0, row=0, sticky='NE') 

hlabel = Label(root, text='Hand') 
hlabel.grid(column=1, row=0, sticky='N') 

alabel = Label(root, text='All') 
alabel.grid(column=2, row=0, sticky='NW') 

wc = StringVar() 
wcounter = Label(root, textvariable = wc) 
wcounter.grid(column=0, row=1, sticky='SE') 

hc = StringVar() 
hcounter = Label(root, textvariable = hc) 
hcounter.grid(column=1, row=1, sticky='S') 

ac = StringVar() 
acounter = Label(root, textvariable=ac) 
acounter.grid(column=2, row=1, sticky='SW') 

def startTimerThread(): 
    while True: 
     win32api.PostThreadMessage(mainThreadId, win32con.WM_QUIT, 0, 0) 
     time.sleep(1) 

mainThreadId = win32api.GetCurrentThreadId() 
timerThread = Thread(target=startTimerThread) 
timerThread.start() 

#Updates Label 
while runningProgram: 
    hc.set(text=str(Jkc)) 
    #wc.set(text=str(Fc)) 
    #ac.set(text=str(Fc+JKc)) 
    root.after(100,root.quit) 
    root.mainloop() 
    pythoncom.PumpMessages() 

ответ

0

Вам нужно будет иметь PumpMessages() в отдельной теме. Кроме того, если вы не хотите, чтобы ваш графический интерфейс замерзал вскоре после запуска, вы хотите делегировать свой onKeyboardEvent() для создания отдельных потоков, так как эта функция должна вернуть True или False как можно быстрее.