在wxPython应用程序中实现我自己的事件循环

布德舍姆

我正在编写一个wxPython应用程序,它将进行大量的数据分析和显示。到目前为止,当两个线程试图同时更改GUI中的某些内容时,我的书写方式导致了问题。我想要做的是设置在主线程上运行的自己的简单队列,以便确保一次进行一次UI更新。

不过,我很难理解如何设置事件循环。一般来说,您会做类似的事情

while True:
    try:
        callback = queue.get(False)
    except Queue.Empty:
        break
    callback()

我假设如果我按原样运行该代码,则WX将无法执行其操作,因为它将永远不会收到任何事件或任何东西,因为控制不会离开我的无限循环。如何使这种结构与WX事件循环共存?或更笼统地说,在WX应用程序中,如何确保某个任务仅在主线程上运行?

约里兹

您可以使用wx.callafter,它接受一个可调用对象,该对象在当前事件和未决事件处理程序完成后在guis主循环中被调用。调用时,任何额外的位置或关键字args都会传递给可调用对象。

这是在运行单独的线程并更新主线程中的GUI时利用wx.CallAfter的gui代码示例。

该代码是由Andrea Gavana编写的,可在wxpython Phoenix文档中找到

#!/usr/bin/env python

# This sample shows how to take advantage of wx.CallAfter when running a
# separate thread and updating the GUI in the main thread

import wx
import threading
import time

class MainFrame(wx.Frame):

    def __init__(self, parent):
        wx.Frame.__init__(self, parent, title='CallAfter example')

        panel = wx.Panel(self)
        self.label = wx.StaticText(panel, label="Ready")
        self.btn = wx.Button(panel, label="Start")
        self.gauge = wx.Gauge(panel)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.label, proportion=1, flag=wx.EXPAND)
        sizer.Add(self.btn, proportion=0, flag=wx.EXPAND)
        sizer.Add(self.gauge, proportion=0, flag=wx.EXPAND)

        panel.SetSizerAndFit(sizer)
        self.Bind(wx.EVT_BUTTON, self.OnButton)

    def OnButton(self, event):
        """ This event handler starts the separate thread. """
        self.btn.Enable(False)
        self.gauge.SetValue(0)
        self.label.SetLabel("Running")

        thread = threading.Thread(target=self.LongRunning)
        thread.start()

    def OnLongRunDone(self):
        self.gauge.SetValue(100)
        self.label.SetLabel("Done")
        self.btn.Enable(True)

    def LongRunning(self):
        """This runs in a different thread.  Sleep is used to
         simulate a long running task."""
        time.sleep(3)
        wx.CallAfter(self.gauge.SetValue, 20)
        time.sleep(5)
        wx.CallAfter(self.gauge.SetValue, 70)
        time.sleep(4)
        wx.CallAfter(self.OnLongRunDone)

if __name__ == "__main__":
    app = wx.App(0)
    frame = MainFrame(None)
    frame.Show()
    app.MainLoop()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

DLL中子应用程序中的C ++事件循环

来自分类Dev

Qt应用程序中的线程和事件循环

来自分类Dev

DLL中子应用程序中的C ++事件循环

来自分类Dev

如何实现我自己的后端和我的移动应用程序之间的实时同步?

来自分类Dev

从我自己的应用程序中打开其他应用程序

来自分类Dev

我自己的应用程序发送按钮

来自分类Dev

想要在我的android应用程序中实现聊天功能,我可以使用任何库或SDK吗?还是我必须自己编写所有代码?

来自分类Dev

在我的Web应用程序中实现simplesamlphp库的问题

来自分类Dev

为WebRTC应用程序实现我们自己的STUN / TURN服务器

来自分类Dev

如何为我们自己的NetBeans Java应用程序实现NetBeans Installer(NBI)?

来自分类Dev

如何从日历中获取我的应用程序的事件?

来自分类Dev

