wxPython - Dialog 类

  • 简述

    虽然Dialog class对象看起来像一个Frame,它通常用作父框架顶部的弹出窗口。Dialog 的目标是从用户那里收集一些数据并将其发送到父框架。对话框框架可以是模态的(它阻止父框架)或非模态的(可以绕过对话框)。ShowModal() 方法以模态方式显示对话框框架,而 Show() 使其无模式。
    wxPython 有许多预配置的 Dialog 小部件,例如 MessageDialog、FileDialog、FontDialog 等。
    wx.Dialog 支持将 Sizer 用作 wx.Frame 对象。因此,可以设计自定义对话框。
    Wx.Dialog 类构造函数采用以下常用参数 -
    
    wx.Dialog(parent, id, title, pos, size, style)
    
    对话框小部件的默认外观仅在标题栏中显示关闭框。但是,可以使用以下样式参数的组合对其进行自定义 -
    序列号 参数及说明
    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
    防止创建孤立对话框。不推荐用于模态对话框
    为此类定义了两个偶数活页夹 -
    序列号 事件和描述
    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
    显示确定按钮
    2
    wx.CANCEL
    显示取消按钮
    3
    wx.YES_NO
    显示是,否按钮
    4
    wx.YES_DEFAULT
    将“是”按钮设为默认值
    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。

    例子

    下面给出了对话框的模态和非模态行为的简单演示。父窗口是一个带有两个按钮的 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()
    
    上面的代码产生以下输出 -
    消息对话框输出
  • wx.TextEntryDialog

    此类的对象显示一个带有一个文本字段的对话框、一个提示用户输入的可自定义标签和两个具有预定义样式的按钮。
    尽管此对话框要求单行输入,但可以使用 TextCtrl 样式(如密码和多行)自定义文本框。
    当用户单击确定按钮时,文本字段的内容被收集为返回值。
    TextEntryDialog 构造函数如下 -
    
    wx.TextEntryDialog(parent, id, message, caption, value, style, pos)
    
    要在对话框窗口上显示的文本作为消息参数传递。caption 参数是要在标题栏中显示的字符串。文本框中的默认字符串是 vthe 参数。对话框中的 TextCtrl 可以配置为显示密码字符 (wx.TE_PASSWORD) 和/或多行 (wx.TE_MULTILINE)。
    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 定义的样式参数是 -
    序列号 参数及说明
    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 类的成员函数 -
    序列号 功能与说明
    1
    GetDirectory()
    返回默认目录
    2
    GetFileName()
    返回默认文件名
    3
    GetPath()
    返回所选文件的完整路径
    4
    SetDirectory()
    设置默认目录
    5
    SetFilename()
    设置默认文件
    6
    SetPath()
    设置完整路径
    7
    ShowModal()
    显示对话框,如果用户单击确定按钮返回 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()
    
    上面的代码产生以下输出 -
    文件对话框演示 选择一个文件 文件对话框演示输出
  • 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()
    
    上面的代码产生以下输出 -
    字体对话框演示输出