假设Buttons的默认文本,wxpython GUI的StaticText由一个(或多个)参数控制,我想在更改参数时更改外观。这是一个简单的示例:
import wx
class Example(wx.Frame):
def __init__(self, title):
super().__init__(None, title=title)
self.panel = wx.Panel(self)
self.prefix = "Prefix-Alpha"
self.initUI()
self.Centre()
def initUI(self):
sizer = wx.GridSizer(3, 1, 10, 10)
self.create_button1(sizer)
self.create_button2(sizer)
self.create_button3(sizer)
self.panel.SetSizer(sizer)
def create_button1(self, sizer):
button1 = wx.Button(self.panel, label=self.prefix + "-Button 1")
sizer.Add(button1, 1, wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
def create_button2(self, sizer):
button2 = wx.Button(self.panel, label=self.prefix + "-Button 2")
sizer.Add(button2, 1, wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
def create_button3(self, sizer):
button3 = wx.Button(self.panel, label="Change Prefix")
sizer.Add(button3, 1, wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
button3.Bind(wx.EVT_BUTTON, self.on_change_prefix)
def on_change_prefix(self, e):
if self.prefix == "Prefix-Alpha":
self.prefix = "Prefix-Beta"
else:
self.prefix = "Prefix-Alpha"
# how to change the appearance of button1 and button2?
if __name__ == '__main__':
app = wx.App()
Example("Simple Example").Show()
app.MainLoop()
如您所见,button1和button2上的文本由变量self.prefix
控制,我想在单击按钮Change Prefix
时更改前缀。如何以最小的原始代码修改来实现?
我能想到的一种方法是将button1
和button2
更改为self.button1
和self.button2
,然后触发self.button1.SetValue()
和self.button2.SetValue()
单击change prefix
按钮时。我不喜欢这种方法,因为在我的实际产品中,有很多要管理的小部件,而不仅仅是两个。 我正在寻找一种re-initUI
或非常简洁的方法,这可能吗?
还接受关闭窗口并打开窗口/框架的闪光。
答案 0 :(得分:1)
要对多个窗口小部件进行更改,您应该创建一个列表来保存对它们的引用。在这个简单的示例中,这可以通过创建一个新的列表对象并使创建按钮的方法返回按钮来实现。然后在处理程序中,遍历按钮并更新其标签:
import wx
class Example(wx.Frame):
def __init__(self, title):
super().__init__(None, title=title)
self.panel = wx.Panel(self)
self.prefix = "Prefix-Alpha"
self.initUI()
self.Centre()
def initUI(self):
sizer = wx.GridSizer(3, 1, 10, 10)
# create a list to hold the buttons
self.buttons = []
self.buttons.append(self.create_button1(sizer))
self.buttons.append(self.create_button2(sizer))
self.create_button3(sizer)
self.panel.SetSizer(sizer)
def create_button1(self, sizer):
button1 = wx.Button(self.panel, label=self.prefix + "-Button 1")
sizer.Add(button1, 1, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND)
# return the button so it can be apppended to the list
return button1
def create_button2(self, sizer):
button2 = wx.Button(self.panel, label=self.prefix + "-Button 2")
sizer.Add(button2, 1, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND)
# return the button so it can be apppended to the list
return button2
def create_button3(self, sizer):
button3 = wx.Button(self.panel, label="Change Prefix")
sizer.Add(button3, 1, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND)
button3.Bind(wx.EVT_BUTTON, self.on_change_prefix)
def on_change_prefix(self, e):
if self.prefix == "Prefix-Alpha":
self.prefix = "Prefix-Beta"
else:
self.prefix = "Prefix-Alpha"
# set the button labels
for index, btn in enumerate(self.buttons):
btn.SetLabel(f"{self.prefix}-Button {index + 1}")
if __name__ == '__main__':
app = wx.App()
Example("Simple Example").Show()
app.MainLoop()
答案 1 :(得分:1)
只需在children
的{{1}}中循环,确保每个孩子都是一个按钮。
下面,我使用按钮上的self.panel
参数保留按钮后缀,您可能会找到更好的方法。
name