2016-06-10 2 views
1

다음은 문제의 배경입니다. 현재 열매 맺는 파이에 온도계/습도 센서의 센서 판독 값을 표시하는 간단한 tkinter GUI가 있습니다. 그러나, 나는 그것에 도달하기 전에 tkinter가 새로운 값으로 업데이트 할 수 있는지 확인할 필요가있었습니다. 나는 사용하고있는 코드를 포함시켰다. 지금은 섭씨 온도를 1 초마다 1 씩 증가 시키려고 노력하고 있습니다. 코드가 root.mainloop 인 동안 change()를 호출하여 GUI의 특정 레이블을 업데이트합니다.). 그러나, 나는 그것을 시도 할 때마다 오류가 발생하고, 그것을 해결하는 방법을 잘 모르겠습니다.root.after()가 작동하는 데 문제가 있습니다.

내 코드 :

import tkinter as tk 
    from tkinter import ttk 

    class Example(tk.Frame): 

     def __init__(self, parent): 
      tk.Frame.__init__(self, parent, background="white") 

      self.parent = parent 

      self.initUI() 


     def initUI(self): 

      self.parent.title("Interface") 
      self.style = ttk.Style() 
      self.style.theme_use("alt") 

      self.pack(fill=tk.BOTH, expand=1) 

      self.tempLabel = tk.Label(self, text="Temperature", fg="black", bg="white") 
      self.tempLabel.grid(row=0, column=0) 

      self.tempC = tk.Label(self, text="4654645˚ Celsius", fg="black", bg="white") 
      self.tempC.grid(row=1, column=0) 

      self.tempF = tk.Label(self, text="0˚ Fahrenheit", fg="black", bg="white") 
      self.tempF.grid(row=2, column=0) 

      self.rhLabel = tk.Label(self, text="Relative Humidity", fg="black", bg ="white") 
      self.rhLabel.grid(row=0, column=1) 

      self.rh = tk.Label(self, text=" 53.37%", fg="black", bg="white") 
      self.rh.grid(row=1, column=1) 

     def change (self, variable, state): 
      variable + 1 
      newText = str(variable) 

      if state ==1: 
       newText += "%" 
       self.rh.config(text=newText, width =20) 
       self.rh.update_idletasks() 

      elif state ==2: 
       newText += "˚ Celsius" 
       self.tempC.config(text=newText, width =20) 
       self.tempC.update_idletasks() 

      elif state ==3: 
       newText += "˚ Fahrenheit" 
       self.tempF.config(text=newText, width =20) 
       self.tempF.update_idletasks() 

      self.after(1000, self.change) 

def main(): 
    var =0 

    root = tk.Tk() 
    root.geometry("250x250+300+300") 
    app = Example(root) 
    app.change(var, 2) 
    root.mainloop() 


if __name__ == '__main__': 
    main() 

여기에 내가 오류입니다 : (이 오류가 고정)

Traceback (most recent call last): 
File "/home/pi/tkinter_test.py", line 108, in <module> 
main() 
File "/home/pi/tkinter_test.py", line 102, in main 
app.change(var, 2) 
File "/home/pi/tkinter_test.py", line 92, in change 
tk.Frame.after(1000, self.change) 
File "/usr/lib/python3.2/tkinter/__init__.py", line 486, in after 
self.tk.call('after', ms) 
AttributeError: 'int' object has no attribute 'tk' 

어떤 도움을 주시면 감사하겠습니다. 나는 Python을 처음 사용하기 때문에 코드의 문제는 아마 어리 석다.

편집 : 아래 케빈의 제안 당

, 나는 (1000 self.change) self.after하는 (1000 self.change) tk.Frame.after을 변경했습니다. 그러나, 지금이 오류가 무엇입니까 :

Exception in Tkinter callback 
Traceback (most recent call last): 
File "/usr/lib/python3.2/tkinter/__init__.py", line 1426, in __call__ 
return self.func(*args) 
File "/usr/lib/python3.2/tkinter/__init__.py", line 490, in callit 
func(*args) 
TypeError: change() takes exactly 3 arguments (1 given) 

그것은 내가 이후에 그것을 사용하는 경우 나 인수없이 self.change를 호출 좋아되지 않을 것를(). 그러나, 온라인으로 보면 after()에서 모듈에 주어진 인수를 보지 못했고, 인수를 추가하면 재귀 오류가 발생합니다.

+2

위젯 인스턴스를 제공하지 않고'after'를 호출 할 수 없다고 생각합니다. 'change'에서'main'이나'self.after'에서'root.after'를 할 수는 있지만'tk.Frame.after'만으로는 할 수 없습니다. (코드를 완벽하게 작성하기 전에 다른 여러 문제를 생각해 볼 것이므로 생각하지 않기 때문에 답변이 아니라 주석으로 게시하고 있습니다. 모두 해결할 시간이 없습니다) – Kevin

+0

예, self.root를 사용하면 gui가 나타나지만 (업데이트되지 않음) 다른 오류가 나타납니다. 고마워. 나는 새로운 오류를 극복하려고 노력할 것이다. 그러나 실패한다면, 나는 그것을 위의 내 게시물에 추가 할 것이다. – Keenan

+0

오류 메시지를 읽으십시오. 정확히 무엇이 잘못되었는지를 알려줍니다. 인수로 호출 할 수 있도록'change'를 설계했지만'after'를 호출 할 때 인수를 전달하지는 않습니다. –

답변

0

root.after() 대신 root.update()를 사용하려고 했습니까? 이 예에서

import tkinter as tk 
root = tk.Tk() 
b = Frame(root) 
root.update() 

내가 대신 root.mainloop()의 root.update를 사용하지만, 어떤것 결합 할 수 root.update()의 멋진 부분은이다 : 나를 위해 그것을 이렇게 많이 더 잘 작동 정확히 뭐하는거야

+0

'root.update()'는이 문맥에서 목적이 없다. –

+0

나는 bryan을 도우려고했는데, 뭐가 잘못 됐는지 보지 못했다. –

+1

네, 온라인에서 root, update 및 root.update_idletasks를 while 루프에 넣을 수 있다는 것을 알았고 root.mainloop과 거의 동일한 목적으로 사용하게됩니다. mainloop로 작업 할 수 없다면 시도해 보겠지 만, root.mainloop은 tkinter ID와 함께 사용해야하므로이 방법으로 작업 할 수 있습니다. – Keenan

관련 문제