鱼C论坛

 找回密码
 立即注册
查看: 2409|回复: 18

[已解决]tkinter 如何将进度百分比放置在进度条中间

[复制链接]
发表于 2023-7-26 11:34:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
以下代码用多线程的方式实现进度条以及进度百分比的显示,我的问题是:
是否有可能将进度百分比放置在进度条中央,同时不会影响进度条的显示:
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()


进度条截图:
进度条.png
最佳答案
2023-7-26 12:03:21
las6040 发表于 2023-7-26 12:01
是的,只是目前没有找到将label控件背景透明的方法

Snipaste_2023-07-26_12-03-08.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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_labelttk.Label组件,用于显示进度百分比。然后,我创建了一个名为update_progress_label的函数,并使用after()方法将其添加到主循环中进行定时更新。

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

希望这个回答满足了你的需求并解决了你的问题。如果还有其他问题,请随时提问!
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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位置。

注意,这只是一个基本的解决方案,如果窗口大小改变,标签的位置不会自动调整。要实现这一点,你可能需要使用更复杂的布局管理,或者在窗口大小改变时更新标签的位置。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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()

评分

参与人数 1荣誉 +5 贡献 +3 收起 理由
python爱好者. + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-26 11:43:46 | 显示全部楼层
也许你可以使用 place 方法,设定绝对坐标,让它刚好覆盖在进度条上,就可以达到效果了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

点评

他是gpt脚本,3#也是  发表于 2023-7-26 12:00
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢您的回复,请查看图片附件:
回复2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-26 11:59:23 | 显示全部楼层

谢谢您的回复,请查看图片附件:
回复3.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是的,只是目前没有找到将label控件背景透明的方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-26 12:03:21 | 显示全部楼层    本楼为最佳答案   
las6040 发表于 2023-7-26 12:01
是的,只是目前没有找到将label控件背景透明的方法

Snipaste_2023-07-26_12-03-08.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-26 12:04:49 | 显示全部楼层

明白了,谢谢大佬!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-26 12:06:58 | 显示全部楼层
试一下 wxpython,tkinter 的限制确实比较多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-26 12:09:26 | 显示全部楼层

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


回复4.png

这正是我要的效果

不知道本论坛能否放CSDN的链接。。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-26 12:11:33 | 显示全部楼层
你可以试试万能的 canvas ,通过 canvas.createwindow 创建进度条,而通过 canvas.createtext 创建进度百分比。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-26 12:21:23 | 显示全部楼层
陶远航 发表于 2023-7-26 12:13
这是你想要的背景透明吗?

谢谢您的二次回复!!
回复5.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-26 12:23:03 | 显示全部楼层
hellomyprogram 发表于 2023-7-26 12:11
你可以试试万能的 canvas ,通过 canvas.createwindow 创建进度条,而通过 canvas.createtext 创建进度百分 ...

谢谢大佬,我试试!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 22:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表