繁体   English   中英

Tkinter与时间和睡眠

[英]Tkinter with after and time.sleep

下面的python代码具有TKinter gui,它可以更新计算函数中的最新信息(该函数最后以self.after()进行调用。GUI还具有一些滑块,用户可以在其中调整参数。)这是有一个睡眠延迟的问题:代码运行良好,除了time.sleep(1)不仅阻塞了1秒钟的计算,而且还阻塞了GUI本身:每秒只能移动滑块一次然后将所有内容阻塞一秒钟,我该怎么办time.sleep(1)仅使计算功能处于睡眠状态,而使GUI本身不进入睡眠状态,我是否需要在单独的线程中运行计算功能?

import Tkinter as tk
import ttk
import time

class GUI(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.pack()
        self.i=0
        self.var1 = tk.StringVar()
        self.var2 = tk.StringVar()
        self.var3 = tk.StringVar()
        self.var4 = tk.StringVar()
        self.var5 = tk.StringVar()
        self.var6 = tk.StringVar()
        self.var7 = tk.StringVar()
        tk.Label(self, textvariable=self.var1,justify='left').pack()
        tk.Label(self, textvariable=self.var2).pack()
        tk.Label(self, textvariable=self.var3).pack()
        tk.Label(self, textvariable=self.var4).pack()
        tk.Label(self, textvariable=self.var5).pack()
        tk.Label(self, textvariable=self.var6).pack()
        tk.Label(self, textvariable=self.var7).pack()


        p1 = tk.Scale(master, from_=1, to=20, orient=tk.HORIZONTAL).pack()
        p2 = tk.Scale(master, from_=1, to=20, orient=tk.HORIZONTAL).pack()
        p3 = tk.Scale(master, from_=1, to=20, orient=tk.HORIZONTAL).pack()
        p4 = tk.Scale(master, from_=1, to=20, orient=tk.HORIZONTAL).pack()
        p5 = tk.Scale(master, from_=1, to=20, orient=tk.HORIZONTAL).pack()

        self.progress = ttk.Progressbar(self, orient="horizontal",length=100, mode="determinate")
        self.progress.pack()

    def calculation(self):
        # complex calculations that last 30 minutes in total
        self.i += 1
        time.sleep(1)
        max=1000
        self.var1.set("Value1: "+str(self.i))
        self.var2.set("Value2: "+str(self.i+100))
        self.var3.set("Value3: "+str(self.i+100))
        self.var4.set("Value4: "+str(self.i+100))
        self.var5.set("Value5: "+str(self.i+100))
        self.var6.set("Value6: "+str(self.i+100))
        self.var7.set("Value7: "+str(self.i+100))
        self.progress["value"] = int(round(self.i*100/max))
        #self.update()  # no need, will be automatic as mainloop() runs
        self.after(1, self.calculation)

app=GUI()
app.calculation()  # start calculations
app.mainloop()  # run gui

如果绝对必须使用睡眠,那么可以,该计算应在另一个线程或另一个进程中完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM