如何使用`wx.progress对话框`用我自己的方法?

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

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

如何使用wx.ProgressDialog来计时我调用的方法imgSearchimgSearch方法在用户pc上查找图像文件。如何使wx.ProgressDialogimgSearch仍在运行时运行并显示imgSearch所用的时间?在

我的代码是:

def onFind (self,event)# triggered by a button click
    max = 80
    dlg = wx.ProgressDialog("Progress dialog example","An informative message",parent=self, style = wx.PD_CAN_ABORT| wx.PD_APP_MODAL| wx.PD_ELAPSED_TIME| wx.PD_REMAINING_TIME)

    keepGoing = True
    count = 0
    imageExtentions = ['*.jpg', '*.jpeg', '*.png', '*.tif', '*.tiff']
    selectedDir = 'C:\\'
    imgSearch.findImages(imageExtentions, selectedDir)# my method

    while keepGoing and count < max:

    count += 1
    wx.MilliSleep(250)

    if count >= max / 2:
        (keepGoing, skip) = dlg.Update(count, "Half-time!")
    else:
        (keepGoing, skip) = dlg.Update(count)

    dlg.Destroy()

Tags: 方法selftimecountupdatemaxpdwx
1条回答
网友
1楼 · 发布于 2024-09-27 07:24:21

问题

你的问题很模糊,但是在看过你的代码之后,我想你的问题是imgSearch.findImages()在对话框打开之前就完成了。如果你能修改一下你的问题,我会很感激的。在

我看到您正在使用this tutorial中的代码来演示如何使用wx.ProgressDialog。不幸的是,你对这件事采取了相当天真的态度。本教程的目的是向读者介绍各种内置对话框。因此,wx.ProgressDialog示例是一个简单的示例,只是向您展示方法,而不是用作实现。在

背景资料

首先,您需要知道multithreading是什么以及它是如何工作的。计算机所做的每件事都被分解成一系列的数学运算。计算机处理器一次只能做一个操作。因此,计算机一次只能做一件事。现在你可能会想“那不是真的。我一边上网一边听MP3。这至少有两件事。你是对是错。想象一个厨师。厨师可以一次做很多菜,但一次只能注意一道菜。因此,他必须在盘子之间切换,执行一些小任务,直到它们全部完成。计算机就是这样multitasks。计算机在“线程”之间切换,而不是“盘”。在

解决方案

第一步:穿线

默认情况下,wxPython只是一个线程(这并不完全正确,但只需跟着它)。wxPython逐行运行您的代码,这样一行必须在下一行运行之前完全结束。因此,当imgSearch.findImages()正在运行时,没有其他代码在执行,而且它必须在创建wx.ProgressDialog之前完成。好消息是有几种方法可以解决这个问题。坏消息是,修复这个问题会变得相当复杂。我不是专家,但我建议搜索“wxpython线程”并尝试找到一些教程。我找到了this tutorial,但它已经很旧了。主要的一点是,您需要在它自己的线程中运行imgSearch.findImages(),这样它就不会阻塞GUI。在

第2步:指标

那么现在,如何使wx.ProgressDialog反映imgSearch.findImages()的实际状态呢?嗯,那要看情况了。您需要找到一些度量来帮助您衡量已经完成了多少工作,还有多少工作要做。在代码中,度量是时间,因为进度被编程为80 * 250ms = 20s。时间可能不是你想要的。你将需要决定什么是最适合你的程序,但我将使用“文件夹数”的例子,因为它很容易理解。我将计算文件夹的总数,以及我已完全扫描的文件夹数。现在有两种方法可以初始化度量。如果数字很小或易于计算(如时间),或者可以采用动态方法,则可以计算所需的max。在我的例子中,精确计算“文件夹数”所需的时间几乎与图像搜索本身一样多,因此动态是最佳选择。因此,我将修改imgSearch.findImages(),这样它就可以记录它看到的文件夹数以及扫描的文件夹数(例如,如果我的起始位置有3个文件夹,我就从3/0开始。我开始扫描第一个文件夹,它本身又包含2个文件夹,所以我现在有5/0。每次我完全扫描一个文件夹时,我会在扫描的文件夹数上加1,即扫描一个文件夹后加5/1)。知道我已经扫描了多少个文件夹以及还有多少个文件夹要扫描,我可以使用# of folders scanned / total # of folders来估计我的完成百分比。1 / 5 = 0.20,因此我估计我已经完成了20%(注意,如果我扫描的下一个文件夹包含5个以上的文件夹,那么这个数字会自动减少到10%。这就是为什么我称20%为估算值)

第三步:更新

所以现在我们应该在它自己的线程中有imgSearch.findImages(),它应该能够估计离完成还有多远。现在我们需要更新wx.ProgresDialog。对于这类问题,我最喜欢的方法是使用pubsub库。基本上,imgSearch.findImages()线程必须偶尔发送一条消息,说明它已接近完成。也许在每个文件夹的末尾。也许有三个文件夹。这取决于你。接下来,您需要在主GUI线程中创建一个方法,该方法可以读取这些消息并相应地更新wx.ProgressDialog。在

工作量很大,但我祝你好运。在

相关问题 更多 >

    热门问题