鱼C论坛

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

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

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

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

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

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

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

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

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


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

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

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


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

  32. # 运行主循环
  33. 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选项来确定进度条的当前值。然后,通过在进度条上创建一个标签来显示进度百分比。

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

  1. import tkinter as tk
  2. from tkinter import ttk
  3. import threading
  4. import time

  5. def long_running_task(progress_var):
  6.     total_steps = 100
  7.     for i in range(total_steps):
  8.         time.sleep(0.1)
  9.         progress_var.set(i + 1)
  10.         root.update()

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

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

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

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

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

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

  29. update_progress_label()  # 启动计时器

  30. 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()方法实现,该方法允许你精确地控制一个组件的位置。下面是如何修改你的代码来实现这一点:

  1. import tkinter as tk
  2. from tkinter import ttk
  3. import threading
  4. import time

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

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

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

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

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

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

  32. # 运行主循环
  33. 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 | 显示全部楼层
人工

  1. import tkinter as tk
  2. from tkinter import ttk
  3. import threading
  4. import time

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

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

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


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

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

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

  31. # 运行主循环
  32. 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
明白了,谢谢大佬!!


这是你想要的背景透明吗?
  1. from tkinter import ttk
  2. style = ttk.Style()
  3. style.configure("Transparent.TLabel", background="transparent")
  4. 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
谢谢大佬,我试试!!

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

  3. master = tkinter.Tk()

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

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

  10. master.mainloop()
复制代码


或者你可以用PIL第三方库实现(不建议):
  1. from PIL import Image, ImageTk
  2. image = Image.new("RGBA", (100, 100), (0, 0, 0, 0)) # 创建一个透明图片
  3. photo = ImageTk.PhotoImage(image) # 转换为Tkinter可用的图片对象
  4. label = ttk.Label(master, text="Hello World", image=photo, compound="center")
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 01:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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