这里有一些问题的背景:我正在尝试在覆盆子pi上显示一个简单的tkinter gui,显示温度计/湿度传感器的传感器读数。但是,在我开始之前,我需要检查是否可以让tkinter使用新值更新自己。我已经包含了我正在使用的代码。现在,我试图通过使用root.after调用change()来更新一个gui中的某个标签,而代码是root用户,试图让摄氏温度每秒增加1。主循环()。但是,每次尝试时我都会遇到错误,而且我不确定如何修复它。
我的代码:
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的新手,所以代码中的问题可能很愚蠢。
编辑:
根据Kevin的建议,我将tk.Frame.after(1000,self.change)更改为self.after(1000,self.change)。但是,我现在收到此错误:
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)
当我在after()中使用它时,似乎不喜欢我在没有任何参数的情况下调用self.change。但是,在线查看我从未在after()中看到模块的参数,当我添加它们时,我得到一个递归错误。
答案 0 :(得分:0)
您是否尝试使用root.update()而不是root.after()?对我而言,这样做的效果更好:
import tkinter as tk
root = tk.Tk()
b = Frame(root)
root.update()
在这个例子中我使用root.update而不是root.mainloop(),但是可以结合使用,而root.update()的酷部分就是它完全按照它所说的那样