python - 如何在我自己的方法中使用`wx.ProgressDialog`?

标签 python user-interface wxpython

如何使用wx.ProgressDialog对名为imgSearch的方法计时?imgSearch方法在用户的pc上查找图像文件。如何在wx.ProgressDialog仍在运行时使imgSearch运行,并显示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()

最佳答案

问题
你的问题很模糊,但是在看了你的代码之后,我猜你的问题是imgSearch.findImages()在对话框打开之前就完成了。如果你能修改一下你的问题,我会很感激的,这样我就知道这是否正确了。
我看到您正在使用this tutorial中的代码来演示如何使用wx.ProgressDialog。不幸的是,你对此采取了相当幼稚的态度。本教程的目的是向读者介绍各种内置对话框。因此,wx.ProgressDialog示例是一个简单的示例,只是向您展示方法,而不是用作实现。
背景资料
首先,你需要知道multithreading是什么以及它是如何工作的。计算机所做的一切都被分解成一系列的数学运算。计算机处理器一次只能做一个操作。因此,计算机一次只能做一件事。现在你可能会想“那不是真的。我边上网边听MP3。至少有两件事”。你是对的,你错了。想象一个厨师。厨师可以一次准备许多菜,但他只能一次注意一道。因此,他必须在盘子之间切换,执行一些小任务,直到它们全部完成。计算机就是这样的。计算机在“线程”之间切换,而不是“盘”。
解决方案
第一步:穿线
默认情况下,wxPython只是一个线程(这并不完全正确,但请继续)。wxPython逐行运行代码,这样一行代码必须在下一行代码运行之前完成。因此,当imgSearch.findImages()正在运行时,没有其他代码正在执行,它必须在创建wx.ProgressDialog之前完成。好消息是有几种方法可以解决这个问题。坏消息是修复这个问题会变得相当复杂。我不是专家,但我建议搜索“wxpython线程”并尝试找到一些教程。我发现了multitasks但它相当古老。要点是,您需要在它自己的线程中运行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%为估算值)
步骤3:更新
所以现在我们应该在它自己的线程中有imgSearch.findImages(),它应该能够估计它离完成还有多远。现在我们需要更新wx.ProgresDialog。我最喜欢的解决这些问题的方法是使用this tutorial库。基本上,imgSearch.findImages()线程必须偶尔发送一条消息,说明它离完成有多远。可能在每个文件夹的末尾。可能有三个文件夹。这取决于你。接下来,您需要在主GUI的线程中创建一个方法,该方法可以读取这些消息并相应地更新wx.ProgressDialog
工作很多,但祝你好运。

关于python - 如何在我自己的方法中使用`wx.ProgressDialog`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12239990/

相关文章:

python - 如何通过碰撞检测阻止玩家 Sprite 穿过方 block ?

python - 这段代码有什么问题?我收到一个名称错误

.net - 如何使 .net Windows 窗体项目看起来新颖?

javascript - (单元)测试网站界面的方法

python - wxPython,试图从一个 sizer 中删除所有按钮,总是留下一个

python - 如何使用 sys.path_hooks 自定义加载模块?

python - 我可以让 PyYAML 将一个 %TAG 指令应用于一个流中的多个文档吗?

c# - 向 WPF 窗口添加控件而不阻塞 GUI 线程

python - 获取条形图的颜色matplotlib

python - 在 wxPython 中防止面板增长