鱼C论坛

 找回密码
 立即注册
查看: 2043|回复: 3

[已解决]关于tkinter和多线程

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

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

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

x
本帖最后由 py.c.c++ 于 2021-8-27 14:44 编辑

用tkinter写了个调用api的程序,但是由于网速问题,按下按钮后要卡上一会,我就想搞一个progressbar,在响应时搞一个来回移动的效果。
应该使用多线程,但是我不知道怎么使用。。。
  1. import tkinter as tk
  2. import tkinter.ttk
  3. import requests
  4. def chat(msg):
  5.     par={
  6.         'key':'free',
  7.         'msg':msg
  8.     }
  9.     url='http://api.qingyunke.com/api.php'
  10.     resp=requests.get(url=url,params=par)
  11.     return resp.json().get('content')
  12. window=tk.Tk()
  13. window.title("test")
  14. window.geometry('200x300')
  15. e1=tk.Entry(window)
  16. e1.pack()
  17. l1=tk.Label(window,text='')
  18. def send():
  19.     result=chat(msg=e1.get())
  20.     l1.config(text=result)
  21. b1=tk.Button(window,text='发送',command=send).pack()
  22. l1.pack()
  23. window.mainloop()
复制代码

有没有高人指点
其实我想知道tkinter的按钮和进度条怎么结合使用
最佳答案
2021-8-26 17:23:02
考虑用aiohttp吗  
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-26 17:23:02 | 显示全部楼层    本楼为最佳答案   
考虑用aiohttp吗  
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-27 08:52:23 | 显示全部楼层

我还是想要有进度条加载的效果,虽然用异步爬虫效率更高,但是其实我想知道tkinter的按钮和进度条怎么结合使用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-20 16:55:45 | 显示全部楼层
按钮跟函数不太一样的
  1. import tkinter as tk
  2. from tkinter import ttk
  3. import threading
  4. import time


  5. def formatForm(form, width, heigth):
  6.     """设置居中显示"""
  7.     # 得到屏幕宽度
  8.     win_width = form.winfo_screenwidth()
  9.     # 得到屏幕高度
  10.     win_higth = form.winfo_screenheight()

  11.     # 计算偏移量
  12.     width_adjust = (win_width - width) / 2
  13.     higth_adjust = (win_higth - heigth) / 2

  14.     form.geometry("%dx%d+%d+%d" % (width, heigth, width_adjust, higth_adjust))


  15. class LoadingBar(object):

  16.     def __init__(self, width=200):
  17.         # 存储显示窗体
  18.         self.__dialog = None
  19.         # 记录显示标识
  20.         self.__showFlag = True
  21.         # 设置滚动条的宽度
  22.         self.__width = width
  23.         # 设置窗体高度
  24.         self.__heigth = 20

  25.     def show(self, speed=10, sleep=0):
  26.         """显示的时候支持重置滚动条速度和标识判断等待时长"""
  27.         # 防止重复创建多个
  28.         if self.__dialog is not None:
  29.             return

  30.         # 线程内读取标记的等待时长(单位秒)
  31.         self.__sleep = sleep

  32.         # 创建窗体
  33.         self.__dialog = tk.Toplevel()
  34.         # 去除边框
  35.         self.__dialog.overrideredirect(-1)
  36.         # 设置置顶
  37.         self.__dialog.wm_attributes("-topmost", True)
  38.         formatForm(self.__dialog, self.__width, self.__heigth)
  39.         # 实际的滚动条控件
  40.         self.bar = ttk.Progressbar(self.__dialog, length=self.__width, mode="indeterminate",
  41.                                    orient=tk.HORIZONTAL)
  42.         self.bar.pack(expand=True)
  43.         # 数值越小,滚动越快
  44.         self.bar.start(speed)
  45.         # 开启新线程保持滚动条显示
  46.         t = threading.Thread(target=self.waitClose)
  47.         t.setDaemon(True)
  48.         t.start()

  49.     def waitClose(self):
  50.         # 控制在线程内等待回调销毁窗体
  51.         while self.__showFlag:
  52.             time.sleep(self.__sleep)

  53.         # 非空情况下销毁
  54.         if self.__dialog is not None:
  55.             self.__dialog.destroy()

  56.         # 重置必要参数
  57.         self.__dialog = None
  58.         self.__showFlag = True

  59.     def close(self):
  60.         # 设置显示标识为不显示
  61.         self.__showFlag = False


  62. loading = LoadingBar()

  63. if __name__ == '__main__':
  64.     root = tk.Tk()
  65.     root.title('Loading滚动条演示')
  66.     formatForm(root, 400, 300)

  67.     # 展示滚动条,指定速度
  68.     loading.show(speed=10)


  69.     i= input('请输入巴拉巴拉')
  70.     if i == 1:
  71.         print(i,type(i))
  72.         loading.close

  73.     tk.Button(root, text='关闭滚动条', command=loading.close).pack(side=tk.TOP)
  74.     tk.Button(root, text='开启滚动条', command=loading.show).pack(side=tk.TOP)

  75.     root.mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-13 20:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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