【问题标题】:Python threading with tkinter使用 tkinter 的 Python 线程
【发布时间】:2014-01-14 21:49:00
【问题描述】:

回到我在 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)吗?

我希望这不会完全令人困惑...抱歉,如果是这样。

【问题讨论】:

    标签: python multithreading tkinter


    【解决方案1】:

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

    例如可以是一个下载类,该 gui 生成多个下载进程。

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      相关资源
      最近更新 更多