【问题标题】:wxPython panel not showing at Show()wxPython 面板未显示在 Show()
【发布时间】:2018-07-09 04:05:40
【问题描述】:

所以我有一个小应用程序。它的要点只是一个窗口,在主框架的中心有一个按钮。当您单击按钮时,该按钮会被隐藏,并且主框架的中心会出现一个仪表/加载栏,并在进行一些计算时填充(填充部分尚未实现,目前它只是一个空仪表坐在那里)。

按钮和仪表都在各自的面板中实现,要在它们之间“切换”,我只需禁用隐藏按钮面板,然后启用并显示仪表面板。要切换回来,我只是扭转这个过程。非常直接。

现在,作为测试,我希望按钮在单击时切换到仪表几秒钟然后切换回来(使用Sleep())。

这是相关代码(如果您认为相关,请询问更多):

import wx
import time
import gui_base


class MainFrame(gui_base.main_frame):
        def __init__(self):
                super(MainFrame, self).__init__(None)
                self.set_state_pre_compare()

        def set_state_pre_compare(self):
                self.panel_in_compare_panel.Disable()
                self.panel_in_compare_panel.Hide()
                print('done hiding in')
                self.panel_pre_compare_panel.Enable()
                self.panel_pre_compare_panel.Show()
                print('done enabling pre')
                self.Layout()

        def set_state_in_compare(self):
                self.panel_pre_compare_panel.Disable()
                self.panel_pre_compare_panel.Hide()
                print('done hiding pre')
                self.panel_in_compare_panel.Enable()
                self.panel_in_compare_panel.Show()
                print('done enabling in')
                self.Layout()

        def on_compare_button_click(self, event):
                self.set_state_in_compare()
                time.sleep(2.5)
                self.set_state_pre_compare()


if __name__ == '__main__':
    app = wx.App(True)
    frame = MainFrame()
    frame.Show()
    app.MainLoop()

prein 面板指的是“预计算”(带有按钮的面板,计算尚未开始)和“计算中”(带有仪表的面板,计算已开始)

我的大问题是:应用程序启动正常,我单击按钮,按钮消失得很好,但是加载栏根本不显示,几秒钟后按钮又显示出来。

我还使用了一些打印语句来检查功能是否在某处完成/交付,但一切似乎都很好,没有挂起,一切都很好地完成。

此外,如果我将应用程序的初始状态设置为显示仪表(意味着无法切换到按钮),仪表显示得很好。

我得到的结论是,GUI 元素本身在启动时是可以的,如果我以 2 种状态中的任何一种作为初始状态来启动程序,该状态就会显示得很好。

还有切换功能,在某种程度上有效,虽然我不确定到什么程度。

可能的底部问题是:如果将两个面板设置为启动面板,为什么它不能很好地在状态之间切换?解决方法是什么?

提前谢谢你!

编辑:

我这样修改代码:

 def on_compare_button_click(self, event):
                event.Skip()
                self.set_state_in_compare()
                self.delay()


 def delay(self):
                for i in range(1500):
                        print(i)

为了模拟一些延迟,我注意到帧内容仅在该函数结束时才真正更新。如果我不切换回按钮面板,仪表将正常工作,但在按下按钮时,按钮面板被隐藏,仪表的显示/启用被调用并完成,但仪表不会显示(整个帧将是一个空白窗口)直到延迟功能结束。我尝试将set_statedelay 放在他们自己的线程中,或者两者都放在他自己的线程中,但似乎没有任何改变发生的事情。

为什么会这样?我怎样才能让 GUI 在它应该更新的时候(当 set_state 函数被调用时)?

【问题讨论】:

    标签: python python-3.x user-interface wxpython wxwidgets


    【解决方案1】:

    我想通了。据我了解,GUI 仅在功能完成后更新。要强制进行 GUI 更新,调用 self.Layout()self.Update() 就可以了。

    把这个留在这里,以防有人遇到同样的事情。

    【讨论】:

    • 你也可以尝试使用CallAfter()函数。检查文档以了解其用法。
    • 我认为Layout() 在内部调用Update(),所以你不应该需要后者
    • 虽然这是正确的,但更一般的规则是从不在主线程中使用sleep()。您不能在任何明显的时间内阻塞 UI,而 sleep 正是这样做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多