回到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)同时或不显示?
我希望这不是完全令人困惑的......如果是的话,对不起。
答案 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?