开始学习
之前我们已经通过一个小案例来展示了WxPython是如何使用的,算是大概的了解了一下,那么接下来,我们就要开始正式的学习WxPython了,我们首先来通过一个小案例来看一下WxPython的一个最基本的代码组成。
import wx # 导入wxpython的包
class App(wx.App): # 创建一个wxpython的应用
def OnInit(self):# 定义初始化方法
frame = wx.Frame(parent=None, title="Bare")
frame.Show()
return True
app = App() # 创建一个应用程序类的实例
app.MainLoop() # 进入程序的主事件循环
将上面的代码复制并运行之后,我们就会得到一个这样的东西:
这是一个什么呢,这就是一个WxPython的最基本的框架,上面的这几行代码,一行都不能缺少,这就是组成一个wxpython应用最基本的框架。这几个步骤分别是:
- 1、导入必须的wxPython包
- 2、子类化wxPython应用程序类
- 3、定义一个应用程序的初始化方法
- 4、创建一个应用程序类的实例
- 5、进入这个应用程序的主事件循环
使你的应用程序和框架工作
一旦你导入了wx模块,你就能够创建你的应用程序(application)对象和框架(frame)对象。每个wxPython程序必须有一个application对象和至少一个frame对象。application对象必须是wx.App的一个实例或你在OnInit()方法中定义的一个子类的一个实例。当你的应用程序启动的时候,OnInit()方法将被wx.App父类调用。
如何获取application对象和frame对象呢?我们一个一个来说,首先是application对象,这个对象需要通过继承wx.App这个类来获得,他的方法如下所示:
class MyApp(wx.App):
pass
在Python中,创建一个类使用class关键字,而继承则只需要将父类的类名写在后面的括号里面就可以了,这样我们就获得了一个application对象了,那么下一个对象,frame对象我们一般在OnInit方法中获得,需要通过wx.Frame对象来获取,具体的操作如下所示:
class MyApp(wx.App):
def OnInit():
frame = wx.Frame(parent=None, id=-1, title="Bare")
frame.Show()
return True
在OnInit方法中,我们获取了Frame对象,在获取Frame对象的时候我们我们看到填了三个参数,这三个参数只有第一个参数是必须的,其他的两个参数都有默认值。Show()方法的作用是让这个窗口可见,如果不调用这个方法,则这个窗口将不可见。我们可以通过给Show()一个布尔值参数来设定frame的可见性:
- frame.Show(False) # 使框架不可见.
- frame.Show(True) # True是默认值,使框架可见.
- frame.Hide() # 等同于frame.Show(False)
最后的方法返回值为真表示调用这个窗口,如果返回值为假则表示退出这个窗口。
创建一个应用程序实例并进入它的主事件循环
这步是创建wx.App子类的实例,并调用它的MainLoop()方法:
app = App()
app.MainLoop()
一旦进入主事件循环,控制权将转交给wxPython。wxPython GUI程序主要响应用户的鼠标和键盘事件。当一个应用程序的所有框架被关闭后,这个app.MainLoop()方法将返回且程序退出。
其实这一部分很好理解,事件循环的作用就是为了监听所有的事件,而事件指的就是,按下鼠标或者按下键盘的这种行为就叫做事件,比如你想要输入什么东西,或者用鼠标点击了一个按钮,那么GUI的表现就是这个按钮被按下了,会有一些样式的反馈,但是具体的,按下按钮之后会发生什么事情,比如提交表单或者关闭窗口,这些其实就是与按钮绑定的事件处理函数来完成的,那么主事件循环的作用就是监听这些事件,并执行事件对应的事件处理函数。
简单来说,主事件循环的作用是监听并执行事件处理函数的。
扩展这个最小的空的wxPython程序
之前我们所写的是一个最小的框架,是为了让我们了解WxPython的一个基本构造,那么现在我们就要开始往这个空白框架里面填充一些内容了。
我们来新建一个全新的文件:
import wx # 导入wxPython库,用于创建图形用户界面
class MyFrame(wx.Frame): # 定义一个名为MyFrame的类,继承自wx.Frame
pass # 类体目前为空,后续可以添加功能
class MyApp(wx.App): # 定义一个名为MyApp的类,继承自wx.App
def OnInit(self): # 重写OnInit方法,该方法在应用程序初始化时被调用
self.frame = MyFrame(None) # 创建MyFrame类的一个实例,并将其赋值给self.frame属性
self.SetTopWindow(self.frame) # 设置主窗口为self.frame
self.frame.Show(True) # 显示主窗口
return True # 返回True,表示应用程序初始化成功
if __name__ == '__main__': # 判断是否是主程序
app = MyApp() # 创建MyApp类的一个实例,并启动应用程序的事件循环
app.MainLoop() # 调用MainLoop方法,启动应用程序的事件循环
和之前的框架相比,现在的这个多了一个类,就是这个MyFrame,这个类继承了wx.Frame,继承这个类就表示这是一个界面,我们之后所有想要在界面中呈现的内容就会在这个类中编写。在之前的案例中,我们是在OnInit中创建了Frame对象,但其实这样是不规范的,实际上是需要单独创建一个Frame类来制作页面。
然后就是在OnInit中,我们需要做的就和之前是一样的,只不过我们这里有一点区别的地方就在于,Frame对象是我们之前自己创建的类,并且需要使用SetTioWindow方法将这个窗口设置为主窗口,每个程序都至少有一个顶级窗口,然后在顶级窗口的内部,会出现很多的其他窗口。
之后就是判断是否为主程序,如果是主程序,则创建应用实例,展示窗口,进入主事件循环;如果不是作为主程序启动的话,那么就不启动这些,而是执行其他的操作。
Hello World!
现在又到了每个编程语言都喜闻乐见的Hello World环节。在之前我们已经介绍了WxPython的一个最基本的空框架,是为了让我们理解WxPython的基本组成原理,然后我们看到了一个规范化的一个框架组成是怎样的,是为了之后在编程中能更规范的编写代码,虽然Python的语法本质上就是一个松散的结构,但是通过自主规范的代码,和严谨的逻辑结构,还是可以做到尽量让代码规范化的。
那么现在我们就用之前我们学到的规范化的框架来编写一个最基础的Hello World,具体的代码如下:
import wx # 导入wxPython库,用于创建图形用户界面
class MyFrame(wx.Frame): # 定义一个名为MyFrame的类,继承自wx.Frame
def __init__(self, parent): # 定义构造函数,参数为父窗口
wx.Frame.__init__(self, parent, title='My Frame', size=(500,300)) # 调用父类的构造函数,创建窗口
self.panel = wx.Panel(self) # 创建一个面板
self.text = wx.StaticText(self.panel, label='Hello, world!') # 创建一个静态文本控件
class MyApp(wx.App): # 定义一个名为MyApp的类,继承自wx.App
def OnInit(self): # 重写OnInit方法,该方法在应用程序初始化时被调用
self.frame = MyFrame(None) # 创建MyFrame类的一个实例,并将其赋值给self.frame属性
self.SetTopWindow(self.frame) # 设置主窗口为self.frame
self.frame.Show(True) # 显示主窗口
return True # 返回True,表示应用程序初始化成功
if __name__ == '__main__': # 判断是否是主程序
app = MyApp() # 创建MyApp类的一个实例,并启动应用程序的事件循环
app.MainLoop() # 调用MainLoop方法,启动应用程序的事件循环
他的显示效果如下所示:
在上面的案例中我们编写了一个界面,这个界面用来显示Hello World,最关键的修改的部分就在于我们自己编写的MyFrame类里面,因为我们所有的显示在页面中的内容都要写在这个类里面。
在之后,我们还要学习到其他的一些控件,样式,以及排版方式等等,让整个的界面变得美观一些。
欢迎大家加我的QQ一起参与讨论:479728091