Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一个.PY文件中有多少个类_Python_Wxpython - Fatal编程技术网

Python 一个.PY文件中有多少个类

Python 一个.PY文件中有多少个类,python,wxpython,Python,Wxpython,我正在学习Python和WxPython。到目前为止,我正在遵循中的示例,这些示例主要与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)) menuba

我正在学习Python和WxPython。到目前为止,我正在遵循中的示例,这些示例主要与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。这不应该是一个单独的.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?
回溯(最近一次呼叫最后一次):
文件“C:\ws2\sample2\simple\u gui\menu2.py”,第54行,在
app=MyApp(0)
文件“C:\Python27\lib\site packages\wx-2.8-msw-unicode\wx\\ u core.py”,第7981行,在uu init中__
self._BootstrapApp()
文件“C:\Python27\lib\site packages\wx-2.8-msw-unicode\wx\\ u core.py”,第7555行,在BootstrapApp中
返回_core_uu.PyApp_uuubootstrapapp(*args,**kwargs)
文件“C:\ws2\sample2\simple\u gui\menu2.py”,第50行,在OnInit中
frame=MyMenu(无,-1,'menu2.py')
文件“C:\ws2\sample2\simple\u gui\menu2.py”,第36行,在uu init中__
menubar.Append(菜单文件“&Edit”)
文件“C:\Python27\lib\site packages\wx-2.8-msw-unicode\wx\\ u core.py”,第11320行,在附录中
返回_core_.MenuBar_Append(*args,**kwargs)
WX.Cy.PyAsExrsialError:C++断言“.MyMunuBar”在.xxMeNux:::AddioType()中附加了.\\sRC\Cuult\MeNuCnM.CPP(820):两次附加菜单?
有人能解释一下为什么在同一个py模块中会有两个类吗?(注意,我是一个noob,所以假设我具备OOP的入门级知识)。
我让它在我的机器上工作。但是我真的在试图理解代码在做什么,特别是app=MyApp(0)行。这有什么用?零代表什么,为什么不是另一个数字(如3)或文本(如“hello”)。

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

Python实际上做了一些非常类似的事情——每个文件有一个模块,该模块与文件同名。您没有注意到,因为您没有显式地声明模块,但是如果您这样做了

foo.py:

bar.py:

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

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


因此,为了回答您的问题,是的,在一个文件中有您想要的任意多个类是完全可以的,因为它们都在同一个模块中。

如果您习惯Java,您知道每个文件只能有一个公共类,并且它应该与文件本身具有相同的名称(很抱歉,如果发生了更改;我使用Java时是这样的;)。当
javac
编译程序时,它可以在其他文件中找到依赖但尚未编译的类

Python实际上做了一些非常类似的事情——每个文件有一个模块,该模块与文件同名。您没有注意到,因为您没有显式地声明模块,但是如果您这样做了

foo.py:

bar.py:

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

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

因此,要回答您的问题,是的,在一个文件中有您想要的任意多个类是完全可以的,因为它们都在同一个模块中。

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

文件中的第二个应用程序类也是wxPython的典型类型,在wxPython中,将应用程序详细信息分隔开来是非常常见的

也就是说,在Python中,每个模块可以有任意多个类别。您有1个还是5个取决于模块的功能完整性以及这些类在功能上的相关性

在任何情况下,当模块增长到500-1000行以上时,最好将其内容拆分为不同的文件

最后,如上所述,您的代码在win7 64位和wxpython 2.8中非常适合我。(我必须对设置的位图行进行注释,因为我没有该图像)

编辑:你说得对。实例化应用程序对象时,将创建MyMenu框架,然后应用程序进入其主循环。应用程序(值)用于将应用程序输出定向到某些位置:

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
每个文件有一个(框架或面板)类是典型的wxPython编码。 通常,您构建框架时不提供任何特殊功能,然后在另一个模块中将其子类化。通过这种方式,特别是当您使用像wxGlade这样的gui构建工具时,您可以修改gui,甚至可以独立于代码向其添加新的小部件

文件中的第二个应用程序类也是wxPython的典型类型,在wxPython中,将应用程序详细信息分隔开来是非常常见的

也就是说,在Python中,每个模块可以有任意多个类别。您有1个还是5个取决于模块的功能完整性以及这些类在功能上的相关性

在任何情况下,当模块增长到500-1000行以上时,最好将其内容拆分为不同的文件

最后,如上所述,您的代码在win7 64位和wxpython 2.8中非常适合我。(我必须对设置的位图行进行注释,因为我没有该图像)

编辑:你说得对。实例化应用程序对象时,将创建MyMenu框架,然后应用程序进入其主循环。应用程序
import foo
print(foo.A())
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
wx.App(redirect=True, filename=None, useBestVisual=False, clearSigInt=True)