我需要减慢python tkinter应用程序中的循环

来自分类Dev

将PostgreSQL安装程序添加到我自己的应用程序安装程序中

来自分类Dev

如何实现我自己的“ onCellClick”事件处理程序

来自分类Dev

仅为我的应用程序实现IDownloadManger

来自分类Dev

如何使我的用户访问我的应用程序中自己的存储桶

来自分类Dev

如何在我自己的 Android 应用程序中启动另一个应用程序?

来自分类Dev

Wxpython应用程序图标

来自分类Dev

在我的iPhone应用程序中,我试图在Tableview中实现UISearchBar

来自分类Dev

从iOS中的设备删除应用程序后,如何删除“我的应用程序日历”中的所有事件

来自分类Dev

非Qt应用程序中基于Qt的DLL中的事件循环

来自分类Dev

如何在Mojolicious :: Lite应用程序中全局使用我自己的子例程

来自分类Dev

我自己的应用程序中的Android拦截软按键-Backspace问题

来自分类Dev

如何在我自己的应用程序中获取“打开为窗口”选项

来自分类Dev

如何在我自己的应用程序中获取“打开为窗口”选项

来自分类Dev

我如何在自己的Android应用程序中显示pdf

来自分类Dev

如何在我自己的Google地图应用程序中设置Google Maps Directions?

来自分类Dev

如何将用户代码合并到我自己的应用程序中?

来自分类Dev

为什么我应该将自己的错误/异常处理构建到 Webflux 应用程序中?

Related 相关文章

  1. 1

    DLL中子应用程序中的C ++事件循环

  2. 2

    Qt应用程序中的线程和事件循环

  3. 3

    DLL中子应用程序中的C ++事件循环

  4. 4

    如何实现我自己的后端和我的移动应用程序之间的实时同步?

  5. 5

    从我自己的应用程序中打开其他应用程序

  6. 6

    我自己的应用程序发送按钮

  7. 7

    想要在我的android应用程序中实现聊天功能,我可以使用任何库或SDK吗?还是我必须自己编写所有代码?

  8. 8

    在我的Web应用程序中实现simplesamlphp库的问题

  9. 9

    为WebRTC应用程序实现我们自己的STUN / TURN服务器

  10. 10

    如何为我们自己的NetBeans Java应用程序实现NetBeans Installer(NBI)?

  11. 11

    如何从日历中获取我的应用程序的事件?

  12. 12

    我需要减慢python tkinter应用程序中的循环

  13. 13

    将PostgreSQL安装程序添加到我自己的应用程序安装程序中

  14. 14

    如何实现我自己的“ onCellClick”事件处理程序

  15. 15

    仅为我的应用程序实现IDownloadManger

  16. 16

    如何使我的用户访问我的应用程序中自己的存储桶

  17. 17

    如何在我自己的 Android 应用程序中启动另一个应用程序?

  18. 18

    Wxpython应用程序图标

  19. 19

    在我的iPhone应用程序中,我试图在Tableview中实现UISearchBar

  20. 20

    从iOS中的设备删除应用程序后,如何删除“我的应用程序日历”中的所有事件

  21. 21

    非Qt应用程序中基于Qt的DLL中的事件循环

  22. 22

    如何在Mojolicious :: Lite应用程序中全局使用我自己的子例程

  23. 23

    我自己的应用程序中的Android拦截软按键-Backspace问题

  24. 24

    如何在我自己的应用程序中获取“打开为窗口”选项

  25. 25

    如何在我自己的应用程序中获取“打开为窗口”选项

  26. 26

    我如何在自己的Android应用程序中显示pdf

  27. 27

    如何在我自己的Google地图应用程序中设置Google Maps Directions?

  28. 28

    如何将用户代码合并到我自己的应用程序中?

  29. 29

    为什么我应该将自己的错误/异常处理构建到 Webflux 应用程序中?

热门标签

归档