2014-01-14 62 views
0

返回线程对程序的工作,我开始在十一月/十二月用Python的Tkinter

我想一个值发送到程序/线程,重置价值,并再次这样做早后期部分讫回, 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)吗?

我希望这不是完全混淆......如果是这样,很抱歉。

回答