wxPython – 对话框类

wxPython – 对话框类

尽管 Dialog类 对象看起来像一个 Frame ,但它通常被用作父框架上的一个弹出式窗口。对话框的目的是收集用户的一些数据并将其发送给父框架。对话框可以是模态的(它阻止父框架)或无模式的(对话框可以被绕过)。ShowModal()方法以模态方式显示对话框,而Show()则使其无模式。

wxPython有许多预配置的Dialog部件,如MessageDialog、FileDialog、FontDialog等。

wx.Dialog支持使用Sizer,就像wx.Frame对象一样。因此,可以设计一个自定义的Dialog。

Wx.Dialog类的构造函数需要以下常用参数

wx.Dialog(parent, id, title, pos, size, style)

对话框部件的默认外观在标题栏中只显示关闭框。然而,它可以使用以下风格参数的组合来定制。

下面是最常用的对话框的参数 。 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 在框架上显示一个关闭框
6 wx.MAXIMIZE_BOX 在对话框上显示一个最大化框
7 wx.MINIMIZE_BOX 在对话框中显示一个最小化框。
8 wx.STAY_ON_TOP 确保对话框保持在所有其他窗口的顶部。
9 wx.DIALOG_NO_PARENT 防止创建无主对话框。不建议用于模态对话框

为这个类定义了两个甚至是绑定器-

下面是最常用的对话框事件 。 S.N. 事件和描述
1 EVT_CLOSE 当对话框被用户或以程序方式关闭时
2 EVT_INIT_DIALOG 当对话框正在被初始化时

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

下面给出的是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 显示取消按钮
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 显示一个问题图标

消息对话框

这是用下面的构造函数声明的–

wx.MessageDialog(parent, message, caption, style, pos)

要显示的一行或多行文字是消息参数,而标题栏上显示的是字幕。默认的样式参数是wx.OK|wx.ECNRE。其他样式参数允许对消息框进行定制。

wx.MessageBox是一个方便的函数,用于构建一个消息框,而不是使用MessageDialog。

例子

下面是一个简单的Dialog的模式和无模式行为的演示。父窗口是一个带有两个按钮的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()

上述代码产生了以下输出 —

wxPython - 对话框类

wx.TextEntryDialog

该类的对象显示一个对话框,其中有一个文本字段,一个可定制的标签,提示用户输入和两个具有预定义样式的按钮。

虽然这个对话框要求单行输入,但文本框可以通过使用TextCtrl样式(如密码和多行)进行自定义。

当用户点击OK按钮时,文本字段的内容被收集为返回值。

TextEntryDialog的构造函数如下所示

wx.TextEntryDialog(parent, id, message, caption, value, style, pos)

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

TextEntry类的其他方法如下表所示

下面给出的是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') 
ex.MainLoop()

上述代码产生了以下输出 —

wxPython - 对话框类

wx.FileDialog类

该类代表一个文件选择器对话框。它使用户能够在文件系统中导航,并选择一个文件来打开或保存。对话框的外观是操作系统特定的。

一个文件过滤器也可以被应用来只显示指定扩展名的文件。 起始目录和默认文件名也可以被设置。

FileDialog构造函数的原型看起来像这样

wx.FileDialog(parent, message, DefaultDir, DefaultFile, wildcard, style, pos, size)

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

Style parameters defined for FileDialog are −

下面给出的是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类的成员函数-

下面给出了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') 
ex.MainLoop()

上述代码产生了以下输出 —

wxPython - 对话框类

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()

上述代码产生的输出结果如下 –

wxPython - 对话框类

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程