这可能只是Tkinter作为主线程op primary的限制。当同样使用线程时,有没有办法在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)
重复我的评论。默认情况下,Tkinter不安全。使用Queue对象可以安全地完成。队列是一种python数据类型,允许使用锁定的数据样式安全地传递线程数据。基本上,您需要将命令从线程传输回main。队列将处理排序,这样命令就不会太乱或无序。一个很好的例子,我在这里验证了我的信息:Source
相关问题 更多 >
编程相关推荐