对话框分为模态对话框、提示对话框、文本对话框、打开文件对话框等多种类型。在wxpthon中对话框都继承自wx.Dialog类。下面展示一下这些对话框。
一、对话框的创建和使用与Frame相似,不同的对话框表示一次信息交换的活动。当完成交换后,单击对话框的按钮将关闭该对话框,对话框只是应用程序生命周期的一部分。
#对话框的创建
import wx
#定义窗口类MyFrame,包含aboutMenu子菜单并单击创建MyDialog对话框
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,-1,u'自定义对话框',size=(300,200))
MenuHelp = wx.Menu()
aboutMenu = MenuHelp.Append(-1,u'关于(&A)')
menuBar = wx.MenuBar()
menuBar.Append(MenuHelp,u'帮助(&H)')
self.Bind(wx.EVT_TOOL,self.ShowAboutDlg,aboutMenu)
self.SetMenuBar(menuBar)
#定义showaboutdlg(),用该函数创建显示aboutmenu菜单
def ShowAboutDlg(self,evt):
pos = self.GetPosition()
#创建对话框dialog,并显示MyFrame的相对位置
dialog = MyDialog(self,-1,u'关于')
dialog.SetPosition((pos[0] + 100,pos[1] + 60))
#创建了MyDialog对话框类,继承自wx.Dialog,创建 确定 按钮打开对话框
class MyDialog(wx.Dialog):
def __init__(self,parent,id,title):
wx.Dialog.__init__(self,parent,id,title,size=(100,100))
self.panel = wx.Panel(self)
self.OkBtn = wx.Button(self,10,u'确定',pos=(10,20),size=(80,30))
self.Bind(wx.EVT_BUTTON,self.CloseDlg,self.OkBtn)
self.Show() #调用show()显示对话框
def CloseDlg(self,evt):
self.Close()
if __name__=='__main__':
app = wx.PySimpleApp()
MyFrame().Show()
app.MainLoop()
#由于模态对话框的约束性,因此模态对话框通常作为获取数据的窗口。
#只有从模态对话框中返回数据后,才能关闭对话框
二、提示对话框有助于用户体验的完善,例如,退出应用程序时显示退出提示,删除数据时显示删除提示。
#提示对话框:通常用于帮助用户进行交互式操作
import wx
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,-1,u'对话框',size=(300,200))
button = wx.Button(self,wx.ID_OK,u'退出',pos=(10,10))
button.SetDefault()
self.Bind(wx.EVT_BUTTON,self.OnClick,button)
#创建对话框,根据wx.YES_NO,生成“是”、“否”按钮
def OnClick(self,evt):
#使用MessageDialog()类创建选择对话框
dlg = wx.MessageDialog(None,u'是否退出?',u'退出',wx.YES_NO|wx.ICON_QUESTION)
#判断用户选择的返回值
if(dlg.ShowModal() == wx.ID_YES):
frame.Close() #关闭主程序
#调用释放对话框对象
dlg.Destroy()
if __name__=='__main__':
app = wx.PySimpleApp()
frame = MyFrame()
frame.Show()
app.MainLoop()
三、文本输入对话框:用于返回输入字符串的值,通常由一个静态文本框、一个输入文本框和OK、Cancel按钮组成,可由wx.TextEnTryDialog类创建。
import wx
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,-1,"TextEntryDialog",size=(300,200))
panel = wx.Panel(self,-1)
#创建TextCtrl实例textCtrl,并用wx.TE_PROCESS_ENTER处理回车事件
self.textCtrl = wx.TextCtrl(panel,-1," ",pos=(10,10),style=wx.TE_PROCESS_ENTER)
self.textCtrl.Bind(wx.EVT_TEXT_ENTER,self.OnClick,self.textCtrl)
def OnClick(self,evt):
#创建文本对话框,包含“ok”和“cancel”按钮
self.dialog = wx.TextEntryDialog(None,u'输入文本',u'文本对话框',"",style=wx.OK|wx.CANCEL)
#当按下OK按钮时
if self.dialog.ShowModal() == wx.ID_OK:
#获取文本输入内容,调用SetLabel把文本填入textCtrl控件的文本框
self.textCtrl.SetLabel(self.dialog.GetValue())
if __name__=='__main__':
app = wx.PySimpleApp()
MyFrame().Show()
app.MainLoop()
#创建1个TextCtrl控件,当按下回车键后,将显示TextEntryDialog对话框
#用户输入文本后,单击“OK”按钮将把输入的值返回给TextCtrl控件
四、特殊对话框:包括打开文本对话框、字体对话框、颜色选择对话框。打开文件对话框由wx.FileDialog类创建。
#演示“打开”文件对话框的创建和使用方法
import wx
import os
#创建打开文件对话框,显示当前目录中的文件,并可对类型进行过滤
def ShowFileDialog():
#文件类型的下拉列表提供“py”为后缀的文件和所有文件两种类型
filterFile = "Python source(*.py)|*.py|All files(*.*)|*.*" #过滤文件
#对话框dialog。os.getcwd()获取当前文件所在的路径
dialog = wx.FileDialog(None,u'选择文件',os.getcwd(),"",filterFile,wx.ART_FILE_OPEN)
#以模式对话框的形式显示dialog对象
dialog.ShowModal()
dialog.Destroy()
if __name__=='__main__':
app = wx.PySimpleApp()
ShowFileDialog()
app.MainLoop()
五、窗口与对话框的交互,对话框中的组件支持验证能力,而窗口不支持组件内容的验证。wx.PyValidator类的TransferWindow()和TransfromWindow()这两个方法实现窗口和对话框的交互。前者方法用于对话框打开时执行,后者方法用于对话框关闭的调用,可以实现窗口与对话框的数据交换。
#创建Frame窗口,该窗口用于计算两个数字的和
import wx
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,-1,u"对话框的验证",size=(300,200))
panel = wx.Panel(self,-1)
sizer = wx.BoxSizer(wx.HORIZONTAL)
self.addTextCtrl = wx.TextCtrl(panel,-1,"",pos=(10,10))
addStaticText = wx.StaticText(panel,-1,"+")
self.addTextCtrl2 = wx.TextCtrl(panel,-1,"")
btn = wx.Button(panel,-1,u'计算')
btn.Bind(wx.EVT_BUTTON,self.OnClick,btn)
sizer.Add(self.addTextCtrl)
sizer.Add(addStaticText)
sizer.Add(self.addTextCtrl2)
sizer.Add(btn)
panel.SetSizer(sizer)
panel.Fit()
def OnClick(self,event):
#定义字典data,把两个文本框中的数字存放到字典中
data = {0:self.addTextCtrl.GetValue(),1:self.addTextCtrl2.GetValue()}
dlg = MyDialog(data)
dlg.ShowModal()
dlg.Destroy()
演示设计执行计算的对话框类,该对话框接收窗口定义的字典数据,然后进行计算。
#演示设计执行计算的对话框类
class MyDialog(wx.Dialog):
def __init__(self,data):
wx.Dialog.__init__(self,None,-1,u'验证器')
addStaticText = wx.StaticText(self,-1,u'数字1:')
addStaticText2 = wx.StaticText(self,-1,u'数字2:')
self.addTextCtrl = wx.TextCtrl(self,validator = DataValidator(data,0))
self.addTextCtrl2 = wx.TextCtrl(self,validator = DataValidator(data,1))
btn = wx.Button(self,wx.ID_OK,u'确定')
btn.Bind(wx.EVT_BUTTON,self.OnClick,btn)
btn.SetDefault()
sizer = wx.BoxSizer(wx.VERTICAL)
gridSizer = wx.FlexGridSizer(2,2,5,5)
gridSizer.Add(addStaticText,0,wx.ALIGN_LEFT)
gridSizer.Add(self.addTextCtrl,0,wx.EXPAND)
gridSizer.Add(addStaticText2,0,wx.ALIGN_LEFT)
gridSizer.Add(self.addTextCtrl2,0,wx.EXPAND)
sizer.Add(gridSizer,0,wx.EXPAND|wx.ALL,5)
sizer.Add(btn,0,5)
self.SetSize(sizer)
sizer.Fit(self)
def OnClick(self,evt):
result = float(self.addTextCtrl.GetValue()) + float(self.addTextCtrl2.GetValue())
wx.MessageBox(str(result),u'结果')
self.Close()
用DataValidator类实现创建数据的接收。
class DataValidator(wx.PyValidator):
#定义构造函数,用于接收data字典和相应的索引
def __init__(self,data,key):
wx.PyValidator.__init__(self)
self.data = data
self.key = key
#覆盖close()方法,返回验证器的拷贝
def Clone(self): #close()方法必须实现
return DataValidator(self.data,self.key)
def Validata(self,w): #验证数据
return True
def TransferToWindow(self): #对话框打开时调用
textCtrl = self.GetWindow() #获得当前组件
#通过索引key查找当前组件的值,即把窗口文本框的内容传递给对话框的文本框
textCtrl.SetValue(self.data.get(self.key,""))
return True
def TransferFromWindow(self): #对话框关闭时调用
return True
在DataValidator类的validata()方法实现对组件数据的验证,有兴趣者可以自己编写一些相关的验证规则来丰富对话框的验证功能。
(好久没来写笔记了,希望大家勤快点哦)