las6040 发表于 2023-7-26 11:34:59

tkinter 如何将进度百分比放置在进度条中间

以下代码用多线程的方式实现进度条以及进度百分比的显示,我的问题是:
是否有可能将进度百分比放置在进度条中央,同时不会影响进度条的显示:
import tkinter as tk
from tkinter import ttk
import threading
import time

def long_running_task(progress_var, label_var):
    total_steps = 100
    for i in range(total_steps):
      # 模拟长时间运行的任务
      time.sleep(0.1)
      # 更新进度条和标签
      progress_var.set(i + 1)
      label_var.set(f"进度:{int((i + 1) / total_steps * 100)}%")
      root.update()

def start_task():
    # 创建并启动一个新线程来运行长时间任务
    thread = threading.Thread(target=long_running_task, args=(progress_var, label_var))
    thread.start()

# 创建主窗口
root = tk.Tk()
root.title("进度条示例")


# 创建一个进度条
progress_var = tk.DoubleVar()
progress_bar = ttk.Progressbar(root, variable=progress_var, maximum=100)
progress_bar.pack(pady=10)

# 创建一个标签来显示进度百分比

label_var = tk.StringVar()
progress_label = tk.Label(root, textvariable=label_var)
progress_label.pack(pady=5)


# 创建一个开始按钮
start_button = tk.Button(root, text="开始任务", command=start_task)
start_button.pack(pady=5)

# 运行主循环
root.mainloop()


进度条截图:

陶远航 发表于 2023-7-26 11:35:18

要将进度百分比放置在进度条中间,你可以使用ttk.Progressbar组件的value选项来确定进度条的当前值。然后,通过在进度条上创建一个标签来显示进度百分比。

以下是修改后的代码示例:

import tkinter as tk
from tkinter import ttk
import threading
import time

def long_running_task(progress_var):
    total_steps = 100
    for i in range(total_steps):
      time.sleep(0.1)
      progress_var.set(i + 1)
      root.update()

def start_task():
    progress_var.set(0)# 初始化进度条的值为0
    thread = threading.Thread(target=long_running_task, args=(progress_var,))
    thread.start()

root = tk.Tk()
root.title("进度条示例")

progress_var = tk.DoubleVar()
progress_bar = ttk.Progressbar(root, variable=progress_var, maximum=100)
progress_bar.pack(pady=10)

progress_label = ttk.Label(root, text="0%")# 创建一个用于显示进度百分比的标签
progress_label.pack(pady=5)

start_button = ttk.Button(root, text="开始任务", command=start_task)
start_button.pack(pady=5)

# 使用计时器更新进度百分比标签的内容
def update_progress_label():
    value = progress_var.get() / 100 * 100
    progress_label.config(text=f"{int(value)}%")
    root.after(100, update_progress_label)

update_progress_label()# 启动计时器

root.mainloop()


这段代码中,我添加了一个名为progress_label的ttk.Label组件,用于显示进度百分比。然后,我创建了一个名为update_progress_label的函数,并使用after()方法将其添加到主循环中进行定时更新。

在update_progress_label()函数中,我从进度条的当前值中计算出百分比,并将其显示在progress_label标签上。

希望这个回答满足了你的需求并解决了你的问题。如果还有其他问题,请随时提问!
如果问题已经解决,请设置最佳答案

isdkz 发表于 2023-7-26 11:35:45

在Tkinter中,将进度百分比放置在进度条中央的一个简单方法是使用一个Label组件并将其放置在进度条上。这可以通过使用place()方法实现,该方法允许你精确地控制一个组件的位置。下面是如何修改你的代码来实现这一点:

import tkinter as tk
from tkinter import ttk
import threading
import time

def long_running_task(progress_var, label_var):
    total_steps = 100
    for i in range(total_steps):
      # 模拟长时间运行的任务
      time.sleep(0.1)
      # 更新进度条和标签
      progress_var.set(i + 1)
      label_var.set(f"进度:{int((i + 1) / total_steps * 100)}%")
      root.update()

def start_task():
    # 创建并启动一个新线程来运行长时间任务
    thread = threading.Thread(target=long_running_task, args=(progress_var, label_var))
    thread.start()

# 创建主窗口
root = tk.Tk()
root.title("进度条示例")

# 创建一个进度条
progress_var = tk.DoubleVar()
progress_bar = ttk.Progressbar(root, variable=progress_var, maximum=100)
progress_bar.pack(pady=10)

