使用tkinter进行Python线程处理

时间:2014-01-14 21:49:00

标签: python multithreading tkinter

回到11月底/ 12月初我开始并部分完成的程序。

我想向程序/线程发送一个值,重置该值并再次执行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个独立的guis /程序。他们无法将值发送回主程序(至少不是我所知道的)。我更喜欢这个想法,只使用一个程序并让子线程报告回来,主线程和主线程不断更新屏幕,显示当前正在11个孩子中查看的文件的文件编号线程。我可以这样做并仍然更新屏幕并能够继续使用和显示其他线程(非上述11)同时或不显示?

我希望这不是完全令人困惑的......如果是的话,对不起。

1 个答案:

答案 0 :(得分:0)

线程是最好的解决方案吗? 您可以从gui生成子进程以下载图像 查看多处理中的进程池类。

例如,gui可以生成下载类的下载类。

记住线程在相同的内存空间中运行,而进程具有单独的内存。

这些可能有用 Multiprocessing vs Threading Python Status of mixing multiprocessing and threading in Python Is it safe to fork from within a thread?

相关问题