Как «обновить» графический интерфейс wxpython при изменении управляющего параметра? - PullRequest
0 голосов
/ 23 декабря 2018

Предположим, что текст по умолчанию для кнопок, StaticText из wxpython GUI регулируется параметром (или параметрами), я хочу изменить внешний вид при изменении параметра (-ов).Вот простой пример:

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.Как мне добиться этого с минимальной модификацией исходного кода?

Один из способов, который я могу себе представить, это изменить button1 и button2 на self.button1 и self.button2, а затем вызвать self.button1.SetValue() и self.button2.SetValue() при нажатии кнопки change prefix.Мне не нравится этот метод, потому что в моем реальном производстве есть много виджетов для управления, а не только два. Я ищу способ только re-initUI или что-то очень краткое, это возможно?

Вспышка закрытия и открытия окна / рамки также принимается.

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Просто прокрутите children из self.panel, чтобы каждый дочерний элемент представлял собой кнопку.
Ниже я использую параметр name на кнопке, чтобы сохранить суффикс кнопки, вы можете найти лучший метод.

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", name="-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", name="-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"
        children = self.panel.GetChildren()
        for child in children:
            if child.ClassName == "wxButton":
                if child.Name.startswith("-Button"):
                    child.SetLabel(self.prefix+child.Name)

if __name__ == '__main__':
    app = wx.App()
    Example("Simple Example").Show()
    app.MainLoop()
0 голосов
/ 23 декабря 2018

Чтобы внести изменения в несколько виджетов, вы должны составить список для хранения ссылок на них.В этом простом примере это может быть реализовано путем создания нового объекта списка и использования методов, которые создают кнопки, для возврата кнопок.Затем в вашем обработчике переберите кнопки и обновите их метки:

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()
...