当前位置: 首页 > 知识库问答 >
问题:

wxpython中的派生面板类

景岳
2023-03-14

在我的wxpython程序中,面板的行为不同,这取决于我是将其作为派生类还是直接面板实例:

import wx

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

        hbox1 = wx.BoxSizer(wx.HORIZONTAL)
        panel1 = wx.Panel(parent)
        st1 = wx.StaticText(panel1, 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__':

    app = wx.App()
    Example(None, title='Example')
    app.MainLoop()

如果我按原样运行,它看起来很好。如果我运行它,注释掉创建panel1的四行,而不注释使用派生类创建panel1的行,则“some text”会被剪裁,只显示“sor”。当我制作一个非琐碎的程序时,更糟糕的事情就开始发生了。

共有1个答案

端木乐语
2023-03-14

问题出在育儿方面。问题是,在第一个示例中,statictext小部件的父级正确设置为panel1。在PanelWithText类中,将其父级设置为顶级面板,而不是panel类,这是不正确的。下面是一个固定的例子:

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()
 类似资料:
  • 问题内容: 在下面,我在框架内部有一个面板。为什么我不能画图?我只是得到一个纯白色的屏幕。如果我摆脱了面板并直接绘制到框架上,那是可行的。任何帮助,将不胜感激。 问题答案: 尝试将事件绑定到面板,而不是整个框架: 您的版本对我来说很有效(Windows),但它会不断重新绘制面板,以致使整个处理器吃光了。 来自文档: 请注意,在绘画事件处理程序中,即使不使用它,应用程序也必须始终创建wxPaintD

  • 这里有一个最小的例子来说明我遇到的问题。 模板成员显式专用于基类中的。模板的代码是显式生成的,并在成员中调用。 我发现的第一个问题是: 该错误是由于在main中调用造成的。可以通过调用来避免这种情况。为什么在的实例中显然是不可见的?

  • 问题内容: 我有这两个查询。我不知道如何将它们组合在一起以创建派生表。我想将第二个查询用作主查询,并在主查询的FROM子句中使用第一个查询。 问题答案: 您是否只想将结果放在同一张表中?只需执行以下操作:

  • 我有一个模板函数doSomething(T),它接受任何类型的参数…类型基类除外。 所以我把doSomething模板专门用于类型Base的参数,所以它做了一些不同的事情。 然而,当我将派生类传递给doSomething时,它会打印“所有类型!”,而我希望它打印“Base!”,因为派生类本质上也是一个基类。 如果我有: 然后doSomething(d)也会打印“所有类型!”而不是“base!”,因

  • 如果基类A有一个“public synchronized void method(){}”没有被它的派生类B重写,那么用来访问类B中的synchronized方法的锁是什么(即是派生类对象还是基类对象)?

  • 假设我有一个没有数据的类: 和派生类 Empty类的对象的大小为1。派生类的空部分的大小通常为0。据我所知,编译器看到基Empty类没有数据,因此它可以优化Empty的大小,以防它“在”Derived中,但标准并不要求这样做。 所以问题是: 我能在编译时确定Derived类的Empty部分并没有占用内存吗。 我知道我可以像一样进行检查...但它太冗长了,并且有几个类,如派生。有没有更优雅的解决方案