使用基本的控件
即使是一个简单的wxPython程序也需要使用标准的元素,诸如菜单和对话框。这儿有对于任一GUI应用程序的基本的建造部件。使用这些建造部件,还有像启动画面、状态栏或关于框等这些窗口部件,它们给你提供了一个更友好的用户环境,并且给了你的应用程序一个专业的感观。为了要结束本书的第一部分,我们将指导你通过一个程序的创建来使用所有所学的部分。我们将建造
一个简单的绘画程序,然后添加这些建造部件元素并说明使用它们时的一些问题。我们将巩固前面章节的基本原理和概念,并且最后我们将产生这个简单但专业的应用程序。
我们在本章将建造的这个应用程序基本上基于wxPython/samples目录中的涂鸦例子。这个应用程序是一个非常简单的绘画程序,当鼠标左键按下时它跟踪鼠标指针,并画线。
我们之所以要选择这样一个绘画例子,是因为它是十分简单的程序,它演示了在创建更复杂的应用程序时所引出的许多问题。在本章,我们将给你展示如何在屏幕上画线、添加状态栏、工具样以及菜单栏。你将会看到如何使用通用对话框,如文件选择器和颜色选择器。我们将使用sizer来布置窗口部件,并且我们也将增加一个关于框和一个启动画面。本章的最后,你将有一个很好看的绘画程序。
在屏幕上绘画
你的绘画程序的首先的工作是勾画线条并显示出来。像其它的GUI工具一样, wxPython提供了一套独立于设备的工具用于绘画。下面,我们将讨论如何在屏幕上绘画。
如何在屏幕上绘画
要在屏幕上绘画,我们要用到一个名为device context(设备上下文)的wxPython对象。设备上下文代表抽象的设备,它对于所有的设备有一套公用的绘画方法,所以对于不同的设备,你的代码是相同的,而不用考虑你所在的具体设备。设备上下文使用抽象的wxPython的类wx.DC和其子类来代表。由于wx.DC是抽象的,所以对于你的应用程序,你需要使用它的子类。
使用设备上下文
下面显示了wx.DC的子类及其用法。设备上下文用来在wxPython窗口部件上绘画,它应该是局部的,临时性的,不应该以实例变量、全局变量或其它形式在方法调用之间保留。在某些平台上,设备上下文是有限的资源,长期持有wx.DC可能导致你的程序不稳定。由于wxPython内部使用设备上下文的方式,对于在窗口部件中绘画,就存在几个有着细微差别的wx.DC的子类。第十二章将更详细地说明这些差别。
- wx.BufferedDC:用于缓存一套绘画命令,直到命令完整并准备在屏幕上绘画。这防止了显示中不必要的闪烁。
- wx.BufferedPaintDC:和wx.BufferedDC一样,但是只能用在一个wx.PaintEvent的处理中。仅临时创建该类的实例。
- wx.ClientDC:用于在一个窗口对象上绘画。当你想在窗口部件的主区域上(不包括边框或别的装饰)绘画时使用它。主区域有时也称为客户区。wx.ClientDC类也应临时创建。该类仅适用于wx.PaintEvent的处理之外。
- wx.MemoryDC:用于绘制图形到内存中的一个位图中,此时不被显示。然后你可以选择该位图,并使用wx.DC.Blit()方法来把这个位图绘画到一个窗口中。
- wx.MetafileDC:在Windows操作系统上,wx.MetafileDC使你能够去创建标准窗口图元文件数据。
- wx.PaintDC:等同于wx.ClientDC,除了它仅用于一个wx.PaintEvent的处理中。仅临时创建该类的实例。
- wx.PostScriptDC:用于写压缩的PostScript文件。
- wx.PrinterDC:用于Windows操作系统上,写到打印机。
- wx.ScreenDC:用于直接在屏幕上绘画,在任何被显示的窗口的顶部或外部。该类只应该被临时创建。
- wx.WindowDC:用于在一个窗口对象的整个区域上绘画,包括边框以及那些没有被包括在客户区域中的装饰。非Windows系统可能不支持该类。
得到文件信息
在有些情况下,你会需要读取客户的文件,比如在编辑或者上传文件的时候,一个文件上传的弹窗,其实这种文件上传的弹窗也是由对话框来实现的,它属于是一种特殊的对话框。
如何使用标准文件对话框?
大部分的GUI应用程序都要保存和载入这样那样的数据。考虑到你和你的用户,应该有一个简单的,方便的机制来选择文件。很高兴,为此wxPython提供了标准的文件对话框wx.FileDialog。
wx.FileDialog最重要的方法是它的构造器,语法如下:
wx.FileDialog(parent, message=”Choose a file”, defaultDir=””,defaultFile=””, wildcard=”*.*”, style=0)
wx.FileDialog构造器的参数:
- parent:对话框的父窗口。如果没有父窗口则为None。
- message:message显示在对话框的标题栏中。
- defaultDir:当对话框打开时,默认的目录。如果为空,则为当前工作目录。
- defaultFile:当对话框打开时,默认选择的文件。如果为空,则没有文件被选择。
- wildcard:通配符。指定要选择的文件类型。格式是
<display>|<wildcard>
。可以指定多种类型的文件,例如:固定的后缀(*.sketch)
,或者是所有的文件(*.*)
。 - style:样式,具体的样式可选项如下所示:
- wx.CHANGE_DIR:在用户选择了一个文件之后,当前工作目录相应改变到所选文件所在的目录。
- wx.MULTIPLE:仅适用于打开对话框。这个样式使得用户可以选择多个文件。
- wx.OPEN:这个样式用于打开一个文件。
- wx.OVERWRITE_PROMPT:仅适用于保存文件对话框。显示一个提示信息以确认是否覆盖一个已存在的文件。
- wx.SAVE:这个样式用于保存一个文件。
要使用文件对话框,要对一个对话框实例调用ShowModal()方法。这个方法根据用户所敲击的对话框上的按钮来返回wx.ID_OK或wx.ID_CANCEL。选择之后。使用GetFilename(), GetDirectory(), 或GetPath()方法来获取数据。之后,调用Destroy()销毁对话框是一个好的编程习惯。
下面这个案例是一个简单的打开一个文件并将内容显示到wxpython的窗口中的案例:
import os
# 导入os模块,用于获取当前工作目录
import wx
# 导入wx模块,用于创建和管理窗口
class MyFrame(wx.Frame):
# 定义一个继承自wx.Frame的类MyFrame,用于创建应用程序的主窗口
def __init__(self):
# 初始化MyFrame类
wx.Frame.__init__(self, None, -1, "MyFrame", size=(500, 600))
# 初始化窗口,设置父窗口为None,ID为-1,标题为"MyFrame",大小为500x600像素
panel = wx.Panel(self, -1)
# 在窗口中创建一个面板,父窗口为self,ID为-1
self.text = wx.TextCtrl(panel, -1, style=wx.TE_MULTILINE, size=(480, 560))
# 在面板上创建一个多行的文本控件,父窗口为panel,ID为-1,大小为480x560像素
self.Font = wx.Font(40, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False)
# 创建一个字体对象,设置字体大小为40,字体系列为默认,样式为正常,粗细为粗体,下划线为False
self.text.SetFont(self.Font)
# 将字体对象设置到文本控件中
FileMessage = wx.FileDialog(panel, "Open file", os.getcwd(), wildcard="*.txt", style=wx.FD_OPEN)
# 创建一个文件对话框,父窗口为panel,标题为"Open file",初始目录为当前工作目录,只允许选择.txt文件,模式为打开文件
if FileMessage.ShowModal() == wx.ID_OK: # 显示文件对话框并检查结果
# 显示文件对话框,并检查用户是否点击了“确定”按钮
filePath = FileMessage.GetPath() # 获取选中的文件路径
# 获取用户选择的文件的完整路径
print(f"Selected file: {filePath}")
# 打印选中的文件路径
# 你可以在这里读取和处理文件
with open(filePath, 'r', encoding='utf-8') as file:
# 以只读模式打开文件,指定编码为utf-8
content = file.read()
# 读取文件内容
print(content)
# 打印文件内容
self.text.SetValue(content)
# 将读取的文件内容设置到文本控件中进行显示
FileMessage.Destroy() # 销毁文件对话框
# 销毁文件对话框,释放资源
self.Show()
# 显示窗口
if __name__ == '__main__':
# 检查是否作为主程序运行
app = wx.App()
# 创建wx.App对象,用于管理应用程序
frame = MyFrame()
# 创建MyFrame窗口实例
app.MainLoop()
# 进入应用程序的主事件循环,等待用户操作
他的效果如下所示:
选择要打开的文件,然后打开之后会将文件的内容读取到wxpython的窗口上: