当控制参数更改时,如何“刷新” wxpython gui?

时间:2018-12-23 15:09:35

标签: python-3.x user-interface wxpython wxwidgets

假设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()

enter image description here

如您所见,button1和button2上的文本由变量self.prefix控制,我想在单击按钮Change Prefix时更改前缀。如何以最小的原始代码修改来实现?

我能想到的一种方法是将button1button2更改为self.button1self.button2,然后触发self.button1.SetValue()self.button2.SetValue()单击change prefix按钮时。我不喜欢这种方法,因为在我的实际产品中,有很多要管理的小部件,而不仅仅是两个。 我正在寻找一种re-initUI或非常简洁的方法,这可能吗?

还接受关闭窗口并打开窗口/框架的闪光。

2 个答案:

答案 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