py.c.c++ 发表于 2021-8-26 14:27:58

关于tkinter和多线程

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

用tkinter写了个调用api的程序,但是由于网速问题,按下按钮后要卡上一会,我就想搞一个progressbar,在响应时搞一个来回移动的效果。
应该使用多线程,但是我不知道怎么使用。。。
import tkinter as tk
import tkinter.ttk
import requests
def chat(msg):
    par={
      'key':'free',
      'msg':msg
    }
    url='http://api.qingyunke.com/api.php'
    resp=requests.get(url=url,params=par)
    return resp.json().get('content')
window=tk.Tk()
window.title("test")
window.geometry('200x300')
e1=tk.Entry(window)
e1.pack()
l1=tk.Label(window,text='')
def send():
    result=chat(msg=e1.get())
    l1.config(text=result)
b1=tk.Button(window,text='发送',command=send).pack()
l1.pack()
window.mainloop()
有没有高人指点
其实我想知道tkinter的按钮和进度条怎么结合使用

kogawananari 发表于 2021-8-26 17:23:02

考虑用aiohttp吗

py.c.c++ 发表于 2021-8-27 08:52:23

kogawananari 发表于 2021-8-26 17:23
考虑用aiohttp吗

我还是想要有进度条加载的效果,虽然用异步爬虫效率更高,但是其实我想知道tkinter的按钮和进度条怎么结合使用

文静 发表于 2021-10-20 16:55:45

{:10_249:}按钮跟函数不太一样的
import tkinter as tk
from tkinter import ttk
import threading
import time


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

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

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


class LoadingBar(object):

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

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

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

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

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

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

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

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


loading = LoadingBar()

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

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


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

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

    root.mainloop()
页: [1]
查看完整版本: 关于tkinter和多线程