Как изменить отображение wx.Panel при его пересоздании?
В общем ситуация такая: я создаю окно с панелью, туда добавляю сайзеры с контентом и мне нужно, чтобы контент менялся при нажатии кнопки в меню.
Я ничего лучше не придумал, кроме как удалять исходную панель и пересоздать ее с новым контентом, но проблема в том, что при пересоздании панели контент нормально отображается только тогда, когда я меняю размер окна.
Я пробовал не пересоздавать панель, а создать новый сайзер и заменить им "старый" с помощью panel.SetSizer(), но там получается так, что контент нового просто накладывается поверх старого.
Подскажите пожалуйста как можно сделать так, чтобы панель нормально отображалась при пересоздании или если можно посоветуйте как изменить содержимое без пересоздания панели.
main.py
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super().__init__(parent, title='Some app')
menubar = wx.MenuBar()
fileMenu = wx.Menu()
open_item = fileMenu.Append(wx.ID_OPEN, "Открыть")
menubar.Append(fileMenu, "Файл")
self.SetMenuBar(menubar)
self.Bind(wx.EVT_MENU, self.onOpen, open_item)
#main frame content
self.panel = wx.Panel(self)
welcome_vbox = wx.BoxSizer(wx.VERTICAL)
greet_text = wx.StaticText(self.panel, style = wx.ALIGN_CENTER, label = 'Добро пожаловать')
greet_font = wx.Font(40, family = wx.FONTFAMILY_MODERN, style = 0, weight = 90,
underline = False, faceName ="", encoding = wx.FONTENCODING_DEFAULT)
greet_text.SetFont(greet_font)
welcome_vbox.Add(greet_text, flag = wx.CENTER)
self.panel.SetSizer(welcome_vbox)
def onOpen(self, event):
self.panel.Destroy()
self.panel = wx.Panel(self)
df_box = wx.BoxSizer(wx.HORIZONTAL)
text = wx.StaticText(self.panel, style = wx.ALIGN_CENTER, label = 'Some action')
df_box.Add(text, flag = wx.CENTER)
self.panel.SetSizer(df_box)
self.panel.Layout()
if __name__ == "__main__":
app = wx.App()
frame = MainFrame(None)
frame.Show()
app.MainLoop()
Ответы (1 шт):
Пересоздавать панель и сайзер не было необходимости, в сайзеры можно добавлять любые регионы, наследующиеся от wx.Window (в т.ч. панели с сайзером), через wx.Sizer.Add()
А после добавления обновляем панель через wx.Panel.Layout(), это перераспределит все дочерние регионы на панели.
main.py:
import wx
class MainFrame(wx.Frame):
def __init__(self, parent):
super().__init__(parent, title='Some app')
menubar = wx.MenuBar()
fileMenu = wx.Menu()
open_item = fileMenu.Append(wx.ID_OPEN, "Открыть")
menubar.Append(fileMenu, "Файл")
self.SetMenuBar(menubar)
self.Bind(wx.EVT_MENU, self.onOpen, open_item)
#main frame content
self.panel = wx.Panel(self)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.panel.SetSizer(self.sizer)
greet_text = wx.StaticText(self.panel, style = wx.ALIGN_CENTER, label = 'Добро пожаловать')
greet_font = wx.Font(40, family = wx.FONTFAMILY_MODERN, style = 0, weight = 90,
underline = False, faceName ="", encoding = wx.FONTENCODING_DEFAULT)
greet_text.SetFont(greet_font)
self.sizer.Add(greet_text, flag = wx.CENTER)
def onOpen(self, event):
# Добавляем любой элемент в сайзер и обновляем расположение элементов на панели
text = wx.StaticText(self.panel, style = wx.ALIGN_CENTER, label = 'Some action')
self.sizer.Add(text, flag = wx.CENTER)
self.panel.Layout()
if __name__ == "__main__":
app = wx.App()
frame = MainFrame(None)
frame.Show()
app.MainLoop()