#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) Это был не мой опыт, но я упоминаю об этом, потому что они могут потребоваться в некоторых ситуациях.