第一个 wxPython 程序
上篇教程的最后部分留下了一个优化后的 wxPython 程序,代码如下:
# wxPython2.py
from wx import *
class MyFrame(Frame):
def __init__(self):
super(MyFrame, self).__init__(None, title="第一个wxPython程序", size=(600, 400), pos=(300, 225))
class MyApp(App):
def OnInit(self):
frame = MyFrame()
frame.Show()
return True
def OnExit(self):
print("程序结束")
return 0
if __name__ == "__main__":
app = MyApp()
app.MainLoop()
最终运行结果如图所示。
这个程序的每部分代码分别对应的意思如下。
class MyFrame(Frame):
创建 Frame 的子类 MyFrame;super(MyFrame, self).__init__(None, title="第一个wxPython程序", size=(600, 400), pos=(300, 225))
初始化:parent=None, title=“第一个wxPython程序”,size=(600, 400),pos=(300, 225) (每个参数的意义在该专栏上篇文章《wxPython 1 - 图形用户界面初认识》中均有说明);class MyApp(App):
创建 App 的子类 MyApp;def OnInit(self):
重写了在 App 类加载时首先调用的方法 OnInit ;return True
这一条返回无论写return false
还是不写,都会报错OnInit returned false, exiting...
。 而当不写返回语句时,还会有 TypeError :方法限定的返回值为 bool 类型,返回了 None 。def OnExit(self):
重写了在 App 类关闭时调用的方法 OnExit (注:这条在实际开发中一般不加,这里加上仅是为了体现print("程序结束")
);return 0
这里似乎返回一个 int 即可。不知为什么,返回其他的数也没有标注或报错。
Panel 面板
一般来说, wxPython 中控件一般放在内容面板而非直接添加到 Frame 里。最基础的面板为 Panel ,其他的特殊 Panel 比如 ScrolledPanel 等以后的教程中将会作讲解,现对于 wx.Panel 作基础的讲解。
Panel 基本构造如下:
Panel(parent, id=ID_ANY, pos=DefaultPosition, size=DefaultSize, style=TAB_TRAVERSAL, name=PanelNameStr)
一般来说,使用 Panel 时只需要设置 parent 参数,与其他参数一样,设置 Panel 的父 Panel ,或窗口( self );有一些时候也会用到 style 。 Panel 可设置的 style 也是 wx.Windows 的 Style ,所有控件都可以设置。常用 style 如下:
Border 设置:
- BORDER_SIMPLE: 为 Panel 设置细边框;
- BORDER_SUNKEN: 为 Panel 设置凹陷效果的边框(阴影);
- BORDER_RAISED: 为 Panel 设置突起效果的边框(阴影);
- BORDER_STATIC: 一个比较适合静态控件的边框,一般不为 Panel 设定。这种边框类似 BORDER_SUNKEN 。需要注意的是,该 style 只在 Windows 下生效。
- BORDER_THEME: 一个很特殊的边框,适合控件的本机边框,同样不设定至 Panel 。这种边框据帮助文档所述,在除了 Windows 之外的平台上会显示凹陷的样式,个人没有经过测试。
- BORDER_NONE: 这个边框在静态控件中一般不设定。这个 style 指定了控件没有边框,在将要学习的 Button 中会有一些作用。
除了 Border 一类的常用 style 外,控件(这里只讲了 Panel ,其他的任何继承于 Window 控件也包括同样的 style)所共有的 style 还有许多,这里也放不下,可以参见 帮助文档。
当有许多个 style 需要设的时候,可以使用位或运算|
连接各个 style 。
以下是对于 Panel 的一个应用。
# wxPython2.py
from wx import *
class MyFrame(Frame):
def __init__(self):
super(MyFrame, self).__init__(None, title="第一个wxPython程序", size=(600, 400), pos=(300, 225))
self.panel = Panel(self)
self.inPanelA = Panel(self.panel, style=BORDER_SIMPLE, pos=(0, 0))
self.textA = StaticText(self.inPanelA, label="A")
self.inPanelB = Panel(self.panel, style=BORDER_SUNKEN, pos=(50, 0))
self.textB = StaticText(self.inPanelB, label="B")
self.inPanelC = Panel(self.panel, style=BORDER_RAISED, pos=(100, 0))
self.textC = StaticText(self.inPanelC, label="C")
self.inPanelD = Panel(self.panel, style=BORDER_STATIC, pos=(150, 0))
self.textD = StaticText(self.inPanelD, label="D")
self.inPanelE = Panel(self.panel, style=BORDER_THEME, pos=(200, 0))
self.textE = StaticText(self.inPanelE, label="E")
self.inPanelF = Panel(self.panel, style=BORDER_NONE, pos=(250, 0))
self.textF = StaticText(self.inPanelF, label="F")
class MyApp(App):
def OnInit(self):
frame = MyFrame()
frame.Show()
return True
if __name__ == "__main__":
app = MyApp()
app.MainLoop()
这个示例基本不用对其作讲解。 __init__ 方法中创建了整个窗口的内容面板 panel ,又分别创建了其子类 inPanel A~F 。每个子 panel 都有一个 text ,是一个 StaticText 对象,以后会有详细讲解。这里只需知道,第一个参数是几乎所有控件统一的 parent ,第二个 label 就是其在页面显示的文本。
每个 Panel 有着不同的 style ,分别使用了以上讲过的六种设置 border 的样式。效果如下。
从这个实验可知,其各个包含 StaticText 控件的 Panel 的样式即上述的六种描述的样子。
后记
下一篇将会详细讲解一直用到的 Frame 类,欢迎关注专栏以便继续学习~