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.yiibai.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.yiibai.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.yiibai.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.yiibai.com')
ex.MainLoop()
上面的代碼產生下面的輸出 -