【问题标题】:Inheritance, Python and wxWidget继承、Python 和 wxWidget
【发布时间】:2026-01-01 18:45:02
【问题描述】:

我正在尝试使用 Python 创建 GUI。我已经下载了 wxPython 并制作了一个“hello world”窗口。但是,我发现我的代码与其他代码示例有些不同。特别是,当其他示例想要创建 GUI 时,它们从 wx 库继承,而我没有,那么我的类和其他类有什么区别?

我的源代码:

import wx
class Window ():
    def init (self, parent, id, windowname):
        mywindow = wx.Frame (parent, id, windowname)
        mywindow.Show(True)
        return True 

app = wx.App(False)
wind = Window()
wind.init(None, wx.ID_ANY, "windowname")
t.oninit("Hello World" , "watch")
app.MainLoop()

书中的示例源代码:

import wx
class App(wx.App):
    def OnInit(self):
        frame = wx.Frame(parent=None, title='Bare')
        frame.Show()
        return True

app = App()
app.MainLoop()

【问题讨论】:

    标签: python inheritance wxpython


    【解决方案1】:

    这是正确的做法:

    import wx
    class Window(wx.Frame):
        def __init__ (self, parent, id, windowname):
            mywindow = wx.Frame (parent, id, windowname)
            mywindow.Show(True)
    
    
    app = wx.App(False)
    wind = Window(None, -1, "windowname")
    app.MainLoop()
    

    正如其他人所说,将类实例命名为“Window”没有任何意义。您必须从 wx.Frame 子类化才能正确执行此操作。事实上,我不会称它为“Window”,因为实际上有一个名为“wx.Window”的更高级别的小部件,它可能会在以后引起您的混淆。

    您应该阅读 zetcode wxPython 教程:http://zetcode.com/wxpython/,也许可以查看 wxPython 演示、wiki 或我的博客中的一些示例:http://www.blog.pythonlibrary.org/

    您还应该添加一个 wx.Panel 实例作为框架的唯一子项,以使其在所有系统上看起来都正确并启用小部件之间的选项卡。

    【讨论】:

      【解决方案2】:

      wx.App 类有一个名为OnInit() 的方法,该方法在应用程序初始化时调用。第二个代码块使用自定义代码覆盖该方法,即显示框架的代码。

      您的代码没有这样做,这可能就是您遇到问题的原因。

      【讨论】:

        【解决方案3】:

        称它为 Window 并不能使它成为一体!

        通过从 wx 类继承,您可以获得它们所有预先存在的功能 - 在示例中,App 类继承了 wx.App 类的所有结构和行为,即它已经知道如何做很多事情(比如如何启动、如何处理输入事件、如何在被告知时关闭等)。

        您的 from-scratch 类不继承任何东西 - 除了您定义的内容之外,它没有任何逻辑,这不足以使其真正“像”一个窗口。

        【讨论】: