2015-09-02 71 views
1

我已經構建了一個計數器,我已經測試過與另一個我玩的遊戲一起工作。現在我想利用Tkinter GUI來顯示這個計數器,因爲它增加了。Python - Tkinter Freezing w/PyHook

我鬆散地理解,在運行我的PyHook所需的PumpMessages部分的同時,運行Tkinter的mainloop時出現問題。我試過使用Google代碼片段進行更正,但找不到任何可以插入的東西。

如何更新我的代碼,以便Tkinter GUI不會凍結?

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()。此外,除非您希望GUI在啓動後立即凍結,否則您希望委託您的onKeyboardEvent()創建單獨的線程,因爲該功能需要儘快返回TrueFalse