# 创建一个标签来显示进度百分比
label_var = tk.StringVar()
progress_label = tk.Label(root, textvariable=label_var)
progress_label.place(x=root.winfo_width()//2, y=10, anchor="center")

# 创建一个开始按钮
start_button = tk.Button(root, text="开始任务", command=start_task)
start_button.pack(pady=5)

# 运行主循环
root.mainloop()


在这个修改后的代码中,我使用了place()方法来放置进度标签。place()方法需要x和y参数来确定组件的位置。这里我使用了root.winfo_width()//2来确定x的位置(窗口宽度的一半),并将y设置为10。anchor参数用于确定组件的位置点,这里设置为"center",意味着标签的中心将位于给定的x和y位置。

注意,这只是一个基本的解决方案,如果窗口大小改变,标签的位置不会自动调整。要实现这一点,你可能需要使用更复杂的布局管理,或者在窗口大小改变时更新标签的位置。

歌者文明清理员 发表于 2023-7-26 11:39:57

人工

import tkinter as tk
from tkinter import ttk
import threading
import time

def long_running_task(progress_var, label_var):
    total_steps = 100
    for i in range(total_steps):
      # 模拟长时间运行的任务
      time.sleep(0.1)
      # 更新进度条和标签
      progress_var.set(i + 1)
      label_var["text"] = f"{int((i + 1) / total_steps * 100)}%"
      label_var.place(x=50+progress_var.get(),y=10)
      root.update()

def start_task():
    # 创建并启动一个新线程来运行长时间任务
    thread = threading.Thread(target=long_running_task, args=(progress_var, label_var))
    thread.start()

# 创建主窗口
root = tk.Tk()
root.title("进度条示例")


# 创建一个进度条
progress_var = tk.DoubleVar()
progress_bar = ttk.Progressbar(root, variable=progress_var, maximum=100)
progress_bar.place(x=50, y=10)

# 创建一个标签来显示进度百分比
label_var = tk.Label()

# 创建一个开始按钮
start_button = tk.Button(root, text="开始任务", command=start_task)
start_button.place(x=75, y=50)

# 运行主循环
root.mainloop()

hellomyprogram 发表于 2023-7-26 11:43:46

也许你可以使用 place 方法,设定绝对坐标,让它刚好覆盖在进度条上,就可以达到效果了。

las6040 发表于 2023-7-26 11:57:59

陶远航 发表于 2023-7-26 11:35
要将进度百分比放置在进度条中间,你可以使用ttk.Progressbar组件的value选项来确定进度条的当前值。然后, ...

谢谢您的回复,请查看图片附件:

las6040 发表于 2023-7-26 11:58:40

isdkz 发表于 2023-7-26 11:35
在Tkinter中,将进度百分比放置在进度条中央的一个简单方法是使用一个Label组件并将其放置在进度条上。这可 ...

谢谢您的回复,请查看图片附件:

las6040 发表于 2023-7-26 11:59:23

歌者文明清理员 发表于 2023-7-26 11:39
人工

谢谢您的回复,请查看图片附件:

las6040 发表于 2023-7-26 12:01:19

hellomyprogram 发表于 2023-7-26 11:43
也许你可以使用 place 方法,设定绝对坐标,让它刚好覆盖在进度条上,就可以达到效果了。

是的,只是目前没有找到将label控件背景透明的方法

歌者文明清理员 发表于 2023-7-26 12:03:21

las6040 发表于 2023-7-26 12:01
是的,只是目前没有找到将label控件背景透明的方法

las6040 发表于 2023-7-26 12:04:49

歌者文明清理员 发表于 2023-7-26 12:03


明白了,谢谢大佬!!

歌者文明清理员 发表于 2023-7-26 12:06:58

试一下 wxpython,tkinter 的限制确实比较多

las6040 发表于 2023-7-26 12:09:26

歌者文明清理员 发表于 2023-7-26 12:03


但是,这位大佬写了一篇论文,是可以实现的




这正是我要的效果

不知道本论坛能否放CSDN的链接。。。。。。。。

hellomyprogram 发表于 2023-7-26 12:11:33

你可以试试万能的 canvas ,通过 canvas.createwindow 创建进度条,而通过 canvas.createtext 创建进度百分比。

陶远航 发表于 2023-7-26 12:13:34

las6040 发表于 2023-7-26 12:04
明白了,谢谢大佬!!

这是你想要的背景透明吗?
from tkinter import ttk
style = ttk.Style()
style.configure("Transparent.TLabel", background="transparent")
label = ttk.Label(master, text="Hello World", style="Transparent.TLabel")

las6040 发表于 2023-7-26 12:21:23

陶远航 发表于 2023-7-26 12:13
这是你想要的背景透明吗?

谢谢您的二次回复!!

las6040 发表于 2023-7-26 12:23:03

hellomyprogram 发表于 2023-7-26 12:11
你可以试试万能的 canvas ,通过 canvas.createwindow 创建进度条,而通过 canvas.createtext 创建进度百分 ...

谢谢大佬,我试试!!

陶远航 发表于 2023-7-26 12:38:23

las6040 发表于 2023-7-26 12:23
谢谢大佬,我试试!!

虽然不能做到完全透明,但是设置背景色相同还是可以的,代码如下:
import tkinter
from tkinter import ttk

master = tkinter.Tk()

# 为了使背景透明,需要设置背景颜色与窗口背景颜色相同,或者使用一个透明颜色
master.configure(bg='#06b025')

style = ttk.Style()
style.configure("Transparent.TLabel", background='#06b025')
label = ttk.Label(master, text="Hello World", style="Transparent.TLabel", width=20)
label.pack()

master.mainloop()

或者你可以用PIL第三方库实现(不建议):
from PIL import Image, ImageTk
image = Image.new("RGBA", (100, 100), (0, 0, 0, 0)) # 创建一个透明图片
photo = ImageTk.PhotoImage(image) # 转换为Tkinter可用的图片对象
label = ttk.Label(master, text="Hello World", image=photo, compound="center")
页: [1]
查看完整版本: tkinter 如何将进度百分比放置在进度条中间