wxPython在焦点上扮演元素

时间:2015-05-29 19:55:55

标签: python wxpython

在我的程序中,我有一个带有垂直盒子大小的笔记本,旁边有按钮。这些按钮对我在框架上的列表框执行了操作。但我将列表框移动到笔记本的标签中。如何使用不是笔记本的子项而是兄弟的按钮来操作选项卡的元素。这意味着列表框的变量不再在同一范围内。

这让我想到了问题的另一部分。如果我有两个并排的列表框,然后是一些按钮,我希望按钮可以对任何具有鼠标焦点的列表框进行操作。我怎么做到这一点?

我认为我的两个问题是相关的,但可能是错的。基本上我希望这些按钮能够对所选的任何标签或项目起作用。

一个小例子可以帮助我理解wxPython的这个元素。我到目前为止找到的文档和示例都遇到了问题。我知道它可能与工厂有关,但我不知道该怎么做,也找不到任何有用的例子。

我意识到我认为我无法理解的是传递给你绑定的函数的事件参数。你是如何解决这个问题的?你会怎么做?

由于

1 个答案:

答案 0 :(得分:1)

这是一个有趣的小练习。基本上,您想要遍历当前所选选项卡的小部件,并检查列表框中选择的项目。

注意:正如我在您的问题评论中提到的那样,我看到的问题是列表框只有在您按下按钮之前才会有焦点。只要按下按钮,按钮本身就会有焦点。

这是一种方法:

import random
import wx

########################################################################
class TabPanel(wx.Panel):
    #----------------------------------------------------------------------
    def __init__(self, parent):
        """"""
        wx.Panel.__init__(self, parent=parent)

        colors = ["red", "blue", "gray", "yellow", "green"]
        self.SetBackgroundColour(random.choice(colors))

        lbox = wx.ListBox(self, choices=colors)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(lbox, 0, wx.ALL, 10)
        self.SetSizer(sizer)

########################################################################
class DemoFrame(wx.Frame):
    """
    Frame that holds all other widgets
    """

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""        
        wx.Frame.__init__(self, None, wx.ID_ANY, 
                          "Notebook Tutorial",
                          size=(600,400)
                          )
        panel = wx.Panel(self)
        self.tab_num = 3

        self.notebook = wx.Notebook(panel)
        tabOne = TabPanel(self.notebook)
        self.notebook.AddPage(tabOne, "Tab 1")

        tabTwo = TabPanel(self.notebook)
        self.notebook.AddPage(tabTwo, "Tab 2")

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.notebook, 1, wx.ALL|wx.EXPAND, 5)

        btn = wx.Button(panel, label="Get Color")
        btn.Bind(wx.EVT_BUTTON, self.addPage)
        sizer.Add(btn)

        panel.SetSizer(sizer)
        self.Layout()

        self.Show()

    #----------------------------------------------------------------------
    def addPage(self, event):
        """"""
        page = self.notebook.GetCurrentPage()
        for widget in page.GetChildren():
            if isinstance(widget, wx.ListBox):
                selection = widget.GetString(widget.GetSelection())
                if selection:
                    print "Current color = " + selection
                else:
                    print "No color selected"

#----------------------------------------------------------------------
if __name__ == "__main__":
    app = wx.App(False)
    frame = DemoFrame()
    app.MainLoop()

我确实在Xubuntu上遇到了一个恼人的错误,但我认为这是一个警告,它不会影响上面运行的代码。这就是我得到的:

python:12770): Gtk-CRITICAL **: IA__gtk_tree_model_iter_nth_child: assertion 'n >= 0' failed

我不相信这是值得担心的事情。它可能只是一个使用wxPython版本的工件,它启用了警告。