Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
576 views
in Technique[技术] by (71.8m points)

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

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:

"Working." Then: "Working.." then "Working..."

and then start from "Working." again until the script is completed.

(Actually I'd prefer a progress bar in this area)

Is it possible?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...