.PY文件中有多少个类

时间:2011-11-06 15:38:35

标签: python wxpython

我正在学习 Python WxPython 。到目前为止,我正在关注AnotherTutorial中的示例,这些示例主要与wxPython相关 我正在尝试理解以下代码:

import wx

class MyMenu(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(380, 250))

        menubar = wx.MenuBar()
        file = wx.Menu()
        edit = wx.Menu()
        help = wx.Menu()
        file.Append(101, '&Open', 'Open a new document')
        file.Append(102, '&Save', 'Save the document')
        file.AppendSeparator()
        quit = wx.MenuItem(file, 105, '&Quit\tCtrl+Q', 'Quit the Application')
        quit.SetBitmap(wx.Image('stock_exit-16.png',wx.BITMAP_TYPE_PNG).ConvertToBitmap())
        file.AppendItem(quit)
        edit.Append(201, 'check item1', '', wx.ITEM_CHECK)
        edit.Append(202, 'check item2', kind=wx.ITEM_CHECK)
        submenu = wx.Menu()
        submenu.Append(301, 'radio item1', kind=wx.ITEM_RADIO)
        submenu.Append(302, 'radio item2', kind=wx.ITEM_RADIO)
        submenu.Append(303, 'radio item3', kind=wx.ITEM_RADIO)
        edit.AppendMenu(203, 'submenu', submenu)
        menubar.Append(file, '&File')
        menubar.Append(edit, '&Edit')
        menubar.Append(help, '&Help')
        self.SetMenuBar(menubar)
        self.Centre()
        self.Bind(wx.EVT_MENU, self.OnQuit, id=105)

    def OnQuit(self, event):
        self.Close()

class MyApp(wx.App):
    def OnInit(self):
        frame = MyMenu(None, -1, 'menu2.py')
        frame.Show(True)
        return True

app = MyApp(0)
app.MainLoop()

主要是第38行以后让我困惑,因为它定义了另一个类MyApp。这不应该是CLASS类型的单独.PY模块,然后实例化MyMenu类吗?我正在使用Eclipse,按原样键入整个代码并且厌倦了运行它但得到了错误消息

Traceback (most recent call last):
File "C:\ws2\sample2\simple_gui\menu2.py", line 54, in <module>
    app = MyApp(0)
File "C:\Python27\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 7981, in __init__
    self._BootstrapApp()
File "C:\Python27\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 7555, in _BootstrapApp
    return _core_.PyApp__BootstrapApp(*args, **kwargs)
File "C:\ws2\sample2\simple_gui\menu2.py", line 50, in OnInit
    frame = MyMenu(None, -1, 'menu2.py')
File "C:\ws2\sample2\simple_gui\menu2.py", line 36, in __init__
    menubar.Append(menu_file,'&Edit')
File "C:\Python27\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 11320, in Append
    return _core_.MenuBar_Append(*args, **kwargs)
wx._core.PyAssertionError: C++ assertion "!m_menuBar" failed at ..\..\src\common\menucmn.cpp(820) in wxMenuBase::Attach(): attaching menu twice?

有人可以解释为什么在同一个py模块中会有2个类吗? (注意我是一个菜鸟所以假设OOP的入门级知识)。 我让它在我的机器上工作。但我真的想了解代码在做什么,尤其是app = MyApp(0)行。这是做什么的?什么是零,为什么不是像3这样的另一个数字,或者像“你好”这样的文本。

2 个答案:

答案 0 :(得分:3)

如果您习惯使用Java,您知道每个文件只能有一个公共类,并且它应该与文件本身具有相同的名称(对不起,如果这已经改变;当我使用Java时就是如此;) 。当javac正在编译程序时,它可以在其他文件中找到依赖但尚未编译的类。

Python实际上做了非常相似的事情 - 每个文件都有一个模块,并且该模块与文件具有相同的名称。您没有注意到,因为您没有明确声明模块,但是如果您这样做

foo.py

class A:
    pass

bar.py

import foo
print(foo.A())

您可以看到foo已自动成为模块。

所以它几乎是一样的,只是Python不像Java那样以类为中心,因此它使用模块作为分解文件的主要单元。

所以回答你的问题,是的,在一个文件中拥有所需数量的类是完全可以的,因为它们都在同一个模块中。

答案 1 :(得分:0)

每个文件有一个(Frame或Panel)类是wxPython编码的典型。 通常,您构建框架时不会提供任何特殊功能,然后在另一个模块中将其子类化。这样,特别是当您使用像wxGlade这样的gui buiding工具时,您可以修改gui,甚至可以为代码添加新的小部件。

文件中的第二个App类也是wxPython的典型,其中通常将分隔的应用程序详细信息包含在内。

也就是说,在Python中,每个模块可以拥有尽可能多的clases。你有1或5取决于模块的功能完整性以及与这些类有关的功能。

在任何情况下,当模块增长到超过500-1000行时,将其内容拆分到不同的文件中可能是个好主意。

最后,正如上面评论的那样,你的代码在win7 64位中使用wxpython 2.8非常适合我。 (我只需要评论Set Bitmap行,因为我没有那个图像)

修改:你是对的。实例化Application对象时,将创建MyMenu框架,然后应用程序进入其MainLoop。 App(值)用于将应用程序输出定向到某些地方:

App(0) <-> App(False) <-> App(redirect=False)  -> output to shell (i.e stderr, stdout)
App(1) <-> App(True) <-> App(redirect=True)    -> output to an application Frame

如果您设置了参数文件名,则使用App(1),然后您将输出发送到文件 来自wx.App.__doc__

  

param重定向:应sys.stdoutsys.stderr       重定向?在Windows和Mac上默认为True,为False       除此以外。如果filename为None,则输出为       重定向到根据需要弹出的窗口。 (您可以       控制为输出创建什么样的窗口       将类变量outputWindowClass重置为a       你选择的课程。)

wx.App的签名:

wx.App(redirect=True, filename=None, useBestVisual=False, clearSigInt=True)