在 wxpython 中使用来自另一个面板的面板
Using a panel from another panel in wxpython
我是 wxpython 新手。
我创建了一些代码来生成拆分器 window,在左侧面板中我创建了一个列表框,在右侧面板中我创建了一个按钮。
我想要做的是,当我按下右侧面板中的按钮时,左侧面板中的列表显示字符串 "Hello World"。
我试过以下方法:
import wx
########################################################################
class LeftPanel(wx.Panel):
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent=parent)
self.lizt = wx.ListBox(self, -1, pos = wx.DefaultPosition, size = (300, 120), choices = "", style = wx.LB_SINGLE|wx.LB_HSCROLL|wx.LB_SORT, name = "aDB")
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.lizt, 0, wx.EXPAND)
self.SetSizer(sizer)
########################################################################
class RightPanel(wx.Panel):
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent=parent)
txt = wx.Button(self, wx.ID_ANY, "txt")
txt.SetLabel("ALL")
txt.Bind(wx.EVT_BUTTON, self.write, txt)
def write(self, event):
LeftPanel.lizt.Clear()
LeftPanel.lizt.Append("HELLO WORLD")
return
########################################################################
class MyForm(wx.Frame):
#----------------------------------------------------------------------
def __init__(self):
wx.Frame.__init__(self, None, title="Splitter Tutorial")
splitter = wx.SplitterWindow(self)
leftP = LeftPanel(splitter)
rightP = RightPanel(splitter)
# split the window
splitter.SplitVertically(leftP, rightP)
splitter.SetSashGravity(0.5)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(splitter, 1, wx.EXPAND)
self.SetSizer(sizer)
#----------------------------------------------------------------------
# Run the program
if __name__ == "__main__":
app = wx.App(False)
frame = MyForm()
frame.Show()
app.MainLoop()
但我收到此错误:AttributeError:类型对象 'LeftPanel' 没有属性 'lizt'
我做错了什么:(
提前致谢
您引用的是 'LeftPanel' class 而不是 class 的实例。在您创建 'LeftPanel' class 的实例之前,'lizt' 不存在。要从右面板引用左面板,您必须首先在主框架中创建对左面板的持久引用。
而不是
leftP = LeftPanel(splitter)
做
self.leftP = LeftPanel(splitter)
然后您必须从右侧面板的 'write' 方法中找到对左侧面板的引用。
parent = self.GetParent()
left_panel = parent.leftP
left_panel_list = left_panel.lizt
显然有更简单的方法来保存引用,您可以明确地将左侧面板的列表传递给右侧面板的 init 方法。或者更优选地将所有内容移动到框架的 init 方法并保存对框架实例的所有引用。作为一般提示,请记住 init 方法中的局部变量在 init 方法完成后消失,除非您明确将它们保存到 class。如果您打算稍后引用列表、面板等,请将引用保存到 class(self.leftP 而不仅仅是 leftP )
我是 wxpython 新手。
我创建了一些代码来生成拆分器 window,在左侧面板中我创建了一个列表框,在右侧面板中我创建了一个按钮。
我想要做的是,当我按下右侧面板中的按钮时,左侧面板中的列表显示字符串 "Hello World"。
我试过以下方法:
import wx
########################################################################
class LeftPanel(wx.Panel):
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent=parent)
self.lizt = wx.ListBox(self, -1, pos = wx.DefaultPosition, size = (300, 120), choices = "", style = wx.LB_SINGLE|wx.LB_HSCROLL|wx.LB_SORT, name = "aDB")
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.lizt, 0, wx.EXPAND)
self.SetSizer(sizer)
########################################################################
class RightPanel(wx.Panel):
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent=parent)
txt = wx.Button(self, wx.ID_ANY, "txt")
txt.SetLabel("ALL")
txt.Bind(wx.EVT_BUTTON, self.write, txt)
def write(self, event):
LeftPanel.lizt.Clear()
LeftPanel.lizt.Append("HELLO WORLD")
return
########################################################################
class MyForm(wx.Frame):
#----------------------------------------------------------------------
def __init__(self):
wx.Frame.__init__(self, None, title="Splitter Tutorial")
splitter = wx.SplitterWindow(self)
leftP = LeftPanel(splitter)
rightP = RightPanel(splitter)
# split the window
splitter.SplitVertically(leftP, rightP)
splitter.SetSashGravity(0.5)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(splitter, 1, wx.EXPAND)
self.SetSizer(sizer)
#----------------------------------------------------------------------
# Run the program
if __name__ == "__main__":
app = wx.App(False)
frame = MyForm()
frame.Show()
app.MainLoop()
但我收到此错误:AttributeError:类型对象 'LeftPanel' 没有属性 'lizt'
我做错了什么:(
提前致谢
您引用的是 'LeftPanel' class 而不是 class 的实例。在您创建 'LeftPanel' class 的实例之前,'lizt' 不存在。要从右面板引用左面板,您必须首先在主框架中创建对左面板的持久引用。
而不是
leftP = LeftPanel(splitter)
做
self.leftP = LeftPanel(splitter)
然后您必须从右侧面板的 'write' 方法中找到对左侧面板的引用。
parent = self.GetParent()
left_panel = parent.leftP
left_panel_list = left_panel.lizt
显然有更简单的方法来保存引用,您可以明确地将左侧面板的列表传递给右侧面板的 init 方法。或者更优选地将所有内容移动到框架的 init 方法并保存对框架实例的所有引用。作为一般提示,请记住 init 方法中的局部变量在 init 方法完成后消失,除非您明确将它们保存到 class。如果您打算稍后引用列表、面板等,请将引用保存到 class(self.leftP 而不仅仅是 leftP )