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.tw511.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.tw511.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.tw511.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.tw511.com') 
ex.MainLoop()

上面的程式碼產生下面的輸出 -