【问题标题】:How do I create an automatically updating GUI using Tkinter?如何使用 Tkinter 创建自动更新的 GUI?
【发布时间】:2014-09-11 00:34:19
【问题描述】:
from Tkinter import *
import time
#Tkinter stuff

class App(object):
    def __init__(self):
        self.root = Tk()

        self.labeltitle = Label(root, text="",  fg="black", font="Helvetica 40 underline bold")
        self.labeltitle.pack()

        self.labelstep = Label(root, text="",  fg="black", font="Helvetica 30 bold")
        self.labelstep.pack()

        self.labeldesc = Label(root, text="",  fg="black", font="Helvetica 30 bold")
        self.labeldesc.pack()

        self.labeltime = Label(root, text="",  fg="black", font="Helvetica 70")
        self.labeltime.pack()

        self.labelweight = Label(root, text="",  fg="black", font="Helvetica 25")
        self.labelweight.pack()

        self.labelspeed = Label(root, text="",  fg="black", font="Helvetica 20")
        self.labelspeed.pack()

        self.labeltemp = Label(root, text="", fg="black", font="Helvetica 20")
        self.labeltemp.pack()

        self.button = Button(root, text='Close recipe', width=25, command=root.destroy)
        self.button.pack()

    def Update(self, label, change):
        label.config(text=str(change))

def main():
    app = App()
    app.mainloop()

if __name__ == "__main__":
    main()

我正在尝试创建一个配方显示,它将在 Tkinter GUI 的屏幕上显示步骤、说明、重量和其他变量。

但是,我不知道如何更新 GUI 以根据配方的每个新步骤进行更改,因为必须根据用户输入(从服务器获取)动态更新内容。如何根据步骤的变化实现对GUI其他元素的更新?

【问题讨论】:

    标签: python user-interface dynamic tkinter


    【解决方案1】:

    如果你想动态改变标签

    self.dynamiclabel=StringVar()
    self.labeltitle = Label(root, text=self.dynamiclabel,  fg="black", font="Helvetica 40 underline bold")
    self.dyanamiclabel.set("this label updates upon change")
    self.labeltitle.pack()
    

    当您获得新价值时,只需使用.set()

    self.dyanamiclabel.set("Hurrray! i got changed")
    

    这适用于所有标签。要了解更多信息,请阅读此docs

    【讨论】:

      【解决方案2】:

      您可以使用after() 在(例如)1000 毫秒(1 秒)后运行函数来执行某些操作并更新标签上的文本。此函数可以在 1000 毫秒后再次(又一次)运行。

      以当前时间为例

      from Tkinter import *
      import datetime
      
      root = Tk()
      
      lab = Label(root)
      lab.pack()
      
      def clock():
          time = datetime.datetime.now().strftime("Time: %H:%M:%S")
          lab.config(text=time)
          #lab['text'] = time
          root.after(1000, clock) # run itself again after 1000 ms
          
      # run first time
      clock()
      
      root.mainloop()
      

      顺便说一句:你可以使用 StringVar 作为 sundar nataraj Сундар 建议


      编辑:(2022.01.01)

      更新到 Python 3 并包含 PEP 8 -- Style Guide for Python Code 建议的其他更改

      import tkinter as tk   # PEP8: `import *` is not preferred
      import datetime
      
      # --- functions ---
      # PEP8: all functions before main code
      # PEP8: `lower_case_name` for funcitons
      # PEP8: verb as function's name
                           
      def update_clock():
          # get current time as text
          current_time = datetime.datetime.now().strftime("Time: %H:%M:%S")
          
          # udpate text in Label
          lab.config(text=current_time)
          #lab['text'] = current_time
          
          # run itself again after 1000 ms
          root.after(1000, update_clock) 
      
      # --- main ---
      
      root = tk.Tk()
      
      lab = tk.Label(root)
      lab.pack()
          
      # run first time at once
      update_clock()
      
      # run furst time after 1000ms (1s)
      #root.after(1000, update_clock)
      
      root.mainloop()
      

      【讨论】:

      • 我认为这非常优雅。具有相当大创意可能性的绝佳选择。
      【解决方案3】:

      我在我的窗口中添加了一个进程栏,并使用更新功能每 1 秒根据 randint 更改其值:

      from random import randint
      def update():
          mpb["value"] = randint(0, 100) # take process bar for example
          window.after(1000, update)
      update()
      window.mainloop()
      

      【讨论】:

        【解决方案4】:

        我用 Python 3.7 写了一个例子

        from tkinter import *
        
        def firstFrame(window):
            global first_frame
            first_frame = Frame(window)
            first_frame.place(in_=window, anchor="c", relx=.5, rely=.5)
            Label(first_frame, text="ATTENTION !").grid(row=1,column=1,columnspan=3)
        
        
        def secondFrame(window):
            global second_frame
            second_frame= Frame(window, highlightbackground=color_green, highlightcolor=color_green, highlightthickness=3)
            second_frame.place(in_=window, anchor="c", relx=.5, rely=.5)
            Label(second_frame, text="This is second frame.").grid(row=1, column=1, columnspan=3, padx=25, pady=(15, 0))
        
        
        window = Tk()
        window.title('Some Title')
        window.attributes("-fullscreen", False)
        window.resizable(width=True, height=True)
        window.geometry('300x200')
        
        
        firstFrame(window)
        secondFrame(window)
        first_frame.tkraise()
        window.after(5000, lambda: first_frame.destroy()) # you can try different things here
        window.mainloop()
        

        【讨论】:

          【解决方案5】:

          如果你使用标签,那么你可以使用这个:

          label = tk.Label(self.frame, bg="green", text="something")
          label.place(rely=0, relx=0.05, relwidth=0.9, relheight=0.15)
          
          refresh = tk.Button(frame, bg="white", text="Refreshbutton",command=change_text) 
          refresh.pack(rely=0, relx=0.05, relwidth=0.9, relheight=0.15)
          
          def change_text()
             label["text"] = "something else"
          

          对我来说很好,但它取决于按下按钮的需要。

          【讨论】:

            【解决方案6】:

            使用root.config()并添加运行方式

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-04-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多