wx.Gauge没有实时更新

时间:2017-06-19 19:35:25

标签: python multithreading user-interface wxpython wxwidgets

我无法实时更新wx.Gauage。 wx.Gauge在名为ProgressWindow的类中实例化。 ProgressWindow用于在工作完成时提供进度条。 更新仪表正在一个单独的线程上完成,因此它不会阻止正在进行的工作。不幸的是,当我实例化并启动进度窗口时,仪表仅在“fn_testing_progress_window”测试功能的最后更新。谁能明白为什么会这样?我试图在调用“fn_increment_count”时更新仪表。

注意:我有一个队列来处理更新仪表的请求的原因是,正在完成的工作分布在多个线程中,每个线程都可以更新仪表。

def fn_testing_progress_window():
    pw = ProgressWindow(self.main_panel)
    pw.fn_start()

    pw.fn_increment_count(increment = 50, msg = "50 Now")
    time.sleep(3)
    pw.fn_increment_count(increment = 75, msg = "75 Now")
    time.sleep(3)
    pw.fn_increment_count(increment = 100, msg = "Finished")


def fn_start(self):
    print "Starting Progress"
    _runner_thread = threading.Thread(target = self.fn_run)
    _runner_thread.start()

def fn_run(self):
    self._running = True
    self._current_count = 0

    while(self._running):
        # Wait til there is something in queue or til run is stopped
        while True:
            if (not self._update_queue.empty()):
                print "not empty"
                break

            if (not self._running):
                break

        _value, _msg = self._update_queue.get()

        # Update progress bar accordingly
        if _value:
            self._current_count += _value
            print "Updating value: %d" %(self._current_count)
            wx.CallAfter(self._progress_gauge.SetValue, self._current_count)

        if _msg:
            print "Updating msg: %s" %(_msg)
            wx.CallAfter(self._progress_output.SetValue, str(_msg))

        if (self._current_count >= self._total_count):
            pass

        # Have time for msg to appear
        time.sleep(0.1)


def fn_increment_count(self,
                       increment = 1,
                       msg = None):
    """
    Ability to update current count on progress bar and progress msg.
    If nothing provided increments current count by 1
    """
    _item_l = (increment, msg)
    self._update_queue.put(_item_l)

1 个答案:

答案 0 :(得分:3)

您无法从单独的线程更新wxGauge或任何其他GUI控件。 GUI更新应该只从主要的GUI线程完成,因此你的主线程不能阻止(就像你一样):这不仅会阻止更新发生,而且还会使整个程序无响应。

相反,反之亦然:在另一个线程中执行您的长时间工作,只需在GUI中更新某些内容时,就可以将事件发布到主线程中。除了为更新进度指示器的事件定义处理程序之外,主线程不需要做任何特殊操作。