使用tkin的Python线程

2024-09-27 07:24:41 发布

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

11月1日晚些时候开始了部分返回工作

我想把一个值发送给一个程序/线程,重置这个值,然后再做一次,11次。程序/线程将与主程序/线程同时运行。我希望“子线程”向主程序/线程报告,主线程将显示在gui上,其中每个线程当前正在处理,这样我就可以大致了解整个任务完成之前需要多长时间。这是最初的概念,现在我想结合另一个程序,它将从互联网上下载其他图像,而这个程序正在互联网上搜索某些音频/视频文件。这部分程序的执行时间比图像下载要长(45分钟,而图像下载大约需要4-5分钟)。在

一旦图像下载完成,我希望能够浏览图像。因此,母线程必须是“全功能”的,而不是捆绑在一起。在

随着我不断学习Python中我在VB6中从未真正拥有的功能,这个想法不断扩展。在

几分钟前我在旧帖子中看到Tkinter只与主线程一起工作。因此,我总是在下面的代码中得到错误。在

有没有办法在不锁定主程序/线程的情况下,让子线程向主线程报告,让主线程更新屏幕,同时让主线程正常工作(下载/显示图像)?在

以下是我目前的出发点。在

import os
import sys
import urllib
from tkinter import *
import threading
import time

class Startup:
    def __init__(self, root):
            self.DrawArea = Canvas(root, height=250, width=200,bg = 'black')
            self.starthere()        

    def dl_0(self):
            self.NxtNum0 = int(self.HiStr0)
            while self.NxtNum0 < int(self.HiStr0)+100:
                    self.DrawArea.create_text(50,12,text = str(self.NxtNum0), fill = 'white', tags = '0')
                    self.NxtNum0 +=1
                    #download routine goes here once the on screen update routine gets straightened out, time.sleep(.1) will be removed
                    time.sleep(.1)
                    #self.DrawArea.delete('0')

    def dl_1(self):
            self.NxtNum1 = int(self.HiStr1)
            while self.NxtNum1 < int(self.HiStr1)+100:
                    self.DrawArea.create_text(50,37,text = str(int(self.NxtNum1)), fill = 'white', tags = '1') 
                    self.NxtNum1 +=1
                    #download routine goes here once the on screen update routine gets straightened out, time.sleep(.1) will be removed
                    time.sleep(.1)
                    #self.DrawArea.delete('1')

    #continue on through all 11 threads

    def starthere(self):
            #find current highest value
            Hival = open("Highest.txt", "r") 
            Histr = Hival.read()
            Hival.close()
            self.HiStr0 = str(int(Histr)+1)
            HiStra = int(int(Histr)/10000)

            #call download #0
            dl0 = threading.Thread(target = self.dl_0, name = 'dl0')
            dl0.start()

            #setup/call download #1
            self.HiStr1 = str(str(HiStra+1)+"0000")
            dl1 = threading.Thread(target = self.dl_1, name = 'dl1')
            dl1.start()

            #continue on down through all 11 threads

if (__name__ == "__main__"):
    os.chdir ('/media/')
    root = Tk()
    root.geometry("200x250")
    Thr = Startup(root)

上面所说的,就像我说的,是为了让这件事正常工作,一天中大部分时间都没有上网。我想我理解了Tkinter的局限性,与现在应该写的相比,它确实写得有点怪。在

我承认在最初的部分完成版本中,我使用子进程创建了11个单独的gui/程序。他们无法将值发送回主程序(至少据我所知)。我更喜欢这样的想法:只使用一个程序,让子线程报告主线程,让主线程不断更新屏幕,显示11个子线程中当前正在查看的文件的文件号。我可以这样做,仍然有更新的屏幕,并能够继续使用和显示其他线程(非11以上)在同一时间?在

我希望这不是完全令人困惑…抱歉,如果是的话。在


Tags: 图像importself程序timedefroot线程

热门问题