1

我正在尝试使用 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() 线程定期检查新数据吗?我以前没有使用过线程,但这可能是一个解决方案吗?

如果有更好的方法可以做到这一点,请告诉我。

谢谢!

4

1 回答 1

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它,它会调用更新文本。

于 2013-09-29T08:12:41.390 回答