wxPython Dialog类

虽然Dialog类对象将显示像Frame,它通常被用作上的父框架的顶部上的弹出窗口。Dialog的目的是从用户收集一些数据并将其发送到父frame。对话框 Dialog 可以模态(它阻止父帧)或无模式(对话框架可被绕过)。 ShowModal()方法显示模态方式对话框frame,Show() 使得它无模式。
wxPython中有一些预配置对话框控件,如:MessageDialog,FileDialog,FontDialog类等。
wx.Dialog支持使用Sizers 仅仅作为一个wx.Frame对象。因此,定制的Dialog可设计。
wx.Dialog类的构造函数如下常用的参数 -
wx.Dialog(parent, id, title, pos, size, style) 

Dialog控件的默认外观显示在标题栏中只关闭对话框。但是,它可以用下面的风格参数的组合进行定制−

S.N. 参数 & 描述
1

wx.CAPTION

对话框的文字说明
2

wx.DEFAULT_DIALOG_STYLE

相当于wxCAPTION,wxCLOSE_BOX和wxSYSTEM_MENU的组合
3

wx.RESIZE_BORDER

显示可调框架窗口的大小
4

wxSYSTEM_MENU

显示系统菜单
5

wx.CLOSE_BOX

框架(frame)上显示一个关闭
6

wx.MAXIMIZE_BOX

在对话框中显示一个最大化框
7

wx.MINIMIZE_BOX

在对话框中显示一个最小化框(frame)
8

wx.STAY_ON_TOP

确保对话框停留在所有其他窗口的顶部
9

wx.DIALOG_NO_PARENT

为防止产生无看管对话框。不推荐用于模态对话框
两个事件由绑定器定义该类-
S.N.
事件和说明
1

EVT_CLOSE

当用户或编程对话框的关闭
2

EVT_INIT_DIALOG

When the dialog is being initialized

如上所述,对话的目的是收集数据并返回到父窗口。然而,一些有用的方法可用于 Dialog类。

S.N.
方法和说明
1

DoOK()

当对话框中的OK按钮被按下时调用
2

ShowModal()

显示了在应用程序模态方式的对话框
3

ShowWindowModal()

对话框只顶层父窗口的模式
4

EndModal()

ShowModal调用传递值结束一个对话框模式

一个预配置的对话框是MessageDialog。它用于显示的一条或多条线用具有标准ID的按钮的消息。 下面是对MessageDialog标准按钮选择列表。

S.N.
按钮和说明
1

wx.OK

显示OK按钮
2

wx.CANCEL

显示取消(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) 

一个或多个消息参数要显示文本的行,文字说明显示在标题栏。默认style参数是wx.OK| wx.ECNRE。 其他样式style参数允许消息框进行定制。

wx.MessageBox是一个方便的功能,使用MessageDialog构建代替消息框。

实例

下面给出的是对话的模式和无模式的行为简单的演示。父窗口是wx.Frame对象带有两个按钮。Click事件的第一个按钮将显示在模态的方式的对话框。因此,防止父窗口上的任何操作,直到对话框关闭。第二个按钮,将显示一个无模式对话框,这并不妨碍访问父窗口。第三个按钮会显示一个消息框。

整个代码如下 -
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,'Dialog Demo - www.xuhuhu.com') 
ex.MainLoop()
上面的代码产生下面的输出 -



wx.TextEntryDialog

这个类的对象显示一个文本字段,可定制的标签,提示用户输入以及两个按钮使用预定义样式的对话框。
虽然这个对话框要求一行输入,文本框可以通过使用TextCtrl风格,如密码和多进行定制。
文本字段收集内容,当用户点击OK按钮返回相应值。TextEntryDialog构造如下 -
wx.TextEntryDialog(parent, id, message, caption, value, style, pos) 

在对话窗口传递的消息参数要显示的文字。caption 参数是要显示在标题栏的字符串。在文本框中默认字符串值value参数。TextCtrl在对话框可以设置显示密码字符(wx.TE_PASSWORD)和/或多行(wx.TE_MULTILINE)。

TextEntry 类的其他方法如下列表中 -
S.N.
方法和说明
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 - www.xuhuhu.com') 
ex.MainLoop()
上面的代码产生下面的输出 -



wx.FileDialog类

此类表示一个文件选择对话框。它使用户可以浏览文件系统并选择要打开文件或保存。对话框的外观是由操作系统特定的。

文件滤波器也可以应用到只显示指定扩展名的文件。启动目录和默认的文件名也可以设置。
FileDialog的构造函数的原型是这样的 -
wx.FileDialog(parent, message, DefaultDir, DefaultFile, wildcard, style, pos, size) 

该消息表示将要显示的文本。 DefaultDir是初始目录。一个或多个类型的文件可以被设置为通过通配符参数所表示的文件的过滤器。

FileDialog定义风格参数 -
S.N.
参数和说明
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类的成员函数 -
S.N.
函数与说明
1

GetDirectory()

返回默认目录

2

GetFileName()

返回默认文件名

3

GetPath()

返回选定文件的完整路径
4

SetDirectory()

设置默认目录

5

SetFilename()

设置默认文件

6

SetPath()

设置文件路径

7

ShowModal()

显示对话框,如果用户单击OK按钮返回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 - www.xuhuhu.com') 
ex.MainLoop()
上面的代码产生下面的输出 -



wx.FontDialog 类

这个类的对象是一个字体选择对话框。这个对话框的外观也为操作系统特有的。属性,例如名称,大小,权重等。所选字体的形式返回作为此对话框的返回值。

需要这种类构造Fontdata参数用于初始化这些属性。
wx.FontDialog(parent, data)
此类的GetFontData()方法包含所选字体的参数。
下面的代码展示了如何使用FontDialog类的有一个按钮和一个标签(静态文本对象)。
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()
选择字体,然后应用到标签的文本。
FileDialog-2.py 完整的代码如下 -
import wx 
import os 

class Mywin(wx.Frame): 
            
   def __init__(self, parent, title): 
      super(Mywin, self).__init__(parent, title = title, size = (400, 300))  
         
      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 - www.xuhuhu.com') 
ex.MainLoop()

上面的代码产生下面的输出 -



上一篇: wxPython ToolBar类 下一篇: wxPython SplitterWindow类