wxPython 作用于具有焦点的元素
wxPython Acting on Element with Focus
在我的程序中,我有一个笔记本,上面有一个垂直的盒子大小测量器,旁边有按钮。这些按钮对框架上的列表框执行操作。但是我将列表框移到了笔记本的选项卡中。我如何使用不是笔记本子项而是兄弟项的按钮对选项卡的元素进行操作。这意味着列表框的变量不再在同一范围内。
这让我想到了问题的另一部分。如果我有两个并排的列表框,然后是一些按钮,我希望这些按钮作用于具有鼠标焦点的列表框。我将如何实现这一目标?
我假设我的两个问题是相关的,但可能是错误的。基本上,我希望这些按钮能够作用于所选的任何选项卡或项目。
一个小例子会奇迹般地帮助我理解 wxPython 的这个元素。到目前为止,我在使用文档和示例时遇到了问题。我知道这可能与工厂有关,但我不确定该怎么做,也找不到任何有效的例子。
我意识到我认为我无法理解的是传递给您绑定的函数的事件参数。这就是你解决问题的方式吗?你会怎么做?
谢谢
这是一个有趣的小练习。基本上,您想要遍历当前所选选项卡的小部件并检查列表框中选择了哪个项目。
注意:正如我在对您的问题的评论中提到的,我看到的问题是列表框只有在您按下按钮的那一刻才有焦点。只要按下按钮,按钮本身就有了焦点。
这是一种方法:
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 版本的产物。
在我的程序中,我有一个笔记本,上面有一个垂直的盒子大小测量器,旁边有按钮。这些按钮对框架上的列表框执行操作。但是我将列表框移到了笔记本的选项卡中。我如何使用不是笔记本子项而是兄弟项的按钮对选项卡的元素进行操作。这意味着列表框的变量不再在同一范围内。
这让我想到了问题的另一部分。如果我有两个并排的列表框,然后是一些按钮,我希望这些按钮作用于具有鼠标焦点的列表框。我将如何实现这一目标?
我假设我的两个问题是相关的,但可能是错误的。基本上,我希望这些按钮能够作用于所选的任何选项卡或项目。
一个小例子会奇迹般地帮助我理解 wxPython 的这个元素。到目前为止,我在使用文档和示例时遇到了问题。我知道这可能与工厂有关,但我不确定该怎么做,也找不到任何有效的例子。
我意识到我认为我无法理解的是传递给您绑定的函数的事件参数。这就是你解决问题的方式吗?你会怎么做?
谢谢
这是一个有趣的小练习。基本上,您想要遍历当前所选选项卡的小部件并检查列表框中选择了哪个项目。
注意:正如我在对您的问题的评论中提到的,我看到的问题是列表框只有在您按下按钮的那一刻才有焦点。只要按下按钮,按钮本身就有了焦点。
这是一种方法:
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 版本的产物。