这可能仅仅是Tkinter主要是主线程的限制。还有一种方法可以在使用线程时在Tkinter中canvas.delete(ALL)
。我已经运行了程序,很长一段时间,因为当我尝试delete(ALL)
时,它不会做任何事情,只能写出屏幕上已有的内容。如果我尝试消除self.line1, self.line2
使用背景颜色回写文本行的概念,然后用新值替换行(如下所示)并将其替换为delete(ALL)
那么它就不会做任何事情,但只是在线上写回来,及时使价值不可读。当然,我注意到原始文本的一些色调仍然显示在屏幕上,代码写在下面。
此外,一旦子线程全部运行完毕,是否有一种跳出self.after
循环的简短方法。我知道我可以轻松创建一个庞大的if
系列语句来测试所有内容,然后在完成所有内容后使其结束。有没有一个简短的方法,当你有11个线程在运行时,你会通过测试?
import os
import sys
import urllib
import tkinter as tk
import threading
import time
os.chdir ('/media')
class GUI(tk.Frame):
def __init__(self,master):
tk.Frame.__init__(self,master)
self.DrawArea = tk.Canvas(self, width = 200, height = 250, background = 'black',
borderwidth = 0, highlightthickness = 0)
self.DrawArea.grid(row=0, column=0, sticky="nsew")
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
self.NxtNum0=0
self.NxtNum1=0
self.HiStr0=0
self.HiStr1=0
#find highest download video
Hival = open("Highest.txt", "r")
self.HiStr = Hival.read()
Hival.close()
self.HiStr0 = str(int(self.HiStr)+1)
self.HiStra = int(int(self.HiStr)/10000)
#call download #0
dl0 = threading.Thread(target = self.dl_0, name = 'dl0')
dl0.start()
#setup/call download #1
self.HiStr1 = str(str(self.HiStra+1)+"0000")
dl1 = threading.Thread(target = self.dl_1, name = 'dl1')
dl1.start()
self.line1=0
self.line2=0
self.real_time()
def real_time(self):
self.DrawArea.create_text(50,12,text = self.line1, fill = 'black')
self.DrawArea.create_text(50,27,text = self.line2, fill = 'black')
self.line1 = str(self.NxtNum0)
self.line2 = str(self.NxtNum1)
self.DrawArea.create_text(50,12,text = self.line1, fill = 'white')
self.DrawArea.create_text(50,27,text = self.line2, fill = 'white')
self.after(1000, self.real_time)
def dl_0(self):
self.NxtNum0 = int(self.HiStr0)
while self.NxtNum0 < int(self.HiStr0)+100:
self.NxtNum0 +=1
time.sleep(.1)
def dl_1(self):
self.NxtNum1 = int(self.HiStr1)
while self.NxtNum1 < int(self.HiStr1)+100:
self.NxtNum1 +=1
time.sleep(.1)
root = tk.Tk()
GUI(root).pack(fill = "both", expand = True)
答案 0 :(得分:1)
重复我的评论。默认情况下,Tkinter不安全。可以使用Queue对象安全地完成。队列是一种python数据类型,允许使用锁定数据样式传递安全的线程数据。基本上,您需要将命令从线程传递回main。队列将处理排序,以便命令不会太破坏或乱序。我在此处验证了我的信息的一个很好的示例:Source