在这部分wxPython教程中,我们将创建一些简单的例子。
简单的例子
我们从一个非常简单的例子开始。我们的第一个脚本将只显示一个小窗口。它不会做太多事情。我们将逐行分析这个脚本。
# simple.pyimport wxapp = wx.App()frame = wx.Frame(None, )frame.Show()app.MainLoop()
这是我们的第一个例子
# simple.py
第一行是脚本的名称
import wx
这一行导入了基本的 wxPython 模块,即 core、controls、gdi、misc 和 windows。从技术上讲,wx是一个命名空间,所有基本模块中的函数和对象都以wx.开头。所有来自基本模块的函数和对象都以wx.为前缀。下一行代码将创建一个应用程序对象。
app = wx.App()
每个wxPython程序必须有一个应用程序对象。
frame = wx.Frame(None, )frame.Show()
这里我们创建一个wx.Frame对象。wx.Frame组件是一个重要的容器组件。我们将在后面详细分析这个小组件。wx.Frame 组件是其他组件的父组件。它本身没有父组件。如果我们为父级参数指定None,则表示我们的小组件没有父级。它是小组件层次结构中的顶级小组件。在我们创建 wx.Frame 小组件后,我们必须调用 Show() 方法才能在屏幕上实际显示它。
app.MainLoop()
最后一行进入主循环。主循环是一个无尽的循环。它捕捉并派发在我们的应用程序生命周期中存在的所有事件。
这是一个非常简单的例子。尽管如此简单,我们可以用这个窗口做很多事情。我们可以调整窗口的大小,最大化,最小化。这个功能需要大量的编码。所有这些功能都是由 wxPython 工具包默认隐藏和提供的。我们没有理由重新发明轮子。
wx.Frame
wx.Frame widget 是 wxPython 中最重要的 widgets之一。它是一个容器组件,意味着它可以包含其他组件。这意味着它可以包含其他小组件,实际上它可以包含任何非框架或对话框的窗口。wx.Frame由标题栏、边框和一个中心容器区域组成,标题栏和边框是可选的。标题栏和边框是可选的。它们可以通过各种标志来移除。 wx.Frame 有以下构造函数:
wx.Frame(wx.Window parent, int id=-1, string , wx.Point pos=wx.DefaultPosition, wx.Size size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE, string name="frame")
该构造函数有七个参数。第一个参数没有默认值。其他六个参数有。后四个参数是可选的。前三个参数是强制性的。
wx.DEFAULT_FRAME_STYLE是一组默认标志:wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER wx.SYSTEM_MENU |wx.CAPTION - wx.CLOSE_BOX - wx.CLIP_CHILDREN。通过组合不同的样式,我们可以改变wx.Frame 组件的样式。
# no_minimize.pyimport wxapp = wx.App()frame = wx.Frame(None, style=wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX)frame.Show(True)app.MainLoop()
我们的目的是为了显示一个没有最小化框的窗口,所以我们没有在样式参数中指定这个标志。
大小和位置
我们可以通过两种方式来指定我们应用程序的大小。我们在widget的构造函数中有一个大小参数,或者我们可以调用SetSize()方法。
# set_size.pyimport wxclass Example(wx.Frame): def __init__(self, parent, title): super(Example, self).__init__(parent, title=title, size=(350, 250))def main(): app = wx.App() ex = Example(None, ) ex.Show() app.MainLoop()if __name__ == '__main__': main()
在这个例子中,应用程序的大小将是350x250px。
def __init__(self, parent, title): super(Example, self).__init__(parent, title=title, size=(350, 250))
在构造函数中,我们将wx.Frame组件的宽度设置为350 px。widget的高度为250 px。
同样,我们也可以在屏幕上定位我们的应用程序。默认情况下,窗口被放置在屏幕的左上角。但在不同的操作系统平台甚至窗口管理器上可能会有所不同。有些窗口管理器会自己放置应用程序窗口。有的会做一些优化,让窗口不重叠。程序员可以通过编程来定位窗口。我们已经在wx.Frame widget的构造函数中看到了一个pos参数。通过提供默认值以外的其他参数,我们可以自己控制位置。
Method | Description |
---|---|
Move(wx.Point point) | move a window to the given position |
MoveXY(int x, int y) | move a window to the given position |
SetPosition(wx.Point point) | set the position of a window |
SetDimensions(x, y, width, height, sizeFlags) | set the position and the size of a window |
有几种方法可以做到这一点。
# moving.pyimport wxclass Example(wx.Frame): def __init__(self, parent, title): super(Example, self).__init__(parent, title=title, size=(300, 200)) self.Move((800, 250))def main(): app = wx.App() ex = Example(None, ) ex.Show() app.MainLoop()if __name__ == '__main__': main()
有一种特殊情况。我们可能希望将窗口最大化显示,在这种情况下,窗口的位置是(0, 0),并占据整个屏幕。wxPython内部计算了屏幕坐标。为了最大化我们的wx.Frame,我们调用Maximize()方法。
屏幕居中
如果我们想让我们的应用程序在屏幕上居中,wxPython有一个方便的方法。Centre()方法可以简单地将窗口在屏幕上居中,无需计算屏幕的宽度和高度。只需调用该方法即可。
# centering.pyimport wxclass Example(wx.Frame): def __init__(self, parent, title): super(Example, self).__init__(parent, title=title, size=(300, 200)) self.Centre()def main(): app = wx.App() ex = Example(None, ) ex.Show() app.MainLoop()if __name__ == '__main__': main()
在这个例子中,我们将一个窗口居中放在屏幕上。
self.Centre()
Centre()方法使窗口在屏幕上居中。