且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Tkinter 实时更新变量

更新时间:2023-02-26 17:42:38

一种方法是定期调用一个函数并更新图形用户界面.在 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()