轉自http://dawndiy.com/archives/378/
PyGObject 學習筆記(8)-消息對話框
寫在前面,先扯點無聊的。這幾天回家纔有時間用電腦,剛好昨天升級了一下 Ubuntu 12.10 。然後當然也要更新一下學習筆記,學習在於堅持嘛~ 可能發現標題不同了,不錯,我在前幾天談到我的學習心得和經歷讓我做出了選擇,一定要向前,用GTK 3 所以選擇PyGObject。可以看我寫的《PyGtk or PyGObject》,也扯了一些有的沒的。
好了,正題開始,今天在一點點的碼自己的項目的時候要用到一個很重要的東西,那就是“消息對話框”,即 Message Dialog 。這個是什麼了,如果你不知道那就快回火星吧!上圖!
對,就是上面這個圖,你見過吧。消息對話框在程序中隨處可見,他的作用就是提示或彈出一個信息讓用戶得知,所以消息對話框在交互方面和用戶體驗方面也是挺重要的。
在GTK 3中,構建消息對話框的類是MessageDialog。下面來看一下這個類:
class Gtk.MessageDialog(parent=None, flags=0, type=Gtk.MESSAGE_INFO, buttons=Gtk.BUTTONS_NONE, message_format=None)
parent
:
父控件,一般是窗體
flags
:
對話框標識,可以是 Gtk.DialogFlags.MODAL,Gtk.DIALOG_DESTROY_WITH_PARENT
或 0
type
:
消息的類型,可以是 Gtk.MESSAGE_INFO
, Gtk.MESSAGE_WARNING
,
Gtk.MESSAGE_QUESTION
或Gtk.MESSAGE_ERROR
.
buttons
:
可以使用預定義的按鈕: Gtk.BUTTONS_NONE
, Gtk.BUTTONS_OK
,
Gtk.BUTTONS_CLOSE
, Gtk.BUTTONS_CANCEL
, Gtk.BUTTONS_YES_NO
,
Gtk.BUTTONS_OK_CANCEL 等
message_format
:
消息的內容
Returns :
G``tk.MessageDialog
上面就是構造消息對話框的 MessageDialog 類啦。
現在看一下我們最上面那個圖的代碼是怎麼樣的:
dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO,Gtk.ButtonsType.OK, "這是一個信息消息對話框")
dialog.format_secondary_text("這裏是副文本用於說明信息。")
dialog.run()
dialog.destroy()
這是一個消息對話框的部分代碼。是不是很簡單,然而上面多了幾個函數下面解釋:
dialog.format_secondary_text("這裏是副文本用於說明信息。")
這個看圖也知道啊,就是現實在下面的副文本,可以用來顯示解釋性文字。
dialog.run()
dialog.destroy()
run執行後,對話框就會顯示了,這時候對話框不會馬上去執行後面的destroy來銷燬,而是等待我們的一個按鍵響應再來銷燬,所以這就是消息對話框有按鈕的原因了。
上面的例子我們沒有或得到按鍵響應,其實我們的按鍵響應就是由 dialog.run() 來返回的,所以中斷在它這裏嘛~那我們再看一個能獲取按鍵的例子,慣例,上圖先:
看吧,這樣的消息對話框就有兩個按鈕分別讓你選擇。看下局部代碼:
dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, "這是一個詢問消息對話框")
dialog.format_secondary_text("這裏是副文本用於說明信息。")
response = dialog.run()
if response == Gtk.ResponseType.YES:
print("YES button is clicked")
elif response == Gtk.ResponseType.NO:
print("NO button is clicked")
dialog.destroy()
看到代碼中我們定義了一個名爲 response 的變量來接受 dialog.run() 的返回,然後再做出判斷分別處理就OK啦。。。
好了,差不多就這些吧~大家可以試一試,我把寫好的一個完整的 Demo 貼出來:
#!/usr/bin/env python
# -*- coding: utf-8 -*
# MessageDialog
# PyGtk Study Notes By DawnDIY
# http://www.dawndiy.com
from gi.repository import Gtk
class MessageDialogWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="MessageDialog Example")
box = Gtk.Box(spacing=6)
self.add(box)
button1 = Gtk.Button("信息")
button1.connect("clicked", self.on_info_clicked)
box.add(button1)
button2 = Gtk.Button("錯誤")
button2.connect("clicked", self.on_error_clicked)
box.add(button2)
button3 = Gtk.Button("警告")
button3.connect("clicked", self.on_warn_clicked)
box.add(button3)
button4 = Gtk.Button("詢問")
button4.connect("clicked", self.on_question_clicked)
box.add(button4)
def on_info_clicked(self, widget):
dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO,
Gtk.ButtonsType.OK, "這是一個信息消息對話框")
dialog.format_secondary_text(
"這裏是副文本用於說明信息。")
dialog.run()
print "INFO dialog closed"
dialog.destroy()
def on_error_clicked(self, widget):
dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.ERROR,
Gtk.ButtonsType.CANCEL, "這是一個錯誤消息對話框")
dialog.format_secondary_text("這裏是副文本用於說明信息。")
dialog.run()
print "ERROR dialog closed"
dialog.destroy()
def on_warn_clicked(self, widget):
dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.WARNING,
Gtk.ButtonsType.OK_CANCEL, "這是一個警告消息對話框")
dialog.format_secondary_text(
"這裏是副文本用於說明信息。")
response = dialog.run()
if response == Gtk.ResponseType.OK:
print "OK button is clicked"
elif response == Gtk.ResponseType.CANCEL:
print "CANCEL button is clicked"
dialog.destroy()
def on_question_clicked(self, widget):
dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION,
Gtk.ButtonsType.YES_NO, "這是一個詢問消息對話框")
dialog.format_secondary_text(
"這裏是副文本用於說明信息。")
response = dialog.run()
if response == Gtk.ResponseType.YES:
print "YES button is clicked"
elif response == Gtk.ResponseType.NO:
print "NO button is clicked"
dialog.destroy()
win = MessageDialogWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()