补充说明上次的wx.App类,wx.App是应用程序的基类,它会在方法调用wx.Frame类,然后循环调用自己的方法,来运行一个完整的应用程序。如何解释这个事情呢,程序员的方法—你站在这里别动,我打几行代码给你看看,就几行。
wx.App类的运行过程
#coding:utf-8
import wx
import time
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,-1,'Hello World',size=(300,300))
panel = wx.Panel(self)
txt = wx.StaticText(panel,-1,'Hello world')
self.Centre()
class MyApp(wx.App):
def OnInit(self):
print('App Oninit')
self.frame = MyFrame()
self.frame.Show()
return True
def OnExit(self):
print('App OnExit')
time.sleep(3)
return True
print('App start')
app = MyApp()
print('before Mainloop')
app.MainLoop()
print('after Mainloop')
代码如上,比起上次的代码,这次多了MyApp类(继承了wx.App),用来解释整个过程。从wx.App类的运行开始说起:
print('App start')
app = MyApp()
print('before Mainloop')
跟其他类创建的对象时类似,会先调用其的构造方法,而wx.App程序在创建对象时,则是会调用Oninit方法,从方法的字面意思也可以得知,这个方法是类似__init__方法,在App运行前被调用。通常是应用于程序前的文件读取或者是窗口对象生成,所以在OnInit里面写了之前的窗口对象代码:
print('App Oninit')
self.frame = MyFrame()
self.frame.Show()
return True
即到现在为止,系统终端应该输出的顺序是:
‘App start’
‘App Oninit’
‘before Mainloop’
值得一提的是,方法Oninit最后要返回True,不然的话,程序会报错,而返回False的话,系统会立即退出。
程序运行到这里,就开始进入wx.App的mainloop循环了,怎么解释这个循环呢,可以把它想象成一个while True循环,或者while 条件(程序退出)。如果学过arduino之类的话就好理解了。这里,程序会一直停在代码这个地方,除非程序退出,所以后面的print(‘after Mainloop’)语句一直在等待(如果交给线程处理便不会)。
而wx.App的OnExit()方法则与Oninit方法相反,它是在程序退出前默认执行,负责当Oninit方法的清道夫,关闭资源占用。
故,整一个程序下来,结果如下:
自己可以通过time.sleep()方法多多调试几下便容易理解了。