Python tkinter线程问题。删除(全部)

Python tkinter线程问题。删除(全部),python,multithreading,tkinter,Python,Multithreading,Tkinter,这可能只是Tkinter作为主线程的局限性。当同时使用线程时,是否有办法在Tkinter中canvas.delete(ALL)。我让程序一直在运行,因为当我尝试delete(ALL)时,它除了写屏幕上已经出现的内容外,什么都不会做。如果我试图消除self.line1、self.line2在用新值(如下所示)替换行之前用背景色写回文本行的概念,并将其替换为delete(ALL),那么它除了直接写回行外什么都不做,并且及时地使值无法读取。诚然,我确实注意到屏幕上仍然显示着一些原始文本的色调,代码的编

这可能只是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)
导入操作系统
导入系统
导入URL库
将tkinter作为tk导入
导入线程
导入时间
os.chdir(“/media”)
类GUI(tk.Frame):
定义初始(自我,主):
tk.Frame.\uuuuu init\uuuuuuu(自,主)
self.DrawArea=tk.Canvas(self,宽度=200,高度=250,背景=‘黑色’,
borderwidth=0,highlightthickness=0)
self.DrawArea.grid(行=0,列=0,sticky=“nsew”)
self.grid_rowconfigure(0,权重=1)
self.grid\u column配置(0,权重=1)
self.NxtNum0=0
self.NxtNum1=0
self.HiStr0=0
self.HiStr1=0
#查找最高下载视频
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)
#电话下载#0
dl0=threading.Thread(target=self.dl_0,name='dl0')
dl0.start()
#安装/呼叫下载#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实时(自):
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.NxtNum0=int(self.HiStr0)
当self.NxtNum0
重复我的评论。默认情况下,Tkinter不安全。可以使用队列对象安全地完成此操作。队列是一种python数据类型,允许使用锁定的数据样式安全地传递线程数据。本质上,您需要将命令从线程传回主线程。队列将处理排序问题,这样命令就不会太乱或无序。一个很好的例子,我在这里验证了我的信息:

如果我没有记错,Tkinter是完全线程不安全的。虽然它有时可能有效,但你很难称之为可靠的。您可以使用队列(标准python库中包含的线程安全实现)并将命令作为字符串排队,然后连接所有线程并使用队列按顺序执行命令,但此时,您不一定需要线程。