Как мне полностью удалить кнопку в wxPython?

#python-3.x #wxpython

#python-3.x #wxpython

Вопрос:

РЕДАКТИРОВАТЬ: Windows, если это имеет значение

Мне: Довольно комфортно с самим Python, но весь мой опыт работы с пользовательским интерфейсом — это HTML / CSS / AJAX / PHP. Начал изучать wxPython буквально около 24 часов назад, поэтому, пожалуйста, будьте добры.

Проблема:

Для моего проекта мне нужно будет постоянно корректировать содержимое пользовательского интерфейса на основе проверяемых данных. Я добился некоторого прогресса в этом направлении, но я упираюсь в стену, когда дело доходит до удаления кнопки. Есть два способа приблизиться к этому, и я не могу понять, как это сделать.

Подход 1 заключается в удалении кнопки. Это представлено в приведенном ниже коде, и это вроде как работает, но там, где раньше была кнопка, есть большая дыра.

Подход 2 заключается в том, чтобы стереть интерфейс и перестроить его с нуля. Это может быть излишним для этой конкретной проблемы, но это то, что мне нужно будет сделать для моего проекта. Код не опубликован, потому что все, что я пытаюсь, приводит либо к отсутствию эффекта, пользовательский интерфейс становится темно-серым, приложение закрывается, либо никакого эффекта, кроме маленького квадрата, появляющегося в верхнем левом углу пользовательского интерфейса.

У меня такое чувство, что я упускаю что-то очевидное здесь, но Google не помогает; я, по-видимому, неправильно формулирую это, потому что все, что я получаю, это то, как это сделать, как показано ниже, или ситуации, совершенно не связанные с тем, что я делаю.

 import wx

class TinkerFrame( wx.Frame ):
    
    def __init__(self):
    
        super().__init__(parent=None, title='Sandbox')
        
        self.panel = wx.Panel(self)
        self.sizer = wx.BoxSizer(wx.VERTICAL)  
        
        self.buttons  = {}
        
        self.buttons['one'] = wx.Button(self.panel, label='Press Me')
        self.buttons['one'].Bind( wx.EVT_BUTTON, self.buttonPressed1)
        
        self.buttons['two'] = wx.Button(self.panel, label='No, Press Me!')
        self.buttons['two'].Bind( wx.EVT_BUTTON, self.buttonPressed2) 
        
        self.buttons['three'] = wx.Button(self.panel, label='Don't Touch Me' )
        self.buttons['three'].Bind( wx.EVT_BUTTON, self.buttonPressed3)

        for thisbutton in self.buttons:
            self.sizer.Add( self.buttons[thisbutton], 0, wx.ALL | wx.CENTER, 5 )
            
        self.panel.SetSizer(self.sizer)
        self.Show()
        
    def buttonPressed1(self, event):
        print( 'Congrats.  You can press a button.  Mom would be so proud.' )
        
    def buttonPressed2(self, event):
        print( 'Oooooo, two buttons.  Careful not to overheat your CPU!' )
        
    def buttonPressed3(self, event):
        self.buttons['one'].SetLabel( 'OW' )
        self.buttons['one'].Bind( wx.EVT_BUTTON, self.buttonPressed4)
        
        self.buttons['two'].Hide()
        self.buttons['two'].Destroy()
        
        self.buttons['three'].SetLabel( 'HEY!' )
        self.buttons['three'].Bind( wx.EVT_BUTTON, self.buttonPressed5)
        
    def buttonPressed4(self, event):
        print( 'You shouldn't oughta done that mister.' )
        
    def buttonPressed5(self, event):
        print( 'WHAT DID I SAY???' )
        
        
        
if __name__ == '__main__':
    app = wx.App()
    frame = TinkerFrame()
    app.MainLoop()
  

Ответ №1:

В wxPython макет виджета будет сброшен при изменении размера события. Вы можете запустить событие, изменив размер окна, а затем изменив его обратно.

Попробуйте этот код для обработчика кнопки:

 def buttonPressed3(self, event):
    self.buttons['one'].SetLabel( 'OW' )
    self.buttons['one'].Bind( wx.EVT_BUTTON, self.buttonPressed4)
    
    self.buttons['two'].Hide()
    self.buttons['two'].Destroy()
    
    self.buttons['three'].SetLabel( 'HEY!' )
    self.buttons['three'].Bind( wx.EVT_BUTTON, self.buttonPressed5)
    
    sz = self.GetSize()
    self.SetSize((sz[0], sz[1] 1)) # shift height 1 pixel
    self.SetSize(sz)   # shift back
    if self.IsMaximized():
        self.Maximize(False)
        self.Maximize(True)
  

Ответ №2:

Добавлено следующее в конец buttonPressed3.

 self.sizer.Layout()
  

Сообщение на форуме, в котором содержался этот совет, также говорило об этом самостоятельно.Update() и / или self.Потребуется обновить(). («self» в данном контексте является wxFrame) Это был не мой опыт, но я упоминаю об этом, потому что они могут потребоваться в некоторых ситуациях.