- wxPython 教程
- wxPython - 首頁
- wxPython - 簡介
- wxPython - 環境
- wxPython - Hello World
- wxPython - GUI 構建工具
- wxPython - 主要類
- wxPython - 事件處理
- wxPython - 佈局管理
- wxPython - 按鈕
- wxPython - 可停靠視窗
- 多文件介面
- wxPython - 繪圖 API
- wxPython - 拖放
- wxPython 資源
- wxPython - 快速指南
- wxPython - 有用資源
- wxPython - 討論
wxPython - 對話方塊類
雖然一個對話方塊類物件看起來像一個框架,但它通常用作父框架頂部的彈出視窗。對話方塊的目的是從使用者那裡收集一些資料並將其傳送到父框架。對話方塊框架可以是模態的(它會阻塞父框架)或非模態的(對話方塊框架可以被繞過)。ShowModal() 方法以模態方式顯示對話方塊框架,而 Show() 則使其成為非模態的。
wxPython 有許多預配置的對話方塊小部件,例如 MessageDialog、FileDialog、FontDialog 等。
wx.Dialog 支援使用 Sizers,就像 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 當對話方塊正在初始化時 |
如上所述,對話方塊的目的是收集資料並返回到父視窗。但是,對話方塊類有一些有用的方法可用。
| 序號 | 方法及描述 |
|---|---|
| 1 | DoOK() 當按下對話方塊上的“確定”按鈕時呼叫 |
| 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 將“否”按鈕設為預設按鈕 |
| 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 引數,而標題顯示在標題欄中。預設樣式引數是 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)
要顯示在對話方塊視窗上的文字作為 message 引數傳遞。caption 引數是要顯示在標題欄中的字串。文字框中的預設字串是 vthe alue 引數。對話方塊中的 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)
message 表示要顯示的文字。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()
以上程式碼產生以下輸出: