【问题标题】:Strategy for managing long GUI construction times (wxPython)管理较长 GUI 构建时间的策略 (wxPython)
【发布时间】:2014-02-20 21:05:48
【问题描述】:

我有一个带有多阶段 GUI 的 wxPython 应用程序。首先会弹出一个简单的表单,用于从众多 (> 100) 选项之一中进行选择(它是带有搜索框的零件编号列表)。一旦用户做出选择,它就会构建适当的表单并显示它,隐藏初始选择对话框。由于这个项目的性质,每个二级表单在Notebook 中有几个 matplotlib 图形,每个图形大约有 7 或 8 个图形,每个图形有 2-5 个轴。因此,表单从初始化到可以显示在屏幕上需要几秒钟的时间。

wxPython 有办法在后台构建框架吗?我不介意强迫用户在显示之前等待一小会儿,但是现在构建表单会占用事件循环并且一切都变得无响应。如果我使用线程构建表单,它会成功完成,但是当我调用 .Show() 时没有任何反应,也没有错误消息。

您可以想象,这样的 GUI 具有相当复杂的代码,因此很难显示 SSCCE(而且它不是开源的)。如果需要,我可以尝试拼凑一些可以接近我的问题的东西。

【问题讨论】:

    标签: python matplotlib wxpython wxwidgets


    【解决方案1】:

    我之前使用过 BusyInfo 来告诉用户正在发生的事情。在您实际开始创建 matplotlib 图形之前,您可以将其放入框架的 init() 中。你可以在这里阅读:

    另一个想法是创建第二个框架,其中包含一个进度条和一条消息。进度条将设置为来回反弹,当您完成创建 matplot 内容后,您将关闭第二帧。

    【讨论】:

    • BusyInfo 是解决这个问题的一个可接受的解决方案,我可以只放一条通用的加载消息,它可以清楚地向用户表明正在发生的事情,而且工作量很小。
    【解决方案2】:

    Mike 使用 wxBusyInfo 的想法在某些事情需要很长时间时很有用,但您也可以改为缩短时间(或至少缩短时间)。

    首先,当在wxChoicefreezethaw 中插入许多项目时(虽然我不会说 100 这么多,但绝对是 1000),然后再添加它们。这应该会大大减少插入所需的时间。

    其次,创建多页 wxNotebook(或另一个 wxBookCtrl)的所有控件可能很长,即使在 C++ 中也是如此。因此,我们的想法是不要立即执行此操作,而只创建您将最初向用户显示的页面的控件。然后仅在用户即将选择它们时创建其他页面控件,即在您的 wxEVT_BOOKCTRL_PAGE_CHANGING 事件处理程序中。

    如果你把它放在适当的位置,你可能不再需要wxBusyInfo...

    【讨论】:

    • 我考虑过只在查看页面时构建页面,但问题还在于我需要在笔记本的所有选项卡上同时绘制 matplotlib 图上的数据,当然要在用户点击之前在那个页面上。
    猜你喜欢
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2011-05-04
    • 1970-01-01
    • 2022-08-14
    • 2020-08-20
    相关资源
    最近更新 更多