无法让root.after()工作

时间:2016-06-10 19:12:33

标签: python tkinter

这里有一些问题的背景:我正在尝试在覆盆子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()中看到模块的参数,当我添加它们时,我得到一个递归错误。

1 个答案:

答案 0 :(得分:0)

您是否尝试使用root.update()而不是root.after()?对我而言,这样做的效果更好:

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

在这个例子中我使用root.update而不是root.mainloop(),但是可以结合使用,而root.update()的酷部分就是它完全按照它所说的那样