鱼C论坛

 找回密码
 立即注册
查看: 1103|回复: 8

[已解决]tkinter

[复制链接]
发表于 2021-8-27 15:34:06 | 显示全部楼层 |阅读模式

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

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

x
我想知道tkinter中的按钮处理一个长时间的事件时,弹出progressbar进度条,然后事件处理完后进度条关闭,怎么实现。
麻烦给个实例,谢谢!
最佳答案
2021-8-27 22:36:24
本帖最后由 qq1151985918 于 2021-8-27 22:37 编辑

给你敲一个简单案例
  1. from tkinter import ttk
  2. from tkinter import *
  3. from threading import Thread
  4. from time import sleep


  5. def task():
  6.     sleep(3)
  7.    
  8. def test():
  9.     def show_prog():
  10.         top = Toplevel()
  11.         top.attributes("-toolwindow", 1)
  12.         top.wm_attributes("-topmost", 1)
  13.         top.title("进度条")
  14.         Label(top, text="正在执行任务,三秒后关闭进度条…").pack()
  15.         prog = ttk.Progressbar(top, mode="indeterminate")
  16.         prog.pack()
  17.         prog.start()
  18.         task()
  19.         prog.stop()
  20.         top.destroy()
  21.     t = Thread(target=show_prog)
  22.     t.start()


  23. root = Tk()
  24. root.geometry("300x55")
  25. root.resizable(0, 0)
  26. Label(text="点击测试查看效果").pack()
  27. Button(text="测试", command=test).pack()

  28. root.mainloop()
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-27 15:43:42 | 显示全部楼层
没写过

https://github.com/jishansingh/H ... oader/downloader.py

帮你用GitHub搜索的 这个看起来还不错 你也可以自己搜
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-27 15:57:11 | 显示全部楼层
kogawananari 发表于 2021-8-27 15:43
没写过

https://github.com/jishansingh/HackTrix-Proj/blob/023d5835742d5f1da8db66333aecc ...

丝~~,有点难看懂,大佬能简单说一下您的思路吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-27 16:21:16 | 显示全部楼层
py.c.c++ 发表于 2021-8-27 15:57
丝~~,有点难看懂,大佬能简单说一下您的思路吗

看得懂我就自己给你写了 不用去搜别人的

我只能看出是分chunk下载的 下载的线程把chunk的进度传给渲染的线程
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-27 19:10:33 | 显示全部楼层
kogawananari 发表于 2021-8-27 16:21
看得懂我就自己给你写了 不用去搜别人的

我只能看出是分chunk下载的 下载的线程把chunk的进度传给渲染 ...

我的意思是对于我的问题,大佬有没有一点思路,怎么实现
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-27 21:42:16 | 显示全部楼层
py.c.c++ 发表于 2021-8-27 19:10
我的意思是对于我的问题,大佬有没有一点思路,怎么实现

你整个假的进度条就很简单  异步下载开始的时候启动进度条 下完了回调的时候把进度条关了

你要搞真进度条就很难 要算字节的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-27 22:36:24 | 显示全部楼层    本楼为最佳答案   
本帖最后由 qq1151985918 于 2021-8-27 22:37 编辑

给你敲一个简单案例
  1. from tkinter import ttk
  2. from tkinter import *
  3. from threading import Thread
  4. from time import sleep


  5. def task():
  6.     sleep(3)
  7.    
  8. def test():
  9.     def show_prog():
  10.         top = Toplevel()
  11.         top.attributes("-toolwindow", 1)
  12.         top.wm_attributes("-topmost", 1)
  13.         top.title("进度条")
  14.         Label(top, text="正在执行任务,三秒后关闭进度条…").pack()
  15.         prog = ttk.Progressbar(top, mode="indeterminate")
  16.         prog.pack()
  17.         prog.start()
  18.         task()
  19.         prog.stop()
  20.         top.destroy()
  21.     t = Thread(target=show_prog)
  22.     t.start()


  23. root = Tk()
  24. root.geometry("300x55")
  25. root.resizable(0, 0)
  26. Label(text="点击测试查看效果").pack()
  27. Button(text="测试", command=test).pack()

  28. root.mainloop()
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-27 23:03:05 | 显示全部楼层
  1. from tkinter import *
  2. from tkinter import ttk
  3. from tkinter import messagebox

  4. class App(Tk):
  5.     def __init__(self, geo, title):
  6.         super().__init__()
  7.         self.geometry(geo)
  8.         self.title(title)
  9.         self.btn = Button(self, text='开始任务', command=self.pbar_update)
  10.         self.btn.pack(pady=20)
  11.         self.pbar = ttk.Progressbar(self, length=400, maximum=400)
  12.         self.pbar['value'] = 0
  13.         self.pbar.pack(pady=20)
  14.         self.cid_pbar = None

  15.     def pbar_update(self):
  16.         '''每半秒钟更新一次进度条'''
  17.         print(self.pbar['value'])
  18.         self.pbar['value'] += 20
  19.         if self.pbar['value'] >= 400:
  20.             messagebox.showinfo(message="任务已完成!!")
  21.             self.pbar['value'] = 0
  22.         else:
  23.             # 没超过400 (最大值)的话,就循环更新进度
  24.             if self.cid_pbar is not None:
  25.                 self.after_cancel(self.cid_pbar)
  26.                 self.cid_pbar = self.after(500, self.pbar_update)
  27.             else:
  28.                 self.cid_pbar = self.after(500, self.pbar_update)

  29.             

  30. if __name__ == "__main__":
  31.     app = App('500x500', '任务进度条-test')
  32.     app.mainloop()
  33.         
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-28 08:25:37 | 显示全部楼层

对不起,上面比您快一些,我把最佳给它了,对不起
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-19 09:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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