wxPython 对话框类
尽管一个 对话框类 对象看起来像一个 窗口 ,但通常它被用作父窗口上方的弹出窗口。对话框的目的是从用户那里收集一些数据并将其发送给父窗口。对话框窗口可以是模态的(阻塞父窗口)或非模态的(可以绕过对话框窗口)。 ShowModal()方法以模态的方式显示对话框窗口,而Show()方法使其变为非模态。
wxPython有许多预配置的对话框小部件,例如MessageDialog、FileDialog、FontDialog等。
与wx.Frame对象一样,wx.Dialog支持使用Sizers。因此,可以设计自定义的对话框。
Wx.Dialog类的构造函数接受以下常用参数 –
wx.Dialog(parent, id, title, pos, size, style)
默认情况下,Dialog窗口小部件的标题栏只显示关闭框。但是,可以使用以下样式参数的组合进行自定义。
以下是Dialog最常用的参数。
序号 | 参数和描述 |
---|---|
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 防止创建孤立的对话框。不推荐用于模态对话框 |
为此类定义了两个事件绑定器。
以下是Dialog最常用的事件。
序号 | 事件和描述 |
---|---|
1 | EVT_CLOSE 当用户或程序关闭对话框时 |
2 | EVT_INIT_DIALOG 当对话框被初始化时 |
如上所述,Dialog的目标是收集数据并返回给父窗口。但是,Dialog类还提供了一些有用的方法。
下面是对话框最常用的方法说明。
序号 | 方法 & 描述 |
---|---|
1 | DoOK() 当对话框的OK按钮被按下时调用 |
2 | ShowModal() 以应用程序模态方式显示对话框 |
3 | ShowWindowModal() 对话框仅模态于顶层父窗口 |
4 | EndModal() 结束模态对话框,并传递ShowModal的调用传值 |
其中一个预配置的对话框是MessageDialog。它用于显示一个或多个行的消息,带有具有标准ID的按钮。下面是MessageDialog上的标准按钮的选择列表。
下面是对话框最常用的按钮说明。
序号 | 按钮 & 描述 |
---|---|
1 | wx.OK 显示OK按钮 |
2 | wx.CANCEL 显示取消按钮 |
3 | wx.YES_NO 显示是、否按钮 |
4 | wx.YES_DEFAULT 将Yes按钮设为默认 |
5 | wx.NO_DEFAULT 将No按钮设为默认 |
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 参数,而标题将显示在标题栏上。默认 style 参数为 wx.OK|wx.ECNRE。其他的 style 参数允许自定义消息框。
wx.MessageBox 是一个便利函数,用于构建消息框,而不是使用 MessageDialog。
示例
以下是一个简单的模态和非模态对话框行为示例。父窗口是一个具有两个按钮的 wx.Frame 对象。单击第一个按钮以模态方式显示一个对话框。因此,在对话框关闭之前,禁止对父窗口进行任何操作。第二个按钮显示一个非模态对话框,不会阻碍对父窗口的访问。第三个按钮显示一个消息框。
完整的代码如下所示:
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样式(如password和multiline)自定义文本框。
当用户点击确定按钮时,将收集文本框中的内容作为返回值。
TextEntryDialog构造函数如下所示:
wx.TextEntryDialog(parent, id, message, caption, value, style, pos)
要显示在对话框窗口上的文本是作为消息参数传递的。标题栏中要显示的字符串是标题参数。文本框中的默认字符串是值参数。对话框中的TextCtrl可以配置为显示密码字符(wx.TE_PASSWORD)和/或多行文本(wx.TE_MULTILINE)。
TextEntry类的其他方法如下表所示 –
以下是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)
该消息表示要显示的文本。DefaultDir是初始目录。可以将一个或多个文件类型设置为通配符参数表示的文件过滤器。
为FileDialog定义的样式参数为-
下面是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 将当前工作目录更改为用户选择的文件所在的目录 |
FileDialog类的成员函数:
下面是wx.FileDialog最常用的函数
序号 | 函数和描述 |
---|---|
1 | GetDirectory() 返回默认目录 |
2 | GetFileName() 返回默认文件名 |
3 | GetPath() 返回选定文件的完整路径 |
4 | SetDirectory() 设置默认目录 |
5 | SetFilename() 设置默认文件 |
6 | SetPath() 设置完整路径 |
7 | ShowModal() 显示对话框,如果用户点击确定按钮则返回wx.ID_OK,否则返回wx.ID_CANCEL |
示例
在以下示例中,顶层框架显示一个按钮和一个多行文本控件。
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()
上述代码产生以下输出 –