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

2024-09-27 07:19:17 发布

您现在位置:Python中文网/ 问答频道 /正文

这可能只是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)

Tags: textimportselftimedeffilltkint
1条回答
网友
1楼 · 发布于 2024-09-27 07:19:17

重复我的评论。默认情况下,Tkinter不安全。使用Queue对象可以安全地完成。队列是一种python数据类型,允许使用锁定的数据样式安全地传递线程数据。基本上,您需要将命令从线程传输回main。队列将处理排序,这样命令就不会太乱或无序。一个很好的例子,我在这里验证了我的信息:Source

相关问题 更多 >

    热门问题