【问题标题】:Generate wxPython widget groups from lists从列表生成 wxPython 小部件组
【发布时间】:2011-11-16 16:39:39
【问题描述】:

这是让我非常沮丧的问题之一,因为我确信答案就在那里,我只是无法正确地用词搜索。基本上我是 GUI 编程的新手(做过大量的嵌入式 C/C++)并开始学习 wxPython。

我正在制作一个应用程序来读取和写入配置文件。所以我有一个 StaticText 来显示要读取/写入的参数的名称,一个 TextCtrl 来显示值并允许用户输入,然后是一个 Get 按钮和一个 Set 按钮。我将所有这些统称为“一组”小部件。对于这个应用程序,显然这个组会重复几次。与其手动编写和维护所有代码,我认为简单地拥有一个我希望能够编辑的配置参数列表会更容易,然后遍历列表并生成这个“组”的实例列表中每个项目的小部件。我让它工作了,除了一件事:我必须将所有的 Get 按钮绑定到同一个函数。设置按钮也是如此。在这些函数中是否有任何方法可以知道按下了哪个 Get 或 Set 按钮,从而在配置文件中查找和编辑哪个参数?我确信有一种方法可以使用父母或 ID 或其他东西来做到这一点,但我对 OOP 太陌生了。

【问题讨论】:

    标签: python linux user-interface wxpython wxwidgets


    【解决方案1】:

    我假设get按钮从配置文件中读取参数值并显示该值。

    为什么每个参数都需要一个获取按钮?我只需要一个获取按钮即可。当用户点击获取按钮时,从文件中读取每个参数并更新所有显示。

    设置按钮的类似方法。一个为他们所有的设置按钮 - 当按下按钮时,每个输入了新值的参数都会在配置文件中更新。用户未输入新值的参数将保留其先前的值。

    这种方案更容易编码,对用户来说也更容易。

    但是,我真的建议您查看wxPropertyGrid 小部件。这有可能让您的生活更轻松!这是一个屏幕截图,显示了一个在行动中

    【讨论】:

    • 还没有足够的代表,但是当我这样做时,我会回来(:
    【解决方案2】:

    在按钮的事件处理程序中,您可以执行以下操作:

    btn = event.GetEventObject()
    btn.GetId()
    btn.GetName()
    

    然后,您只需使用 If 语句根据您想要使用的任何信息来决定要做什么。注意:您可以在创建按钮时设置按钮的名称,如下所示:

    setBtn = wx.Button(self, label="Set", name="SetX")
    

    您可能会发现这篇关于 wxPython 和 ConfigObj 的文章也很有帮助:http://www.blog.pythonlibrary.org/2010/01/17/configobj-wxpython-geek-happiness/

    【讨论】:

    • 后续问题:确定点击了哪个按钮后,如何访问相应的文本框来读取/写入值?有没有办法存储指向我正在使用的文本框的指针列表,然后遍历该列表并比较每个文本框的名称,直到找到正确的?
    • 我不认为按钮支持客户端数据,所以你最好创建一个字典并使用按钮的唯一名称映射到文本控件。像 self.myDict = {"firstBtn":firstTxt} 这样的东西。然后你可以只使用按钮的名称来映射到文本控件。
    【解决方案3】:

    您可以从wx.Button 派生您自己的类并向其添加一个或多个属性,以使按钮记住您想要的任何信息。

    您可以在回调函数调用期间使用此存储的信息。比如:

    import wx
    
    L = [("1", "One"), ("2", "Two"), ("3", "Three")]
    
    # =====================================================================
    class MemoryButton(wx.Button):
        def __init__(self, memory, *args, **kwargs):
            wx.Button.__init__(self, *args, **kwargs)
            self.memory = memory
    
    # =====================================================================
    class MainWindow(wx.Frame):
        def __init__(self, *args, **kwargs):
            wx.Frame.__init__(self, *args, **kwargs)
    
            self.panel = wx.Panel(self)
            self.buttons = []
            for description in L:
                button = MemoryButton(memory=description[1], parent=self.panel,
                                      label=description[0])
                button.Bind(wx.EVT_BUTTON, self.OnMemoryButton)
                self.buttons.append(button)
    
            self.sizer = wx.BoxSizer()
            for button in self.buttons:
                self.sizer.Add(button)
    
            self.panel.SetSizerAndFit(self.sizer)  
            self.Show()
    
        # -----------------------------------------------------------------
        def OnMemoryButton(self, e):
            print("Clicked '%s'" % e.GetEventObject().memory)
    
    # =====================================================================
    app = wx.App(False)
    win = MainWindow(None)
    app.MainLoop()
    

    或者:

    import wx
    
    L = [("1", "One"), ("2", "Two"), ("3", "Three")]
    
    # =====================================================================
    class MemoryButton(wx.Button):
        def __init__(self, memory, *args, **kwargs):
            wx.Button.__init__(self, *args, **kwargs)
            self.memory = memory
    
        def OnButton(self, e):
            print("Clicked '%s'" % self.memory)
    
    # =====================================================================
    class MainWindow(wx.Frame):
        def __init__(self, *args, **kwargs):
            wx.Frame.__init__(self, *args, **kwargs)
    
            self.panel = wx.Panel(self)
            self.buttons = []
            for description in L:
                button = MemoryButton(memory=description[1], parent=self.panel,
                                      label=description[0])
                button.Bind(wx.EVT_BUTTON, button.OnButton)
                self.buttons.append(button)
    
            self.sizer = wx.BoxSizer()
            for button in self.buttons:
                self.sizer.Add(button)
    
            self.panel.SetSizerAndFit(self.sizer)  
            self.Show()
    
    # =====================================================================
    app = wx.App(False)
    win = MainWindow(None)
    app.MainLoop()
    

    【讨论】:

      猜你喜欢
      • 2019-11-18
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多