다음은 문제의 배경입니다. 현재 열매 맺는 파이에 온도계/습도 센서의 센서 판독 값을 표시하는 간단한 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()에서 모듈에 주어진 인수를 보지 못했고, 인수를 추가하면 재귀 오류가 발생합니다.
위젯 인스턴스를 제공하지 않고'after'를 호출 할 수 없다고 생각합니다. 'change'에서'main'이나'self.after'에서'root.after'를 할 수는 있지만'tk.Frame.after'만으로는 할 수 없습니다. (코드를 완벽하게 작성하기 전에 다른 여러 문제를 생각해 볼 것이므로 생각하지 않기 때문에 답변이 아니라 주석으로 게시하고 있습니다. 모두 해결할 시간이 없습니다) – Kevin
예, self.root를 사용하면 gui가 나타나지만 (업데이트되지 않음) 다른 오류가 나타납니다. 고마워. 나는 새로운 오류를 극복하려고 노력할 것이다. 그러나 실패한다면, 나는 그것을 위의 내 게시물에 추가 할 것이다. – Keenan
오류 메시지를 읽으십시오. 정확히 무엇이 잘못되었는지를 알려줍니다. 인수로 호출 할 수 있도록'change'를 설계했지만'after'를 호출 할 때 인수를 전달하지는 않습니다. –