大多数操作系统都为像文件选择、字体选择和颜色选择这些任务提供了标准对话框。这为平台提供了一致感观。你也可以使用来自于wxPython的这些对话框,它们也为你的应用程序提供了一致的感观。如果你使用wxPython,那么它为你提供了类似的对话框,即使所在的平台没有提供系统对话框。
9.2.1 如何使用文件选择对话框?
在wxPython中,wx.FileDialog为主流的平台使用本地操作系统对话框,对其它操作系统使用非本地相似的外观。微软Windows的版本如图9.6所示。
图9.6
你可以设置文件对话框开始在任一目录,你也可以使用通配符过滤来限制去显示某种文件类型。例9.6显示了一个基本的例子。
例9.6 使用wx.FileDialog
import wx
import os
if __name__ == "__main__":
app = wx.PySimpleApp()
wildcard = "Python source (*.py)|*.py|" /
"Compiled Python (*.pyc)|*.pyc|" /
"All files (*.*)|*.*"
dialog = wx.FileDialog(None, "Choose a file", os.getcwd(),
"", wildcard, wx.OPEN)
if dialog.ShowModal() == wx.ID_OK:
print dialog.GetPath()
dialog.Destroy()
文件对话框是我们这章已见过的最复杂的对话框,它有几个属性可以通过编程的方式读写。它的构造函数使得你能够设置它的一些属性:
wx.FileDialog(parent, message="Choose a file", defaultDir="",
defaultFile="", wildcard="*.*", style=0,
pos=wx.DefaultPosition)
message参数出现在窗口的标题栏中。defaultDir参数告诉对话框初始的时候显示哪个目录。如果这个参数为空或表示的目录不存在,那么对话框开始在当前目录。defaultFile是默认保存为的文件。wildcard参数使你可以基于给定的模式来过滤列表,使用通常的*和?作为通配符。通配符可以是单个模式,如*.py或格式如<描述>|<模式>|<描述>|<模式>的一系列模式——类似于例9.6中所用。
"Python source (*.py)|*.py|Compiled Python (*.pyc)|*.pyc|
All files (*.*)|*.*"
如果有一个多个项目的模式,那么它们显示在图9.6所示的下拉菜单中。pos参数不保证被基本的系统所支持。
选择一个文件
wx.FileDialog的两个最重要的样式标记是wx.OPEN和wx.SAVE,它们表明对话框的类型并影响对话框的行为。
用于打开文件的对话框有两个标记,它们进一步影响对话框的行为。wx.HIDE_READONLY标记灰化复选框,使用户以只读模式打开文件。wx.MULTIPLE标记使用户可以在一个目录中选择打开多个文件。
保存文件对话框有一个有用的标记wx.OVERWRITE_PROMPT,它使得保存文件时,如果有相同的文件存在,则提示用户是否覆盖。
两种文件对话框都可以使用wx.CHANGE_DIR标记。当使用这个标记时,文件的选择也可改变应用程序的工作目录为所选文件所在的目录。这使得下次文件对话框打开在相同的目录,而不需要应用程序再在别处存储该值。
和本章迄今为止我人们所见过的其它对话框不一样,文件对话框的属性directory,filename, style, message, 和wildcard是可以通过方法来得到和设置的。这些方法使用Get/Set命名习惯。
在用户退出对话框后,如果返回值是wx.OK,那么你可以使用方法GetPath()来得到用户的选择,该函数的返回值是字符串形式的文件全路径名。如果对话框是一个使用了wx.MULTIPLE标记的打开对话框,则用GetPaths()代替GetPath()。该方法返回路径字符串的一个Python列表。如果你需要知道在用户选择时使用了下拉菜单中的哪个项,你可以使用GetFilterIndex(),它返回项目的索引。要通过编程改变索引,使用方法SetFilterIndex()。
这后面的是一个使用文件对话框的便利函数:
wx.FileSelector(message, default_path="", default_filename="",
default_extension="", wildcard="*.*'', flags=0, parent=None,
x=-1, y=-1)
message, default_path, default_filename, 和 wildcard参数意义与构造函数的基本相同,尽管参数的名字不同。flags参数通常被称作style,default_extension参数是保存为文件时默认的后缀(如果用户没有指定后缀的情况下)。如果用户按下OK,返回值是字符串形式的路径名,如果用户按下Cancel则返回一个空字符串。
选择一个目录
如果用户想去选择一个目录而非一个文件,使用wx.DirDialog,它呈现一个目录树的视图,如图9.7所示。
这个目录选择器比文件对话框简单些。例9.7显示了相关的代码。
例9.7 显示一个目录选择对话框
import wx
if __name__ == "__main__":
app = wx.PySimpleApp()
dialog = wx.DirDialog(None, "Choose a directory:",
style=wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON)
if dialog.ShowModal() == wx.ID_OK:
print dialog.GetPath()
dialog.Destroy()
图9.7
这个对话框的所有的功能几乎都在构造函数中:
wx.DirDialog(parent, message="Choose a directory", defaultPath="",
style=0, pos = wx.DefaultPosition, size = wx.DefaultSize,
name="wxDirCtrl")
由于message参数显示在对话框中,所以你不需要一个钩子去改变标题栏。defaultPath告诉对话框选择的默认路径,如果它为空,那么对话框显示文件系统的根目录。pos和size参数在微软Windows下被忽略,name参数在所有的操作系统下都被忽略。该对话框的样式标记wx.DD_NEW_DIR_BUTTON给对话框一个用于创建目录的一个按钮。这个标记在老版的微软Windows中不工作。
wx.DirDialog类的path, message, 和style属性都有相应的get*和set*方法。你可以使用GetPath()方法来在对话框被调用后获取用户的选择。这个对话框也有一个便利的函数:
wx.DirSelector(message=wx.DirSelectorPromptStr, default_path="",
style=0, pos=wxDefaultPosition, parent=None)
所有的参数和前面的构造函数相同。如果OK被按下,则该函数返回所选择的字符串形式的目录名,如果按下Cancel,则返回空字符串。