wxPython 对话框类

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

以上代码产生以下输出 –

wxPython 对话框类

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

上面的代码产生以下输出 –

wxPython 对话框类

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

以上代码产生以下输出−

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教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程