wxpython中的派生面板类

Posted

技术标签:

【中文标题】wxpython中的派生面板类【英文标题】:Derived panel classes in wxpython 【发布时间】:2015-05-06 02:04:52 【问题描述】:

在我的 wxpython 程序中,面板的行为会有所不同,具体取决于我将其设为派生类还是直接面板实例:

导入 wx 类 PanelWithText(wx.Panel): def __init__(自我,父母): 超级(PanelWithText,自我).__init__(父) hbox1 = wx.BoxSizer(wx.HORIZONTAL) panel1 = wx.Panel(父) st1 = wx.StaticText(panel1, label='Some Text') hbox1.Add(st1) 类示例(wx.Frame): def __init__(self, parent, title): 超级(示例,自我).__init__(父,标题=标题, 大小=(390, 350)) 面板 = wx.Panel(self) vbox = wx.BoxSizer(wx.VERTICAL) hbox1 = wx.BoxSizer(wx.HORIZONTAL) # 从这里注释掉 panel1 = wx.Panel(panel) # st1 = wx.StaticText(panel1, label='Some Text') # hbox1.Add(st1) # 到这里 # panel1 = PanelWithText(面板) vbox.Add(panel1) panel.SetSizer(vbox) 自我中心() 自我展示() 如果 __name__ == '__main__': 应用程序 = wx.App() 示例(无,标题='示例') app.MainLoop()

如果我按原样运行它,它看起来不错。 如果我运行它,注释掉创建 panel1 的四行并取消注释使用派生类创建 panel1 的行,“一些文本”被剪裁,只显示“Sor”。当我编写一个不平凡的程序时,更糟糕的事情开始发生。

这两个在我看来是一样的。有什么区别?

我正在使用: Python 2.7.6 wxpython 3.0.0.0 Mac 优胜美地 10.10.2

【问题讨论】:

【参考方案1】:

问题在于养育子女。问题是在第一个示例中,您将StaticText 小部件的父级正确设置为panel1。在您的 PanelWithText 类中,您将其父级设置为***面板而不是面板类,这是不正确的。这是一个固定的例子:

import wx

class PanelWithText(wx.Panel):
    def __init__(self, parent):
        super(PanelWithText, self).__init__(parent)

        hbox1 = wx.BoxSizer(wx.HORIZONTAL)
        st1 = wx.StaticText(self, label='Some Text')
        hbox1.Add(st1)

class Example(wx.Frame):

    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title=title,
            size=(390, 350))

        panel = wx.Panel(self)

        vbox = wx.BoxSizer(wx.VERTICAL)

        #hbox1 = wx.BoxSizer(wx.HORIZONTAL)                  # comment out from here
        #panel1 = wx.Panel(panel)                            #
        #st1 = wx.StaticText(panel1, label='Some Text')      #
        #hbox1.Add(st1)                                      # to here
        panel1 = PanelWithText(panel)
        vbox.Add(panel1)

        panel.SetSizer(vbox)

        self.Centre()
        self.Show()

if __name__ == '__main__':
    import wx.lib.mixins.inspection
    app = wx.App()
    Example(None, title='Example')
    wx.lib.inspection.InspectionTool().Show()
    app.MainLoop()

【讨论】:

谢谢,这确实有效!为了向任何未来的读者详细说明解释(我花了几分钟才弄清楚),我的课程版本是创建第三个面板(一个在主框架中,一个作为类,一个在类内)和第三个搞砸了第二个。消除第三个面板并将文本引用到第二个面板解决了问题。 是的,您有很多嵌套面板。我能够使用小部件检查工具来解决这个问题,它向我展示了顶层有几个面板,而应该只有一个。你可能想看看那个方便的实用程序:wiki.wxpython.org/Widget%20Inspection%20Tool

以上是关于wxpython中的派生面板类的主要内容,如果未能解决你的问题,请参考以下文章

python入门wxpython

在 WxPython 面板中嵌入 Seaborn 图

为啥我的文本在 wxPython 中没有正确对齐?

取消绑定 wxPython 中的默认按钮行为

全屏 Python TKinter 或 wxPython 窗口,但“停留在所有窗口的底部”?

wxPython 和 STC 边距 - 顶部和底部