在我的程序中,我有一个带有垂直盒子大小的笔记本,旁边有按钮。这些按钮对我在框架上的列表框执行了操作。但我将列表框移动到笔记本的标签中。如何使用不是笔记本的子项而是兄弟的按钮来操作选项卡的元素。这意味着列表框的变量不再在同一范围内。
这让我想到了问题的另一部分。如果我有两个并排的列表框,然后是一些按钮,我希望按钮可以对任何具有鼠标焦点的列表框进行操作。我怎么做到这一点?
我认为我的两个问题是相关的,但可能是错的。基本上我希望这些按钮能够对所选的任何标签或项目起作用。
一个小例子可以帮助我理解wxPython的这个元素。我到目前为止找到的文档和示例都遇到了问题。我知道它可能与工厂有关,但我不知道该怎么做,也找不到任何有用的例子。
我意识到我认为我无法理解的是传递给你绑定的函数的事件参数。你是如何解决这个问题的?你会怎么做?
由于
答案 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版本的工件,它启用了警告。