创建后按钮消失

Buttons disappearing after creation

我需要在每次事件发生时以编程方式创建一个按钮。我通过 pubsub 接到了电话,按钮已创建,但之后立即消失(在面板上闪烁)。

class panel_one (wx.Panel) :

def __init__(self, parent) :
    """Constructor"""
    super().__init__(parent)
    pub.subscribe(self.my_listener, "panel_listener")
    self.btns = 1
    self.new_btn = ''
    wx.Panel.__init__ (self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size (1280, 150),
                       style=wx.TAB_TRAVERSAL)

    self.sbSizer4 = wx.StaticBoxSizer (wx.StaticBox (self, wx.ID_ANY, u"label"), wx.HORIZONTAL)

    self.m_button24 = wx.Button (self.sbSizer4.GetStaticBox (), wx.ID_ANY, u"Tech", wx.DefaultPosition,
                                 wx.Size (100, 100), 0)
    self.m_button24.Bind(wx.EVT_BUTTON, self.ShowTech)
    self.sbSizer4.Add (self.m_button24, 0, wx.ALL, 5)

    self.m_button241 = wx.Button (self.sbSizer4.GetStaticBox (), wx.ID_ANY, u"Info", wx.DefaultPosition,
                                  wx.Size (100, 100), 0)
    self.m_button241.Bind(wx.EVT_BUTTON, self.ShowInfo)
    self.sbSizer4.Add (self.m_button241, 0, wx.ALL, 5)

    self.SetSizer (self.sbSizer4)
    self.Layout ()

def my_listener(self, message):
    self.ButtonPost(message)

def ButtonPost(self, label) :
    self.new_btn = wx.Button (self.sbSizer4.GetStaticBox (), wx.ID_ANY, label, wx.DefaultPosition,
                                  wx.Size (100, 100))
    self.new_btn.Show()
    self.btns += 1
    self.sbSizer4.Add(self.new_btn, 0, wx.CENTER|wx.ALL, 5)
    self.sbSizer4.Layout()

我尝试刷新 and/or 更新面板 and/or 框架。

有什么想法吗?

编辑: 所以我做了一件事,我用另一个按钮手动创建它们,尝试调用监听器和/或它调用的函数。结果:

class panel_three (wx.Panel) :
# TECH
def __init__(self, parent) :
    super().__init__(parent)
    pub.subscribe(self.my_listener, "switch_panel")
    pub.subscribe(self.my_listener1, "new_call")
    wx.Panel.__init__ (self, parent, id=wx.ID_ANY, pos=(0, 150), size=wx.Size (1280, 874),
                       style=wx.TAB_TRAVERSAL)
    self.bSizer10 = wx.BoxSizer(wx.HORIZONTAL)
    self.testtrigger = wx.Button(self, wx.ID_ANY, u"MANUAL", wx.DefaultPosition,
                                 wx.Size (100, 50), 0)
    self.bSizer10.Add(self.testtrigger, 0, wx.ALL, 5)
    self.testtrigger.Bind(wx.EVT_BUTTON, lambda event: self.my_listener1('manually\ncreated'))
    self.SetSizer(self.bSizer10)
    self.Layout()

def ButtonPost(self, label) :
    new_btn = wx.Button(self, wx.ID_ANY, label, wx.DefaultPosition,
                                 wx.Size (100, 50), 0)
    self.bSizer10.Add(new_btn, 0, wx.ALL, 5)
    self.bSizer10.Layout()
    self.Update()

def my_listener(self, message):
    self.SwitchPanel(message)

def my_listener1(self, message):
    self.ButtonPost(message)

def SwitchPanel(self, which):
    if which == 'TECH':
        self.Show()
    else:
        self.Hide()

所以重复一下:

当我在框架 A 中按下一个按钮时,它会触发一个事件来执行一系列操作,其中应该在框架 B 中创建一个具有特定名称的按钮,通过 pypubsub 进行通信。

问题:

事件被触发,pypubsub 事件从 A 帧发送,在 B 帧接收,创建按钮并立即消失。

发布到 pypubsub 是从一个由按钮触发的处理程序中调用的,例如:

def handler(self, event):
    # do some stuff
    self.postnewbutton(self, arg1, arg2)
    # do some other stuff

解决方法:

我可以直接创建另一个绑定到按钮并使函数以其他方式获取参数,或者只是在线程处理程序中为其创建一个新线程。

我现在意识到我的设计有多么糟糕。