我正在学习 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这样的另一个数字,或者像“你好”这样的文本。
答案 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.stdout
和sys.stderr
重定向?在Windows和Mac上默认为True,为False 除此以外。如果filename
为None,则输出为 重定向到根据需要弹出的窗口。 (您可以 控制为输出创建什么样的窗口 将类变量outputWindowClass
重置为a 你选择的课程。)
wx.App的签名:
wx.App(redirect=True, filename=None, useBestVisual=False, clearSigInt=True)