2013-09-28 223 views
1

我試圖用pywinusb同時從HID讀取數據,然後用該數據更新tkinter窗口。當發生HID方面的事情時,我希望我的tkinter窗口立即反映出這一變化。Python + Tkinter:從HID讀取數據並同時更新tkinter標籤

下面是代碼:

import pywinusb.hid as hid 
from tkinter import * 

class MyApp(Frame): 
    def __init__(self, master):   
     super(MyApp, self).__init__(master) 
     self.grid() 
     self.setupWidgets() 
     self.receive_data() 

    def setupWidgets(self): 
     self.data1 = StringVar() 
     self.data1_Var = Label(self, textvariable = self.data1) 
     self.data1_Var.grid(row = 0, column = 0, sticky = W) 

    def update_data1(self, data): 
     self.data1.set(data) 
     self.data1_Var.after(200, self.update_data1) 

    def update_all_data(self, data): 
     self.update_data1(data[1]) 
     #self.update_data2(data[2]), all points updated here... 

    def receive_data(self): 
     self.all_hids = hid.find_all_hid_devices() 
     self.device = self.all_hids[0] 
     self.device.open() 
     #sets update_all_data as data handler 
     self.device.set_raw_data_handler(self.update_all_data) 

root = Tk() 
root.title("Application") 
root.geometry("600x250") 
window = MyApp(root) 
window.mainloop() 

當我運行的代碼,使設備發送數據時,我得到這個錯誤:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Program Files\Python 3.3\lib\tkinter\__init__.py", line 1442, in __call__ 
    return self.func(*args) 
    File "C:\Program Files\Python 3.3\lib\tkinter\__init__.py", line 501, in callit 
    func(*args) 
TypeError: update_data1() missing 1 required positional argument: 'data' 

我想我的問題是:

我如何使用HID中的當前數據持續更新標籤? 如何將新數據傳遞給update_data1()?

編輯:我應該使用線程,以便我有一個線程接收數據,並且mainloop()線程會定期檢查新數據嗎?我以前沒有使用過線程,但是這可能是一個解決方案嗎?

如果有更好的方法來做到這一點,請讓我知道。

謝謝!

回答

0

self.data1_Var.after(200, self.update_data1)是問題所在。您需要將self.update_data1的參數傳遞給self.data1_Var.after(例如self.data1_Var.after(200, self.update_data1, some_data))。否則,在200毫秒後,self.update_data1將被調用而不帶參數,導致您看到的錯誤。

順便說一句,爲什麼不直接編輯標籤的文本,而不是把代碼放在self.update_all_data。我不清楚爲什麼self.data1_Var.after(200, self.update_data1)是必需的,因爲每當收到新數據時,update_all_data被調用,其中調用update_data1哪些更新文本。