wxPython面板未显示在Show()

时间:2018-01-30 09:57:50

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

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

按钮和仪表均在各自的面板中实现,并在它们之间“切换”我只是禁用隐藏按钮面板,然后启用并显示仪表板。为了切换回来,我只是改变了这个过程。很直接。

现在,作为一项测试,我希望按钮在点击时只需切换到仪表几秒钟并切换回来(使用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函数时)?

1 个答案:

答案 0 :(得分:1)

我明白了。根据我的理解,GUI只在功能完成时才会更新。要强制进行GUI更新,请调用self.Layout()self.Update()

留下这个以防万一有人可能会遇到同样的事情。