12 wxPython 对话类


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

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

wx.Dialog支持使用Sizer作为wx.Frame对象。因此,可以设计自定义对话框。

Wx.Dialog类构造函数采用以下常用参数

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

“对话框”窗口小部件的默认外观仅显示标题栏中的“关闭”框。但是,它可以使用以下样式参数的组合进行自定义 -

下面给出了Dialog最常用的参数。

序号 参数和描述
1

wx.CAPTION

在对话框上添加标题

2

wx.DEFAULT_DIALOG_STYLE

相当于wxCAPTION,wxCLOSE_BOX和wxSYSTEM_MENU的组合

3

wx.RESIZE_BORDER

在窗口周围显示可调整大小的框架

4

wxSYSTEM_MENU

显示系统菜单

wx.CLOSE_BOX

在框架上显示关闭框

6

wx.MAXIMIZE_BOX

在对话框中显示最大化框

7

wx.MINIMIZE_BOX

在对话框中显示最小化框

8

wx.STAY_ON_TOP

确保对话框保持在所有其他窗口之上

9

wx.DIALOG_NO_PARENT

Prevents creating orphan dialog. Not recommended for modal dialogs

为这个类定义了两个偶数绑定器 -

下面给出了最常用的Dialog事件。

序号 活动和描述
1

EVT_CLOSE

当用户或编程方式关闭对话框时

2

EVT_INIT_DIALOG

初始化对话框时

如上所述,Dialog的目标是收集数据并返回父窗口。但是,Dialog类可以使用一些有用的方法。

以下是Dialog最常用的方法。

序号 方法和描述
1

DoOK()

按下对话框上的“确定”按钮时调用

2

ShowModal()

以应用程序模式方式显示对话框

3

ShowWindowModal()

对话框仅对顶级父窗口是模态的

4

EndModal()

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

其中一个预配置的对话框是MessageDialog。它用于显示具有标准ID的按钮的一行或多行的消息。这是MessageDialog上标准按钮的选择列表。

下面给出了最常用的Dialog按钮。

序号 按钮和说明
1

wx.OK

显示确定按钮

2

wx.CANCEL

显示取消按钮

3

wx.YES_NO

显示是,否按钮

4

wx.YES_DEFAULT

默认为“是”按钮

wx.NO_DEFAULT

默认情况下没有按钮

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)

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

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

下面给出了Dialog的模态和无模式行为的简单演示。父窗口是一个带有两个按钮的wx.Frame对象。第一个按钮上的Click事件以模态方式显示对话框。因此,在关闭对话框之前,将阻止对父窗口的任何操作。第二个按钮显示无模式对话框,该对话框不会妨碍对父窗口的访问。第三个按钮显示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参数是要在标题栏中显示的字符串。文本框中的默认字符串是参数alue。对话框中的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()

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

文本输入输出

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

仅限保存对话框:提示确认是否覆盖文件

wx.FD_MULTIPLE

仅限打开对话框:允许选择多个文件

6

wx.FD_CHANGE_DIR

将当前工作目录更改为用户选择的文件所在的目录

wx.FileDialog类的成员函数

下面给出了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()

上面的代码产生以下输出

字体对话框演示输出