【发布时间】: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()
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 函数被调用时)?
【问题讨论】:
标签: python python-3.x user-interface wxpython wxwidgets