You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:18:31