2013-09-28 3 views
1

pywinusb로 HID의 데이터를 동시에 읽은 다음 해당 데이터로 tkinter 창을 업데이트하려고합니다. HID 측에서 무언가가 일어날 때, 나는 tkinter 창에 즉시 그 변화가 반영되기를 바랍니다.Python + Tkinter : HID에서 데이터를 읽고 tkinter 라벨을 동시에 업데이트

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' 

내 질문은 추측 :

내가 코드를 실행하고 장치가 데이터를 송신 할 때

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() 

, 나는이 오류가 : 여기

코드입니다 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에 코드를 넣는 대신 레이블 텍스트를 직접 편집하지 마십시오. 새로운 데이터가 수신 될 때마다 이 호출되어 텍스트를 업데이트하는 update_data1을 호출하기 때문에 왜 self.data1_Var.after(200, self.update_data1)이 필요한지 확실하지 않습니다.