【问题标题】:Using a panel from another panel in wxpython在 wxpython 中使用来自另一个面板的面板
【发布时间】:2016-11-04 02:28:39
【问题描述】:

我是使用 wxpython 的新手。

我创建了一些代码来生成一个拆分窗口,在左侧面板中我创建了一个列表框,在右侧面板中我创建了一个按钮。

我想做的是,当我按下右侧面板中的按钮时,左侧面板中的列表显示字符串“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: type object 'LeftPanel' has no attribute 'lizt'

我做错了什么:(

提前致谢

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

    您引用的是“LeftPanel”类,而不是该类的实例。在您创建“LeftPanel”类的实例之前,“lizt”不存在。要从右面板引用左面板,您必须首先在主框架中创建对左面板的持久引用。

    而不是

    leftP = LeftPanel(splitter)
    

    self.leftP = LeftPanel(splitter)
    

    然后从右侧面板的“写入”方法中,您必须找到对左侧面板的引用。

    parent = self.GetParent()
    left_panel = parent.leftP
    left_panel_list = left_panel.lizt
    

    显然有更简单的方法来保存引用,您可以将左侧面板的列表显式传递给右侧面板的 init 方法。或者更优选将所有内容移动到框架的 init 方法并保存对框架实例的所有引用。作为一般提示,请记住,当 init 方法完成时,您的 init 方法中的局部变量会消失,除非您将它们显式保存到类中。如果您打算稍后引用列表、面板等,请保存对类的引用(self.leftP 而不仅仅是 leftP

    【讨论】:

    • 非常感谢您的回复 :) 我试过了,效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2011-10-31
    相关资源
    最近更新 更多