【问题标题】:WXPYTHON trickyWXPYTHON 棘手
【发布时间】:2016-09-06 17:58:52
【问题描述】:

我有一个 textctrl 框 - 我每 1 秒连续读取一次数据。我有一个按钮,当值低于 50 时必须启用它。我有一段代码,它使 GUI 无响应。在我在这里展示的代码中,我一直在等待值小于 50。然后启用开始按钮

    while self.pressure_text_control.GetValue()>50:
        self.start.Disable()
        time.sleep(1)
    self.start.Enable()

整个代码在另一个按钮事件中。

   def OnDone(self, event):
        self.WriteToControllerButton([0x04])
        self.status_text.SetLabel('PRESSURE CALIBRATION DONE \n DUMP PRESSURE')
        self.led1.SetBackgroundColour('GREY')
        self.done.Disable()
        self.add_pressure.Disable()
        while self.pressure_text_control.GetValue()>50:
            self.start.Disable()
            time.sleep(1)
        self.start.Enable()

pressure_text_control 中的值每 1 秒更新一次。

【问题讨论】:

标签: multithreading button while-loop wxpython


【解决方案1】:

设置wx.timer 为您完成工作,这将释放 GUI 主循环,即使其具有响应性。
wx.Timer 类允许您以指定的时间间隔执行代码。 https://wxpython.org/Phoenix/docs/html/wx.Timer.html

    self.timer = wx.Timer(self)
    self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
    self.timer.Start(1000)

def OnTimer(self, event):
    "Check the value of self.pressure_text_control here and do whatever"

在关闭程序之前不要忘记self.timer.Stop()

【讨论】:

  • 这是否会一直检查值直到计时器开启?一旦值小于我要求的 50,我该如何退出。 self.timer.Start(1000) 不意味着它在 1 秒后开始吗?而不是每 1 秒运行一次
  • 我提供了一个链接来解释 wx.timer 的作用。 Start(1000) 本质上意味着它每秒运行一次。所以是的,它在 1 秒后开始,然后每 1 秒运行一次,直到停止。如果您需要计时器随时停止,请执行self.timer.Stop() 命令,如前所述。您可以随时使用self.timer.Start(1000) 将其重新设置为运行
猜你喜欢
  • 1970-01-01
  • 2016-01-12
  • 2019-02-22
  • 2011-05-09
  • 2018-03-14
  • 2011-06-08
  • 2011-07-07
  • 2012-06-05
  • 2013-08-01
相关资源
最近更新 更多