【问题标题】:wxpython TextCtrl and infinite loop questionwxpython TextCtrl 和无限循环问题
【发布时间】:2011-03-10 21:56:41
【问题描述】:

由于某种原因,TextCtrl 在无限循环中时不起作用,这是我的代码:

   while 1:
        localtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        i = i + 1
        #print str(i)

        serRead = ser.readline()
        serSplit = serRead.split(",")

        #this works
        print str(i)+', '+tempOrShock+', '+localtime+', '+serSplit[1]

        #this doesn't
        self.displayTextCtrl.WriteText(str(i)+', '+tempOrShock+', '+
                                        localtime+', '+serSplit[1])

这个无限循环在按钮点击事件中,我基本上在点击按钮后运行无限循环,并告诉我的 TextCtrl 不断写出东西,但它不起作用。但是,打印语句工作正常。知道为什么会这样吗?

【问题讨论】:

    标签: python user-interface wxpython infinite-loop


    【解决方案1】:

    我怀疑 wxpython 在其主循环中有一些需要做的处理(调度事件等)。但是在您从事件处理程序返回之前,该循环无法运行。您最好设置一个计时器来定期更新您的文本控件。

    【讨论】:

    • 我确信循环可以工作,因为“打印”语句正在工作。 'readline()' 方法每秒返回一些值,因此每秒打印一行。设置计时器是什么意思?你能扩展一下吗?我对这一切还是很陌生..
    • @lamba:您的循环正在工作,但 wxpython 有一个 event loop 被您的循环阻止。只要该循环停止,GUI 就不会被更新。您的按钮事件可能应该启动一个计时器,并且该计时器的事件处理程序可以更新文本控件。我对 wxpython 不是很有经验,但我找到了an example。看看有没有帮助。
    • 如果您真的非常需要无限循环,请尝试在更新 TextCtrl 后添加wx.Yield()。这将允许 wxpython 事件循环正常运行。
    【解决方案2】:

    您可能应该使用 wx.Timer 而不是无限循环。另一个可供探索的选项是 wx.Yield。

    【讨论】:

    • 谢谢,我去看看 wx.Timer
    【解决方案3】:

    GUI 程序通过无限循环从队列中拉出事件并执行它们来工作。除了用户生成的事件(例如按钮按下)之外,还有一些低级事件告诉小部件自己绘制。除非这些事件得到处理,否则即使您修改它们的属性(例如更改颜色、添加文本等),窗口也不会重绘。因为您有自己的无限循环,所以您正在阻止处理这些低级事件。

    一个简单的解决方案是,从您自己的循环中将事件从队列中拉出并处理它们。由于已经有一个无限循环正在运行(“事件循环”),因此更好的解决方案是不要编写自己的无限循环。而是使用wx.CallAfterwx.CallLater 添加处理低级别事件后要执行的工作(即:当GUI 处于“空闲”状态时)

    实际上,对wx.CallAfter 的每次调用都会成为您自己循环的一次迭代。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 2021-09-02
      • 2020-09-09
      • 2021-09-11
      • 2018-09-24
      • 1970-01-01
      相关资源
      最近更新 更多