所以我有一个小应用程序。它的要点只是一个窗口,主框架中央有一个按钮。单击按钮时,按钮会被隐藏,并且主框架的中心会出现一个标尺/加载条,并在进行一些计算时填满(填充部分尚未实现,此时它只是一个空的标尺坐在那里。)
按钮和仪表均在各自的面板中实现,并在它们之间“切换”我只是禁用隐藏按钮面板,然后启用并显示仪表板。为了切换回来,我只是改变了这个过程。很直接。
现在,作为一项测试,我希望按钮在点击时只需切换到仪表几秒钟并切换回来(使用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()
pre
和in
面板引用“预计算”(带按钮的面板,计算尚未开始)和“计算中”(带计量器的面板,计算开始)
我的大问题是:应用程序启动正常,我点击按钮,按钮消失得很好,但是加载栏根本没有显示,几秒钟后按钮显示备份。
我还使用了一些打印语句来检查函数是否完成/在某处完成但是一切看起来都很棒,没有任何东西挂起,一切都很顺利。
此外,如果我将应用程序的初始状态设置为显示仪表(意味着无法切换到按钮),仪表显示正常。
我得到的结论是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_state
或delay
放在他们自己的主题中,或者两者都放在他自己的主题中,坚果似乎没有改变发生的事情。
为什么会这样?如何实现GUI的实际更新(当调用set_state函数时)?
答案 0 :(得分:1)
我明白了。根据我的理解,GUI只在功能完成时才会更新。要强制进行GUI更新,请调用self.Layout()
和self.Update()
。
留下这个以防万一有人可能会遇到同样的事情。