在wxPython中调用另一个函数时如何终止当前运行的函数?
解决wxPython菜单切换时控件重叠的问题
你遇到的问题并非两个函数同时运行,而是每次点击菜单项都会在面板上新增静态文本和输入框控件,新旧控件位置重叠导致界面混乱。下面提供两种可行的解决方案:
方案1:切换时销毁旧控件
每次点击菜单时,先清除面板上已有的所有子控件,再创建新的控件组:
import wx class MyFrame(wx.Frame): def __init__(self): super().__init__(parent=None, title='Simple App') self.panel = wx.Panel(self) # 将面板设为实例变量,方便后续操作 menu = wx.Menu() it = menu.Append(-1, "Input Text") menu.AppendSeparator() rt = menu.Append(-1, "Readonly Text") self.Bind(wx.EVT_MENU, self.OnInput, it) self.Bind(wx.EVT_MENU, self.OnReadonly, rt) menuBar = wx.MenuBar() menuBar.Append(menu, "Simple Menu") self.SetMenuBar(menuBar) self.Show() def OnInput(self, event): # 遍历并销毁面板上所有现有控件 for child in self.panel.GetChildren(): child.Destroy() # 创建输入模式的控件 wx.StaticText(self.panel, label="Type your text", pos=(50, 100)) wx.TextCtrl(self.panel, pos=(50, 150)) def OnReadonly(self, event): # 遍历并销毁面板上所有现有控件 for child in self.panel.GetChildren(): child.Destroy() # 创建只读模式的控件 wx.StaticText(self.panel, label="Status", pos=(50, 100)) input_ctrl = wx.TextCtrl(self.panel, pos=(50, 150), style=wx.TE_MULTILINE|wx.TE_READONLY) input_ctrl.SetValue("Waiting for your file") if __name__ == '__main__': app = wx.App() frame = MyFrame() app.MainLoop()
方案2:预创建控件并切换显示状态
初始化时提前创建好两组控件,切换菜单时仅切换控件的显示/隐藏状态,这种方式性能更优,避免频繁销毁重建控件:
import wx class MyFrame(wx.Frame): def __init__(self): super().__init__(parent=None, title='Simple App') self.panel = wx.Panel(self) # 创建输入模式控件组 self.input_label = wx.StaticText(self.panel, label="Type your text", pos=(50, 100)) self.input_ctrl = wx.TextCtrl(self.panel, pos=(50, 150)) # 创建只读模式控件组 self.readonly_label = wx.StaticText(self.panel, label="Status", pos=(50, 100)) self.readonly_ctrl = wx.TextCtrl(self.panel, pos=(50, 150), style=wx.TE_MULTILINE|wx.TE_READONLY) self.readonly_ctrl.SetValue("Waiting for your file") # 默认显示输入控件,隐藏只读控件 self.readonly_label.Hide() self.readonly_ctrl.Hide() menu = wx.Menu() it = menu.Append(-1, "Input Text") menu.AppendSeparator() rt = menu.Append(-1, "Readonly Text") self.Bind(wx.EVT_MENU, self.OnInput, it) self.Bind(wx.EVT_MENU, self.OnReadonly, rt) menuBar = wx.MenuBar() menuBar.Append(menu, "Simple Menu") self.SetMenuBar(menuBar) self.Show() def OnInput(self, event): # 切换到输入模式 self.input_label.Show() self.input_ctrl.Show() self.readonly_label.Hide() self.readonly_ctrl.Hide() self.panel.Layout() # 更新面板布局 def OnReadonly(self, event): # 切换到只读模式 self.input_label.Hide() self.input_ctrl.Hide() self.readonly_label.Show() self.readonly_ctrl.Show() self.panel.Layout() # 更新面板布局 if __name__ == '__main__': app = wx.App() frame = MyFrame() app.MainLoop()
内容的提问来源于stack exchange,提问作者khalidel
相关产品推荐
相关产品推荐

