- wxPython 教程
- wxPython - 首页
- wxPython - 简介
- wxPython - 环境
- wxPython - Hello World
- wxPython - GUI 构建工具
- wxPython - 主要类
- wxPython - 事件处理
- wxPython - 布局管理
- wxPython - 按钮
- wxPython - 可停靠窗口
- 多文档界面
- wxPython - 绘图 API
- wxPython - 拖放
- wxPython 资源
- wxPython - 快速指南
- wxPython - 有用资源
- wxPython - 讨论
wxPython - 对话框类
虽然一个对话框类对象看起来像一个框架,但它通常用作父框架顶部的弹出窗口。对话框的目的是从用户那里收集一些数据并将其发送到父框架。对话框框架可以是模态的(它会阻塞父框架)或非模态的(对话框框架可以被绕过)。ShowModal() 方法以模态方式显示对话框框架,而 Show() 则使其成为非模态的。
wxPython 有许多预配置的对话框小部件,例如 MessageDialog、FileDialog、FontDialog 等。
wx.Dialog 支持使用 Sizers,就像 wx.Frame 对象一样。因此,可以设计自定义对话框。
Wx.Dialog 类的构造函数采用以下常用参数:
wx.Dialog(parent, id, title, pos, size, style)
对话框小部件的默认外观仅在标题栏中显示关闭框。但是,可以使用以下样式参数的组合对其进行自定义:
序号 | 参数及描述 |
---|---|
1 | wx.CAPTION 在对话框上放置标题 |
2 | wx.DEFAULT_DIALOG_STYLE 等效于 wxCAPTION、wxCLOSE_BOX 和 wxSYSTEM_MENU 的组合 |
3 | wx.RESIZE_BORDER 在窗口周围显示一个可调整大小的框架 |
4 | wxSYSTEM_MENU 显示系统菜单 |
5 | wx.CLOSE_BOX 在框架上显示关闭框 |
6 | wx.MAXIMIZE_BOX 在对话框上显示最大化框 |
7 | wx.MINIMIZE_BOX 在对话框上显示最小化框 |
8 | wx.STAY_ON_TOP 确保对话框始终位于所有其他窗口的顶部 |
9 | wx.DIALOG_NO_PARENT 防止创建孤立对话框。不推荐用于模态对话框 |
为此类定义了两个事件绑定器:
序号 | 事件及描述 |
---|---|
1 | EVT_CLOSE 当对话框由用户或以编程方式关闭时 |
2 | EVT_INIT_DIALOG 当对话框正在初始化时 |
如上所述,对话框的目的是收集数据并返回到父窗口。但是,对话框类有一些有用的方法可用。
序号 | 方法及描述 |
---|---|
1 | DoOK() 当按下对话框上的“确定”按钮时调用 |
2 | ShowModal() 以应用程序模态方式显示对话框 |
3 | ShowWindowModal() 对话框仅对顶级父窗口有效 |
4 | EndModal() 结束模态对话框,并传递来自 ShowModal 调用的值 |
预配置对话框之一是 MessageDialog。它用于显示一行或多行消息,以及带有标准 ID 的按钮。以下是 MessageDialog 上标准按钮的选择列表。
序号 | 按钮及描述 |
---|---|
1 | wx.OK 显示“确定”按钮 |
2 | wx.CANCEL 显示“取消”按钮 |
3 | wx.YES_NO 显示“是”和“否”按钮 |
4 | wx.YES_DEFAULT 将“是”按钮设为默认按钮 |
5 | wx.NO_DEFAULT 将“否”按钮设为默认按钮 |
6 | wx.ICON_EXCLAMATION 显示警告图标 |
7 | wx.ICON_ERROR 显示错误图标 |
8 | wx.ICON_HAND 与 wx.ICON_ERROR 相同 |
9 | wx.ICON_INFORMATION 显示信息图标 |
10 | wx.ICON_QUESTION 显示询问图标 |
MessageDialog
它使用以下构造函数声明:
wx.MessageDialog(parent, message, caption, style, pos)
要显示的一行或多行文本是 message 参数,而标题显示在标题栏中。默认样式参数是 wx.OK|wx.ECNRE。其他样式参数允许自定义消息框。
wx.MessageBox 是一个方便函数,用于构造消息框,而不是使用 MessageDialog。
示例
以下是对话框模态和非模态行为的简单演示。父窗口是一个带有两个按钮的 wx.Frame 对象。第一个按钮上的单击事件以模态方式显示对话框。因此,在关闭对话框之前,任何对父窗口的操作都将被阻止。第二个按钮显示一个非模态对话框,它不会阻止对父窗口的访问。第三个按钮显示一个 MessageBox。
完整代码如下:
import wx class MyDialog(wx.Dialog): def __init__(self, parent, title): super(MyDialog, self).__init__(parent, title = title, size = (250,150)) panel = wx.Panel(self) self.btn = wx.Button(panel, wx.ID_OK, label = "ok", size = (50,20), pos = (75,50)) class Mywin(wx.Frame): def __init__(self, parent, title): super(Mywin, self).__init__(parent, title = title, size = (250,150)) self.InitUI() def InitUI(self): panel = wx.Panel(self) btn = wx.Button(panel, label = "Modal Dialog", pos = (75,10)) btn1 = wx.Button(panel, label = "Modeless Dialog", pos = (75,40)) btn2 = wx.Button(panel, label = "MessageBox", pos = (75,70)) btn.Bind(wx.EVT_BUTTON, self.OnModal) a = btn1.Bind(wx.EVT_BUTTON, self.OnModeless) print a btn2.Bind(wx.EVT_BUTTON, self.Onmsgbox) self.Centre() self.Show(True) def OnModal(self, event): a = MyDialog(self, "Dialog").ShowModal() print a def OnModeless(self, event): a = MyDialog(self, "Dialog").Show() def Onmsgbox(self, event): wx.MessageBox("This is a Message Box", "Message" ,wx.OK | wx.ICON_INFORMATION) ex = wx.App() Mywin(None,'MenuBar demo') ex.MainLoop()
以上代码产生以下输出:
wx.TextEntryDialog
此类的对象显示一个带有文本字段的对话框,一个可自定义的标签提示用户输入,以及两个带有预定义样式的按钮。
虽然此对话框请求一行输入,但可以通过使用 TextCtrl 样式(如密码和多行)来自定义文本框。
当用户单击“确定”按钮时,文本字段的内容将作为返回值收集。
TextEntryDialog 构造函数如下:
wx.TextEntryDialog(parent, id, message, caption, value, style, pos)
要显示在对话框窗口上的文本作为 message 参数传递。caption 参数是要显示在标题栏中的字符串。文本框中的默认字符串是 vthe alue 参数。对话框中的 TextCtrl 可以配置为显示密码字符 (wx.TE_PASSWORD) 和/或多行 (wx.TE_MULTILINE)。
TextEntry 类的其他方法如下表所示:
序号 | 方法及描述 |
---|---|
1 | SetMaxLength() 设置用户可以输入到文本框中的最大字符数 |
2 | SetValue() 以编程方式设置文本框值 |
3 | GetValue() 返回文本框的内容 |
4 | ShowModal() 以模态方式显示对话框。如果用户确认输入,则返回 wx.ID_OK,如果拒绝对话框,则返回 wx.ID_CANCEL |
示例
以下示例中的顶级框架显示一个按钮和一个只读 TextCtrl 小部件。
self.text = wx.TextCtrl(pnl, size = (250, 25),style = wx.TE_READONLY) self.btn1 = wx.Button(pnl, label = "Enter Text")
按钮响应单击并调用 OnClick() 函数。
self.Bind(wx.EVT_BUTTON, self.OnClick, self.btn1)
OnClick() 函数显示一个 TextEntryDialog。
dlg = wx.TextEntryDialog(self, 'Enter Your Name','Text Entry Dialog')
对话框的返回值由 GetValue() 函数获取并在顶级框架的 TextCtrl 对象中显示。
if dlg.ShowModal() == wx.ID_OK: self.text.SetValue("Name entered:"+dlg.GetValue())
完整代码如下:
import wx class Mywin(wx.Frame): def __init__(self, parent, title): super(Mywin, self).__init__(parent, title = title,size = (300,200)) self.InitUI() def InitUI(self): self.count = 0 pnl = wx.Panel(self) vbox = wx.BoxSizer(wx.VERTICAL) hbox1 = wx.BoxSizer(wx.HORIZONTAL) hbox2 = wx.BoxSizer(wx.HORIZONTAL) self.text = wx.TextCtrl(pnl, size = (250, 25),style = wx.TE_READONLY) self.btn1 = wx.Button(pnl, label = "Enter Text") self.Bind(wx.EVT_BUTTON, self.OnClick, self.btn1) hbox1.Add(self.text, proportion = 1, flag = wx.ALIGN_CENTRE) hbox2.Add(self.btn1, proportion = 1, flag = wx.RIGHT, border = 10) vbox.Add((0, 30)) vbox.Add(hbox1, flag = wx.ALIGN_CENTRE) vbox.Add((0, 20)) vbox.Add(hbox2, proportion = 1, flag = wx.ALIGN_CENTRE) pnl.SetSizer(vbox) self.Centre() self.Show(True) def OnClick(self, e): dlg = wx.TextEntryDialog(self, 'Enter Your Name','Text Entry Dialog') if dlg.ShowModal() == wx.ID_OK: self.text.SetValue("Name entered:"+dlg.GetValue()) dlg.Destroy() ex = wx.App() Mywin(None,'TextEntry Demo') ex.MainLoop()
以上代码产生以下输出:
wx.FileDialog 类
此类表示文件选择器对话框。它使用户能够浏览文件系统并选择要打开或保存的文件。对话框的外观是特定于操作系统的。
还可以应用文件过滤器以仅显示指定扩展名的文件。还可以设置起始目录和默认文件名。
FileDialog 构造函数的原型如下所示:
wx.FileDialog(parent, message, DefaultDir, DefaultFile, wildcard, style, pos, size)
message 表示要显示的文本。DefaultDir 是初始目录。可以使用通配符参数表示的文件过滤器设置一种或多种类型的文件。
为 FileDialog 定义的样式参数为:
序号 | 参数及描述 |
---|---|
1 | wx.FD_DEFAULT_STYLE 等效于 wxFD_OPEN |
2 | wx.FD_OPEN 这是一个打开对话框;对话框的默认按钮标签为“打开” |
3 | wx.FD_SAVE 这是一个保存对话框;对话框的默认按钮标签为“保存” |
4 | wx.FD_OVERWRITE_PROMPT 仅适用于保存对话框:如果文件将被覆盖,则提示确认 |
5 | wx.FD_MULTIPLE 仅适用于打开对话框:允许选择多个文件 |
6 | wx.FD_CHANGE_DIR 将当前工作目录更改为用户选择的文件所在的目录 |
wx.FileDialog 类的成员函数:
序号 | 函数及描述 |
---|---|
1 | GetDirectory() 返回默认目录 |
2 | GetFileName() 返回默认文件名 |
3 | GetPath() 返回所选文件的完整路径 |
4 | SetDirectory() 设置默认目录 |
5 | SetFilename() 设置默认文件 |
6 | SetPath() 设置完整路径 |
7 | ShowModal() 显示对话框,如果用户单击“确定”按钮则返回 wx.ID_OK,否则返回 wx.ID_CANCEL |
示例
在以下示例中,顶级框架显示一个按钮和一个多行 TextCtrl。
self.text = wx.TextCtrl(pnl, size = (-1,200), style = wx.TE_MULTILINE) self.btn1 = wx.Button(pnl, label = "Open a File")
EVT_BUTTON 事件绑定器将 OnClick() 函数注册到按钮。
self.Bind(wx.EVT_BUTTON, self.OnClick, self.btn1)
OnClick() 函数以打开模式显示 FileDialog。其选择作为 dlg 返回。所选文件通过 GetPath() 函数获取,其内容显示在父窗口上的 TextCtrl 框中。
def OnClick(self, e): wildcard = "Text Files (*.txt)|*.txt" dlg = wx.FileDialog(self, "Choose a file", os.getcwd(), "", wildcard, wx.OPEN) if dlg.ShowModal() == wx.ID_OK: f = open(dlg.GetPath(), 'r') with f: data = f.read() self.text.SetValue(data)
完整代码如下:
import wx import os class Mywin(wx.Frame): def __init__(self, parent, title): super(Mywin, self).__init__(parent, title = title) self.InitUI() def InitUI(self): self.count = 0 pnl = wx.Panel(self) vbox = wx.BoxSizer(wx.VERTICAL) hbox1 = wx.BoxSizer(wx.HORIZONTAL) hbox2 = wx.BoxSizer(wx.HORIZONTAL) self.text = wx.TextCtrl(pnl, size = (-1,200),style = wx.TE_MULTILINE) self.btn1 = wx.Button(pnl, label = "Open a File") self.Bind(wx.EVT_BUTTON, self.OnClick, self.btn1) hbox1.Add(self.text, proportion = 1, flag = wx.ALIGN_CENTRE) hbox2.Add(self.btn1, proportion = 1, flag = wx.RIGHT, border = 10) vbox.Add(hbox2, proportion = 1, flag = wx.ALIGN_CENTRE) vbox.Add(hbox1, proportion = 1, flag = wx.EXPAND|wx.ALIGN_CENTRE) pnl.SetSizer(vbox) self.Centre() self.Show(True) def OnClick(self, e): wildcard = "Text Files (*.txt)|*.txt" dlg = wx.FileDialog(self, "Choose a file", os.getcwd(), "", wildcard, wx.OPEN) if dlg.ShowModal() == wx.ID_OK: f = open(dlg.GetPath(), 'r') with f: data = f.read() self.text.SetValue(data) dlg.Destroy() ex = wx.App() Mywin(None, 'FileDialog Demo') ex.MainLoop()
以上代码产生以下输出:
wx.FontDialog 类
此类的对象是一个字体选择器对话框。此对话框的外观也是特定于操作系统的。所选字体的属性(如名称、大小、粗细等)作为此对话框的返回值返回。
此类构造函数所需的 Fontdata 参数用于初始化这些属性。
wx.FontDialog(parent, data)
此类的 GetFontData() 方法包含所选字体的参数。
以下演示 FontDialog 用法的代码包含一个按钮和一个标签(StaticText 对象)。
self.text = wx.StaticText(pnl, label = "hello") self.btn1 = wx.Button(pnl, label = "Choose Font")
单击按钮时会触发 OnClick() 事件处理程序函数。
def OnClick(self, e): dlg = wx.FontDialog(self,wx.FontData()) if dlg.ShowModal() == wx.ID_OK: data = dlg.GetFontData() font = data.GetChosenFont() self.text.SetFont(font) dlg.Destroy()
然后将所选字体应用于标签的文本。
完整代码如下:
import wx import os class Mywin(wx.Frame): def __init__(self, parent, title): super(Mywin, self).__init__(parent, title = title, size = (250,200)) self.InitUI() def InitUI(self): self.count = 0 pnl = wx.Panel(self) vbox = wx.BoxSizer(wx.VERTICAL) hbox1 = wx.BoxSizer(wx.HORIZONTAL) hbox2 = wx.BoxSizer(wx.HORIZONTAL) self.text = wx.StaticText(pnl, label = "hello") self.btn1 = wx.Button(pnl, label = "Choose Font") self.Bind(wx.EVT_BUTTON, self.OnClick, self.btn1) hbox1.Add(self.text, proportion = 1, flag = wx.ALIGN_CENTRE) hbox2.Add(self.btn1, proportion = 1, flag = wx.ALIGN_CENTRE, border = 10) vbox.Add(hbox2, flag = wx.ALIGN_CENTRE) vbox.Add(hbox1, proportion = 1, flag = wx.ALIGN_CENTRE) pnl.SetSizer(vbox) self.Centre() self.Show(True) def OnClick(self, e): dlg = wx.FontDialog(self,wx.FontData()) if dlg.ShowModal() == wx.ID_OK: data = dlg.GetFontData() font = data.GetChosenFont() self.text.SetFont(font) dlg.Destroy() ex = wx.App() Mywin(None,'FileDialog Demo') ex.MainLoop()
以上代码产生以下输出: