我正在尝试使用pywinusb同时从HID读取数据,然后使用该数据更新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 :(得分: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
。