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

2023-12-03

我正在编写一个 wxPython 应用程序,它将进行大量的数据分析和显示。到目前为止,当两个线程尝试同时更改 GUI 中的某些内容时,我编写的方式会导致出现问题。我想做的是建立自己的在主线程上运行的简单队列这样我就可以确保 UI 更新一次发生一个。

不过,我很难弄清楚如何设置事件循环。一般来说,你会做类似的事情

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

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


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

下面是一个 GUI 代码的示例,它在运行单独的线程并在主线程中更新 GUI 时利用了 wx.CallAfter。

该代码由 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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 在Android中如何停止正在等待新套接字的线程

    我正在开发一个使用 Socket 连接到服务器的软件 connectionThread new Thread new Runnable public void run InetAddress serverAddress InetAddres
  • 通过信号/槽将 QVector 从工作线程传递到主线程

    目前 我在将 QVector 传递到线程之间时遇到一些麻烦 目前我有一个主线程 GUI Thread 和一个频繁发出 QVector 数组的工作线程 在向量内直接发出数据之前看起来不错 接收者是主线程中的一个槽 但该槽接收到的数据是乱码 这
  • NUnit辅助线程异常

    我正在测试启动辅助线程的代码 并且这个线程有时会抛出异常 我想编写一个测试 如果没有正确处理该异常 该测试就会失败 我已经准备好了该测试 我在 NUnit 中看到的是 LegacyImportWrapperTests Import Exce
  • 线程安全区域设置技术

    我们目前正在编写一个基于线程 python Web 服务器框架 cherrypy 的 Web 应用程序 并希望同时支持来自多个区域设置的用户 区域设置模块似乎不是线程安全的 是否有第三方库或模块以线程安全的方式提供区域设置解析和格式化功能
  • 操作系统如何努力尽量减少 TLB 刷新?

    我想知道操作系统中是否实现了一种通用机制来最小化 TLB 刷新 例如将同一进程中的线程分组到 待调度 列表中 我认为在决定使用进程还是线程时 这是一个重要因素 如果操作系统不关心下一个线程是否在同一个进程空间中 那么所谓的线程 最小化 TL
  • Winforms 多线程:每次在 UI 线程上调用方法时是否需要创建一个新的委托?

    我想调用一个在 UI 线程上操作控件的方法 我的代码可以运行并且我想优化 我指的是这个MSDN 上的资源 http msdn microsoft com en us library 757y83z4 28VS 71 29 aspx 根据那里
  • 等待回调完成的最佳方法

    在下面的代码中 main 函数调用request 函数 该函数内部调用th request async 函数 其中mm th done cb 仅在执行 mm th done cb 后 在 main 中继续进行的最佳且有效的方法是什么 虚拟代
  • 在这种情况下,线程如何同时获取两个对象的锁?

    public void method Type1 inst1 Type2 inst2 synchronized inst1 synchronized inst2 do something now 从这段代码我可以理解 一旦线程进入该方法 它
  • 编码/设计通用线程安全限制器(即将 X() 每秒执行多次)

    我计划设计一个类来将函数的执行限制在指定时间内的给定数量 例如 最大处理量1 秒内 5 个文件 它应该是线程安全的并且性能影响应该最小 你会如何设计这样一个类 我有几个想法 但对我来说 没有一个是正确的 是否有任何已知的设计模式可以完成此类
  • 尝试在另一个线程wxpython中创建一个对话框

    我正在另一个线程中运行一个函数 该函数应该填写一个对话框 然后显示它 但只要我尝试以任何方式更改对话框 它就会出现段错误 我读到这是 WxPython 的一个常见问题 并且开发人员无意直接更改另一个线程中的对话框 我该如何解决这个问题 我可
  • 单线程应用程序中的同步方法是否较慢?

    在过去的几分钟里 我一直在与自己争论这个问题 我找到了 是 和 否 的理由 这源于查看答案Java HashMap 与 Hashtable https stackoverflow com questions 40471 java hashm
  • Java 中的“实现 Runnable”与“扩展线程”

    从我什么时候开始使用线程Java 我找到了这两种编写线程的方法 With 实施Runnable public class MyRunnable implements Runnable public void run Code Started
  • Linux 内核 - 如何停止等待信号量的 kthread?

    在编写 Linux 内核模块时 我遇到了一个 kthread 问题 在等待信号量解锁时无法唤醒该 kthread 这会导致线程不可停止并且rmmod尝试卸载模块时冻结 请注意 该模块在 3 10 内核上运行 我无法将其更新到较新的版本 客户
  • 如何防止 Parallel.ForEach 循环在运行时更改任务数量?

    我正在使用Parallel ForEach循环做一些工作 我用localInit像这样 localInit gt new foo new Foo bars CreateBars 根据文档 https learn microsoft com
  • 限制并行工作的线程数量

    我正在创建一个函数 将文件从本地计算机复制到远程创建线程以并行执行 sftp def copyToServer does copy file given host name and credentials for i in hostsLis
  • 在多个线程中添加和删除时 List 中的 null 值

    我知道 C System Collections Generic List 对象不是线程安全的 但我想知道为什么这段代码会生成空值 Task Run gt for var i 0 i lt 10 i var str Test i list
  • 多个用户级线程堆栈的内存

    我想了解用户级线程堆栈的内存如何保存在内存中 我认为所有堆栈都会从页面边界开始 我是对的吗 用户级线程库如何确保某个线程的堆栈不会增长并与其他线程的连续页面边界堆栈重叠 因为所有堆栈页面都是连续的 如果您坚持使用连续的堆栈 那么是的 为单独
  • 如何实现具有LinkedHashMap类似功能的ConcurrentHashMap?

    我用过LinkedHashMap with accessOrdertrue 并同时允许最多 500 个条目作为数据的 LRU 缓存 但由于可扩展性问题 我想转向一些线程安全的替代方案 ConcurrentHashMap在这方面似乎不错 但缺
  • PyCharm - 如何挂起所有线程

    我们使用 PyCharm 5 0 1 进行多线程调试 当它在断点处停止时 只有特定线程停止 而所有其他线程继续 这使得 冻结时刻 和检查参数值以及其他线程的当前状态变得困难 当其中一个线程在断点处停止时 是否可以挂起所有线程 这在最新的 P
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 在提交和结帐中启用密码

    我根据这个资源设置了一个svn存储库http anandafit info 2010 11 03 setup a subversion server 但是当我只提交代码时 服务器询问用户名和密码 而不询问 svn 签出过程的密码 似乎我没有
  • CSS - Chrome 移动设备上出现带有剪辑路径的奇怪边框

    我使用了基本的 CSSclip path创建一个 斜坡 如下所示 问题是 在移动设备上使用 Chrome 浏览器会创建一个在我的 CSS 中未定义的 边框 奇怪的是 在桌面版 Chrome 和 Firefox 桌面 移动 上它不会出现 我仔
  • 使用 doxygen 扩展 makefile 以生成库和文档

    我已经实现了一个二叉树程序 其中包括带有函数的tree c 带有它们的声明的tree h以及用于测试的main c 另外 我有一个 makefile 它是 CC gcc CFLAGS g Wall DEPS tree h OBJ main
  • ASP.NET MVC 2 和 IIS 7.0 的错误处理

    再会 我最近从 IIS 6 0 切换到 IIS 7 x 并且正在寻找我梦想中的 ASP NET MVC 2 错误处理技术 我想要实现的目标 在一个地方处理所有未处理的异常 最好在 Global asax 处理程序中 404 和 403 错误
  • 如何在 bash 中有条件地添加管道元素

    我需要形成各种命令的管道 管道的某些元素或元素序列仅在某些条件成立时才相关 现在 我可以写 if whatever then cmd1 cmd2 cmd3 cmd4 else cmd1 cmd4 fi 但这意味着重复cmd1 and cmd
  • 如何使用 jq 根据内部数组中的值过滤对象数组?

    鉴于此输入 Id cb94e7a42732b598ad18a8f27454a886c1aa8bbba6167646d8f064cd86191e2b Names condescending jones loving hoover Id 186
  • css 选择器:第一个子元素

    div li first child 上面的CSS选择器的目标是什么 页面上每个 div 的第一个 li or div 的所有后代 li 其中 div 是其父级的第一个子级 The first child适用于li 应该选择lis 是任何
  • 非常不寻常的 Xcode 编译行为

    自从 Xcode 6 1 和 iOS 8 1 发布以来 我的一个应用程序停止运行 仅当我使用 发布 而不是 调试 方案在设备上执行 运行 时 我才设法重现该问题 现在来说说问题 这在调试模式下工作正常 import Foundation c
  • 如何解决 ASP.NET 中全局文件中的 Ninject 依赖关系?

    我正在将 Ninject 和 Ninject Web 程序集与 Web 表单应用程序一起使用 在 global asax 文件中 我指定了如下绑定 public class Global NinjectHttpApplication pro
  • 并发修改异常

    通过下面的代码片段 我尝试处理电子表格 但需要排除临时列 我知道我这样做的粗略方式 将异常放入 ArrayList 并处理每个列表 并且在当前行列上不断增量是不正当的 但你知道只是完成它 但是我收到了标题错误 我相信这种情况永远不会发生 我
  • 如何格式化数字 0..9 以显示 2 位数字(不是日期)

    我希望始终显示 100 以下的 2 位数字 例如 03 05 15 如何在不使用条件来检查 0 是否低于 10 的情况下附加 0 我需要将结果附加到另一个字符串 所以我不能使用 printf 您可以使用 String format 02d
  • SpriteKit - SKScene 边界不等于 SKView 边界

    最近我创建了一个新的 Xcode 游戏项目 我没有碰任何东西就运行了模板 我期待一个标准你好世界 应用程序 但我注意到一件事 我得到的不是充满背景的场景 而是场景cut在顶部和底部 我怎样才能让它充满整个屏幕 看起来默认的 SpriteKi
  • Flask - 将反馈数据存储到服务器

    我使用烧瓶应用程序作为服务器 我只是返回用户交易 但是 如果交易错误 我需要允许用户向服务器提供反馈 from flask import Flask render template request import pandas as pd p
  • 使用 Angular.js 版本 1.2.18 进行嵌套过滤

    我是第一次尝试 AngularJS 我确实重复了一个基于 JSON 数据的模板 这是一个示例 scope users name first user status name employee name second user status
  • 删除 matplotlib 图上的图例

    要将图例添加到 matplotlib 图中 只需运行legend How to remove情节中的传奇 我最接近的是运行legend 为了从数据中清空图例 但这会在右上角留下一个丑陋的白色矩形 As of 绘图库v1 4 0rc4 a r
  • 有关 SOLR 文档等的问题

    网站 分类广告网站 用户可以投放广告 搜索广告等 我打算使用SOLR进行搜索 然后仅以ID nr s返回结果 然后使用这些ID nr s查询mysql 最后用这些ID s显示结果 目前我在 MySQL 中有大约 30 个表 每个类别一个 1
  • 如何在 Windows 上将 UTF-8 字符串打印到 std::cout?

    我正在用 C 编写一个跨平台应用程序 所有字符串均在内部进行 UTF 8 编码 考虑以下简化代码 include
  • Angular 2 不使用 CORS 保存我的身份验证 Cookie

    我有一个 Angular 2 应用程序 它应该向 Node Express 后端进行身份验证 向后端发送登录请求并接收 cookie 它应该在每个连续请求中发送此 cookie 但事实并非如此 我的角度应用程序中有 class 登录服务 p
  • SCCM 不会更新手动安装的软件

    客户端计算机均为 Windows 10 专业版 64 位 如果我们有MyCompanyApp msi通过SCCM安装后 我们发现使用SCCM可以成功更新它 那里一切正常 然而 如果我要跑MyCompanyApp msi通过双击 MSI 或运
  • 在 wxPython 应用程序中实现我自己的事件循环

    我正在编写一个 wxPython 应用程序 它将进行大量的数据分析和显示 到目前为止 当两个线程尝试同时更改 GUI 中的某些内容时 我编写的方式会导致出现问题 我想做的是建立自己的在主线程上运行的简单队列这样我就可以确保 UI 更新一次发