Python: Is it possible to create an tkinter label which has a dynamic string when a function is running in background?

后端 未结 2 648
面向向阳花
面向向阳花 2020-12-18 11:17

I have created a tkinter GUI for my python script. When I run the script, I want a dynamic string in one of the Label widgets on the GUI window, which will display:

相关标签:
2条回答
  • 2020-12-18 11:22

    I wrote two simple scripts to help demonstrate how to do what you want. The first is using the label:

    import tkinter as tk
    
    root = tk.Tk()
    
    status = tk.Label(root, text="Working")
    status.grid()
    
    def update_status():
    
        # Get the current message
        current_status = status["text"]
    
        # If the message is "Working...", start over with "Working"
        if current_status.endswith("..."): current_status = "Working"
    
        # If not, then just add a "." on the end
        else: current_status += "."
    
        # Update the message
        status["text"] = current_status
    
        # After 1 second, update the status
        root.after(1000, update_status)
    
    # Launch the status message after 1 millisecond (when the window is loaded)
    root.after(1, update_status)
    
    root.mainloop()
    

    The next one is using a progressbar:

    import tkinter as tk
    
    # You will need the ttk module for this
    from tkinter import ttk
    
    def update_status(step):
    
        # Step here is how much to increment the progressbar by.
        # It is in relation to the progressbar's length.
        # Since I made the length 100 and I am increasing by 10 each time,
        # there will be 10 times it increases before it restarts
        progress.step(step)
    
        # You can call 'update_status' whenever you want in your script
        # to increase the progressbar by whatever amount you want.
        root.after(1000, lambda: update_status(10))
    
    root = tk.Tk()
    
    progress = ttk.Progressbar(root, length=100)
    progress.pack()
    
    progress.after(1, lambda: update_status(10))
    
    root.mainloop()
    

    Note however that I couldn't do too much with the progressbar script because progressbars are a little tricky and need to be customized to your script exactly. I just wrote it to maybe shed a little light on the subject. The main part of my answer though is the label script.

    0 讨论(0)
  • 2020-12-18 11:22

    Yes, it is possible. There are two ways to do it:

    1. Whenever you want to update the label from your code you can call the_widget.configure(the_text). This will change the text of the label.

    2. You can create an instance of a tkinter.StringVar, and assign it to the textvariable attribute of a label. Whenever you change the value of the variable (via the_variable.set(the_text), the label will automatically update.

    Note that for either of these to work, the event loop needs to be able to process events (ie: you won't see anything if your function takes a long time to run and you never call update_idletasks or re-enter the event loop).

    0 讨论(0)
提交回复
热议问题