从开发框架出发:使用WxPython设计GUI(2)

补充说明上次的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()方法多多调试几下便容易理解了。

猜你喜欢

转载自blog.csdn.net/ACID_lv_ing/article/details/88049628