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() に渡すにはどうすればよいですか?

編集:スレッドを使用して、1 つのスレッドがデータを受信し、mainloop() スレッドが定期的に新しいデータをチェックするようにする必要がありますか? 以前にスレッドを使用したことがありませんが、これで解決できますか?

これを行うためのより良い方法がある場合は、お知らせください。

ありがとう!

4

1 に答える 1

0

self.data1_Var.after(200, self.update_data1)が問題です。self.update_data1のパラメーターをself.data1_Var.after(eg )に渡す必要があります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 に答える