Tkinter 实时更新变量 [英] Tkinter update variable real time

查看:64
本文介绍了Tkinter 实时更新变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个代码显示一个页面,然后当按下 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