Tkinter 实时更新变量 [英] Tkinter update variable real time
问题描述
我有这个代码显示一个页面,然后当按下 PAGE1 按钮时转到另一个框架.在这里,我想在任何标签中显示时间,但我希望它自动更新.我自己做不到
I have this code which display a page and then when press PAGE1 button go to other frame. Here i want to display time in any of the labels but i want it update automatically. I couldn t manage do it myself
import Tkinter as tk
from Tkinter import *
import time
import datetime
def clock():
time = datetime.datetime.now().strftime("Time: %H:%M:%S")
print time
class MainApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (MainPage, page1, help):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = frame
frame.grid(row=0, column=0, columnspan=12,sticky="nsew")
frame.grid_columnconfigure(0, weight=1)
frame.grid_columnconfigure(1, weight=1)
frame.grid_columnconfigure(2, weight=1)
frame.grid_columnconfigure(3, weight=1)
frame.grid_columnconfigure(4, weight=1)
frame.grid_columnconfigure(5, weight=1)
frame.grid_columnconfigure(6, weight=1)
frame.grid_columnconfigure(7, weight=1)
frame.grid_columnconfigure(8, weight=1)
frame.grid_columnconfigure(9, weight=1)
frame.grid_columnconfigure(10, weight=1)
frame.grid_columnconfigure(11, weight=1)
self.show_frame("MainPage")
clock()
def show_frame(self, page_name):
frame = self.frames[page_name]
frame.tkraise()
class MainPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
# line 0
label00 = tk.Label(self, text='00', height=2)
label00.configure(relief='raised')
label00.grid(row=0, column=0, sticky='nsew', columnspan=12)
# line 1
label10 = tk.Label(self, text='10')
label10.configure(relief='raised')
label10.grid(row=1, column=0, sticky='nsew')
label11 = tk.Label(self, text='LOGO')
label11.configure(relief='raised')
label11.grid(row=1, column=1, sticky='nsew', columnspan=4, rowspan=2)
label12 = tk.Label(self, text='12')
label12.configure(relief='raised')
label12.grid(row=1, column=5, sticky='nsew')
label13 = tk.Label(self, text='TITLE')
label13.configure(relief='raised')
label13.grid(row=1, column=6, sticky='nsew', columnspan=5)
label14 = tk.Label(self, text='14')
label14.configure(relief='raised')
label14.grid(row=1, column=11, sticky='nsew')
# line 2
label20 = tk.Label(self, text='20')
label20.configure(relief='raised')
label20.grid(row=2, column=0, sticky='nsew')
label21 = tk.Label(self, text='21')
label21.configure(relief='raised')
label21.grid(row=2, column=5, sticky='nsew')
label22 = tk.Label(self, text='Desc')
label22.configure(relief='raised')
label22.grid(row=2, column=6, sticky='nsew', columnspan=5)
label23 = tk.Label(self, text='23')
label23.configure(relief='raised')
label23.grid(row=2, column=11, sticky='nsew')
# line 3
label30 = tk.Label(self, text='30', height=2)
label30.configure(relief='raised')
label30.grid(row=3, column=0, sticky='nsew', columnspan=12)
#line 4
label40 = tk.Label(self, text='40', width=10)
label40.configure(relief='raised')
label40.grid(row=4, column=0, sticky='nsew')
label41 = tk.Label(self, text='STATUS', font=("Helvetica", 16), justify='center', fg="blue")
label41.configure(relief='raised')
label41.grid(row=4, column=1, columnspan=10)
label42 = tk.Label(self, text='42', width=10)
label42.configure(relief='raised')
label42.grid(row=4, column=11, sticky='nsew')
#line 5
label50 = tk.Label(self, text='50', height=2)
label50.configure(relief='raised')
label50.grid(row=5, column=0, columnspan=12, sticky="nsew")
#line 6
label60 = tk.Label(self, text='60', height=2)
label60.configure(relief='raised')
label60.grid(row=6, column=0, sticky='nsew')
buttonauto = tk.Button(self, text="PAGE1", font=("Helvetica", 16), justify='center', width=40, height=5,
command=lambda: controller.show_frame("page1"))
buttonauto.grid(row=6, column=1, columnspan=4)
label61 = tk.Label(self, text='61', height=2)
label61.configure(relief='raised')
label61.grid(row=6, column=5, sticky='nsew')
label62 = tk.Label(self, text='62', height=2)
label62.configure(relief='raised')
label62.grid(row=6, column=6, sticky='nsew')
buttoncam = tk.Button(self, text="HELP",font=("Helvetica", 16), justify='center', width=40, height=5,
command=lambda: controller.show_frame("help"))
buttoncam.grid(row=6 , column=7, columnspan=4)
label63 = tk.Label(self, text='63', height=2)
label63.configure(relief='raised')
label63.grid(row=6, column=11, sticky='nsew')
# line 7
label70 = tk.Label(self, text='70', height=2)
label70.configure(relief='raised')
label70.grid(row=7, column=0, sticky='nsew', columnspan=12)
#line 13
label13 = tk.Label(self, text='', height=2)
label13.configure(relief='raised')
label13.grid(row=13, column=0, columnspan=12, sticky="nsew")
#line 14
label14 = tk.Label(self, text='', width=10)
label14.grid(row=14, column=0, sticky='w')
buttonhlp = tk.Button(self, text="Help", width=20, height = 3,
command=lambda: controller.show_frame("help"))
buttonhlp.grid(row=14, column=1, columnspan=4)
label14 = tk.Label(self, text='')
label14.grid(row=14, column=5, columnspan=2)
buttonquit = tk.Button(self, text="Quit", width=20, height = 3, command=close_window)
buttonquit.grid(row=14, column=7, columnspan=4)
label14 = tk.Label(self, text='', width=10)
label14.grid(row=14, column=11, sticky='e')
#line 15
label15 = tk.Label(self, text='', height=5)
label15.grid(row=15, column=0, columnspan=12, sticky="nsew")
class page1(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
#line 0
label00 = tk.Label(self, text='PAGE1', height=2)
label00.configure(relief='raised')
label00.grid(row=13, column=0, columnspan=12, sticky="nsew")
#line 1
label10 = tk.Label(self, text='', width=10)
label10.grid(row=14, column=0, sticky='w')
buttonback = tk.Button(self, text="Back", width=20, height = 3,
command=lambda: controller.show_frame("MainPage"))
buttonback.grid(row=14, column=1, columnspan=4)
label10= tk.Label(self, text='')
label10.grid(row=14, column=5, columnspan=2)
buttonquit = tk.Button(self, text="Quit", width=20, height = 3, command=close_window)
buttonquit.grid(row=14, column=7, columnspan=4)
label10 = tk.Label(self, text='', width=10)
label10.grid(row=14, column=11, sticky='e')
#line 2
label20 = tk.Label(self, text='', height=5)
label20.grid(row=15, column=0, columnspan=12, sticky="nsew")
class help(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
#line 0
label00 = tk.Label(self, text='HELP', height=2)
label00.configure(relief='raised')
label00.grid(row=13, column=0, columnspan=12, sticky="nsew")
#line 1
label10 = tk.Label(self, text='', width=10)
label10.grid(row=14, column=0, sticky='w')
buttonback = tk.Button(self, text="Back", width=20, height = 3,
command=lambda: controller.show_frame("MainPage"))
buttonback.grid(row=14, column=1, columnspan=4)
label10= tk.Label(self, text='')
label10.grid(row=14, column=5, columnspan=2)
buttonquit = tk.Button(self, text="Quit", width=20, height = 3, command=close_window)
buttonquit.grid(row=14, column=7, columnspan=4)
label10 = tk.Label(self, text='', width=10)
label10.grid(row=14, column=11, sticky='e')
#line 2
label20 = tk.Label(self, text='', height=5)
label20.grid(row=15, column=0, columnspan=12, sticky="nsew")
def close_window ():
app.destroy()
if __name__ == "__main__":
app = MainApp()
app.overrideredirect(True)
app.geometry("{0}x{1}+0+0".format(app.winfo_screenwidth(), app.winfo_screenheight()))
app.focus_set() # <-- move focus to this widget
app.mainloop()
所以实际上我希望在打开 page1 框架时,在 label00 中看到我在代码开头打印的时间.
So actually I want that when open page1 frame, in label00 I want to see time that I print in the beginning of the code.
推荐答案
一种方法是定期调用一个函数并更新图形用户界面.在 Tkinter 中,这通常通过使用通用小部件方法来完成 之后代码>
.
One way to do it would be to periodically call a function and update the
GUI. In Tkinter this is usually done by using the universal widget method after
.
我已修改您的代码以创建一个 StringVar
属性来保存时间值并使用 after()
调用新的 clock()
方法它也已添加到您的 MainApp
类中.这个方法所做的就是更新类实例的 StringVar
属性.
I've modified your code to create a StringVar
attribute to hold the time value and use after()
to call a new clock()
method
which has also been added to your MainApp
class. All this method does is update
the StringVar
attribute of the class instance.
我做的另一件事是修改你的 Page1
的 __init__()
方法类在创建 label00
小部件时使用 textvariable
选项而不是 text
选项,并指定 StringVar
添加到 MainApp
类作为其值的属性.
The other thing I did was modify the __init__()
method of the your Page1
class to use the textvariable
option instead of the text
option when creating the label00
widget, and to specify the StringVar
attribute that was added to the MainApp
class as its value.
这样做的好处是只要变量的值发生变化,标签就会自动更新.此外,您可以根据需要从 GUI 的不同部分引用相同的属性.
The nice thing about doing this is the label will be updated automatically whenever the value of the variable changes. In addition, you can reference this same attribute from different parts of the GUI as needed.
注意我只修改了 Page1
类的 label00
属性...你需要做一些类似于你想要显示当前时间的其他地方的事情.(它们都可以使用相同的 StringVar
属性.)
Note I only modified the label00
attribute of your Page1
class...you'll need to do something similar to the other places you want the current time displayed. (They can all use the same StringVar
attribute.)
import time
import datetime
import Tkinter as tk
from Tkinter import *
class MainApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.timevar = tk.StringVar() # Added.
self.frames = {}
for F in (MainPage, Page1, Help):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = frame
frame.grid(row=0, column=0, columnspan=12,sticky="nsew")
frame.grid_columnconfigure(0, weight=1)
frame.grid_columnconfigure(1, weight=1)
frame.grid_columnconfigure(2, weight=1)
frame.grid_columnconfigure(3, weight=1)
frame.grid_columnconfigure(4, weight=1)
frame.grid_columnconfigure(5, weight=1)
frame.grid_columnconfigure(6, weight=1)
frame.grid_columnconfigure(7, weight=1)
frame.grid_columnconfigure(8, weight=1)
frame.grid_columnconfigure(9, weight=1)
frame.grid_columnconfigure(10, weight=1)
frame.grid_columnconfigure(11, weight=1)
# Synchronize with the computer's clock.
snooze = (1000000 - datetime.datetime.now().microsecond) / 1000000.
if snooze > 0:
time.sleep(snooze) # Sleep until next whole second.
self.clock() # Starts string variable update process.
self.show_frame("MainPage")
def show_frame(self, page_name):
frame = self.frames[page_name]
frame.tkraise()
# Additional method added.
def clock(self):
self.timevar.set(datetime.datetime.now().strftime("Time: %H:%M:%S"))
self.after(1000, self.clock) # Update every second (1000 millsecs)
class MainPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
# line 0
label00 = tk.Label(self, text='00', height=2)
label00.configure(relief='raised')
label00.grid(row=0, column=0, sticky='nsew', columnspan=12)
# line 1
label10 = tk.Label(self, text='10')
label10.configure(relief='raised')
label10.grid(row=1, column=0, sticky='nsew')
label11 = tk.Label(self, text='LOGO')
label11.configure(relief='raised')
label11.grid(row=1, column=1, sticky='nsew', columnspan=4, rowspan=2)
label12 = tk.Label(self, text='12')
label12.configure(relief='raised')
label12.grid(row=1, column=5, sticky='nsew')
label13 = tk.Label(self, text='TITLE')
label13.configure(relief='raised')
label13.grid(row=1, column=6, sticky='nsew', columnspan=5)
label14 = tk.Label(self, text='14')
label14.configure(relief='raised')
label14.grid(row=1, column=11, sticky='nsew')
# line 2
label20 = tk.Label(self, text='20')
label20.configure(relief='raised')
label20.grid(row=2, column=0, sticky='nsew')
label21 = tk.Label(self, text='21')
label21.configure(relief='raised')
label21.grid(row=2, column=5, sticky='nsew')
label22 = tk.Label(self, text='Desc')
label22.configure(relief='raised')
label22.grid(row=2, column=6, sticky='nsew', columnspan=5)
label23 = tk.Label(self, text='23')
label23.configure(relief='raised')
label23.grid(row=2, column=11, sticky='nsew')
# line 3
label30 = tk.Label(self, text='30', height=2)
label30.configure(relief='raised')
label30.grid(row=3, column=0, sticky='nsew', columnspan=12)
#line 4
label40 = tk.Label(self, text='40', width=10)
label40.configure(relief='raised')
label40.grid(row=4, column=0, sticky='nsew')
label41 = tk.Label(self, text='STATUS', font=("Helvetica", 16), justify='center', fg="blue")
label41.configure(relief='raised')
label41.grid(row=4, column=1, columnspan=10)
label42 = tk.Label(self, text='42', width=10)
label42.configure(relief='raised')
label42.grid(row=4, column=11, sticky='nsew')
#line 5
label50 = tk.Label(self, text='50', height=2)
label50.configure(relief='raised')
label50.grid(row=5, column=0, columnspan=12, sticky="nsew")
#line 6
label60 = tk.Label(self, text='60', height=2)
label60.configure(relief='raised')
label60.grid(row=6, column=0, sticky='nsew')
buttonauto = tk.Button(self, text="PAGE1", font=("Helvetica", 16), justify='center', width=40, height=5,
command=lambda: controller.show_frame("Page1"))
buttonauto.grid(row=6, column=1, columnspan=4)
label61 = tk.Label(self, text='61', height=2)
label61.configure(relief='raised')
label61.grid(row=6, column=5, sticky='nsew')
label62 = tk.Label(self, text='62', height=2)
label62.configure(relief='raised')
label62.grid(row=6, column=6, sticky='nsew')
buttoncam = tk.Button(self, text="HELP",font=("Helvetica", 16), justify='center', width=40, height=5,
command=lambda: controller.show_frame("Help"))
buttoncam.grid(row=6 , column=7, columnspan=4)
label63 = tk.Label(self, text='63', height=2)
label63.configure(relief='raised')
label63.grid(row=6, column=11, sticky='nsew')
# line 7
label70 = tk.Label(self, text='70', height=2)
label70.configure(relief='raised')
label70.grid(row=7, column=0, sticky='nsew', columnspan=12)
#line 13
label13 = tk.Label(self, text='', height=2)
label13.configure(relief='raised')
label13.grid(row=13, column=0, columnspan=12, sticky="nsew")
#line 14
label14 = tk.Label(self, text='', width=10)
label14.grid(row=14, column=0, sticky='w')
buttonhlp = tk.Button(self, text="Help", width=20, height = 3,
command=lambda: controller.show_frame("Help"))
buttonhlp.grid(row=14, column=1, columnspan=4)
label14 = tk.Label(self, text='')
label14.grid(row=14, column=5, columnspan=2)
buttonquit = tk.Button(self, text="Quit", width=20, height = 3, command=close_window)
buttonquit.grid(row=14, column=7, columnspan=4)
label14 = tk.Label(self, text='', width=10)
label14.grid(row=14, column=11, sticky='e')
#line 15
label15 = tk.Label(self, text='', height=5)
label15.grid(row=15, column=0, columnspan=12, sticky="nsew")
class Page1(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
#line 0
# label00 = tk.Label(self, text='PAGE1', height=2)
label00 = tk.Label(self, textvariable=controller.timevar, height=2)
label00.configure(relief='raised')
label00.grid(row=13, column=0, columnspan=12, sticky="nsew")
#line 1
label10 = tk.Label(self, text='', width=10)
label10.grid(row=14, column=0, sticky='w')
buttonback = tk.Button(self, text="Back", width=20, height = 3,
command=lambda: controller.show_frame("MainPage"))
buttonback.grid(row=14, column=1, columnspan=4)
label10= tk.Label(self, text='')
label10.grid(row=14, column=5, columnspan=2)
buttonquit = tk.Button(self, text="Quit", width=20, height = 3, command=close_window)
buttonquit.grid(row=14, column=7, columnspan=4)
label10 = tk.Label(self, text='', width=10)
label10.grid(row=14, column=11, sticky='e')
#line 2
label20 = tk.Label(self, text='', height=5)
label20.grid(row=15, column=0, columnspan=12, sticky="nsew")
class Help(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
#line 0
label00 = tk.Label(self, text='HELP', height=2)
label00.configure(relief='raised')
label00.grid(row=13, column=0, columnspan=12, sticky="nsew")
#line 1
label10 = tk.Label(self, text='', width=10)
label10.grid(row=14, column=0, sticky='w')
buttonback = tk.Button(self, text="Back", width=20, height = 3,
command=lambda: controller.show_frame("MainPage"))
buttonback.grid(row=14, column=1, columnspan=4)
label10= tk.Label(self, text='')
label10.grid(row=14, column=5, columnspan=2)
buttonquit = tk.Button(self, text="Quit", width=20, height = 3, command=close_window)
buttonquit.grid(row=14, column=7, columnspan=4)
label10 = tk.Label(self, text='', width=10)
label10.grid(row=14, column=11, sticky='e')
#line 2
label20 = tk.Label(self, text='', height=5)
label20.grid(row=15, column=0, columnspan=12, sticky="nsew")
def close_window ():
app.destroy()
if __name__ == "__main__":
app = MainApp()
app.overrideredirect(True)
app.geometry("{0}x{1}+0+0".format(app.winfo_screenwidth(), app.winfo_screenheight()))
app.focus_set() # <-- move focus to this widget
app.mainloop()
这篇关于Tkinter 实时更新变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!