09 PyGTK 中的对话框
在教程的这个部分,我们将介绍对话框。
对话框窗口或者对话框是大多数现代GUI程序一个不可或缺的部分。对框框被定义为一个或更多人之间的对话。在计算机程序中,对话框就是用来与程序对话的窗口。并且反之亦然,对话框是用来输入数据,更改数据,改变应用程序的设置等。对话框是用户和计算机程序之间重要的交流途径。
Message dialogs
消息对话框是一种很便利的对话框,它为程序的用户提供各种消息。消息一般是由文本的和图像的数据组成。
Code:message.py
#!/usr/bin/python
# ZetCode PyGTK tutorial
#
# This example shows message
# dialogs
#
# author: jan bodnar
# website: zetcode.com
# last edited: February 2009
import gtk
class PyApp(gtk.Window):
def __init__(self):
super(PyApp, self).__init__()
self.set_size_request(250, 100)
self.set_position(gtk.WIN_POS_CENTER)
self.connect("destroy", gtk.main_quit)
self.set_title("Message dialogs")
table = gtk.Table(2, 2, True);
info = gtk.Button("Information")
warn = gtk.Button("Warning")
ques = gtk.Button("Question")
erro = gtk.Button("Error")
info.connect("clicked", self.on_info)
warn.connect("clicked", self.on_warn)
ques.connect("clicked", self.on_ques)
erro.connect("clicked", self.on_erro)
table.attach(info, 0, 1, 0, 1)
table.attach(warn, 1, 2, 0, 1)
table.attach(ques, 0, 1, 1, 2)
table.attach(erro, 1, 2, 1, 2)
self.add(table)
self.show_all()
def on_info(self, widget):
md = gtk.MessageDialog(self,
gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO,
gtk.BUTTONS_CLOSE, "Download completed")
md.run()
md.destroy()
def on_erro(self, widget):
md = gtk.MessageDialog(self,
gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR,
gtk.BUTTONS_CLOSE, "Error loading file")
md.run()
md.destroy()
def on_ques(self, widget):
md = gtk.MessageDialog(self,
gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_QUESTION,
gtk.BUTTONS_CLOSE, "Are you sure to quit?")
md.run()
md.destroy()
def on_warn(self, widget):
md = gtk.MessageDialog(self,
gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_WARNING,
gtk.BUTTONS_CLOSE, "Unallowed operation")
md.run()
md.destroy()
PyApp()
gtk.main()
在我们的例子中,我们展示了四种消息对话框,信息、警告、问题和错误消息对话框。
info = gtk.Button("Information")
warn = gtk.Button("Warning")
ques = gtk.Button("Question")
erro = gtk.Button("Error")
我们有四个按钮,每个按钮都会显示一种不同类型的消息对话框。
md = gtk.MessageDialog(self,
gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO,
gtk.BUTTONS_CLOSE, "Download completed")
md.run()
md.destroy()
如果我们点击info按钮,信息消息对话框将会显示。MESSAGE_INFO会被指定为这种对话框的类型,显示在对话框中的按钮将会被指定为BUTTON_CLOSE类型。最后一个参数是将要显示的消息内容。而对话框将用run()方法来显示,程序员还必须调用destroy()或者hide()方法。
Figure:Meaage
AboutDialog
关于对话框是显示关于程序信息的对话框。在关于对话框中能够显示logo,程序的名称,版本,版权说明,网站或者许可证信息。它还有可能给出作者、文档编写者、翻译者和艺术设计者相关的赞许信息。
Code:aboutdialog.py
#!/usr/bin/python
# ZetCode PyGTK tutorial
#
# This example demonstrates the
# AboutDialog dialog
#
# author: jan bodnar
# website: zetcode.com
# last edited: February 2009
import gtk
class PyApp(gtk.Window):
def __init__(self):
super(PyApp, self).__init__()
self.set_size_request(300, 150)
self.set_position(gtk.WIN_POS_CENTER)
self.connect("destroy", gtk.main_quit)
self.set_title("About battery")
button = gtk.Button("About")
button.set_size_request(80, 30)
button.connect("clicked", self.on_clicked)
fix = gtk.Fixed()
fix.put(button, 20, 20)
self.add(fix)
self.show_all()
def on_clicked(self, widget):
about = gtk.AboutDialog()
about.set_program_name("Battery")
about.set_version("0.1")
about.set_copyright("(c) Jan Bodnar")
about.set_comments("Battery is a simple tool for battery checking")
about.set_website("http://www.zetcode.com")
about.set_logo(gtk.gdk.pixbuf_new_from_file("battery.png"))
about.run()
about.destroy()
PyApp()
gtk.main()
这个代码示例使用了一个包含其一些特征的关于对话框。
about = gtk.AboutDialog()
我们创建了一个关于对话框。
about = gtk.AboutDialog()
about.set_program_name("Battery")
about.set_version("0.1")
about.set_copyright("(c) Jan Bodnar")
我们指定了名称、版本号和版权信息。
about.set_logo(gtk.gdk.pixbuf_new_from_file("battery.png"))
这一行创建了一个logo。
Figure:AboutDialog
FontSelectionDialog
字体选择对话框就是一种为了选择字体的对话框。在程序中,它有很典型的应用,如做一些文本编辑,或者文本格式化。
Code:fontdialog.py
#!/usr/bin/python
# ZetCode PyGTK tutorial
#
# This example works with the
# FontSelection dialog
#
# author: jan bodnar
# website: zetcode.com
# last edited: February 2009
import gtk
import pango
class PyApp(gtk.Window):
def __init__(self):
gtk.Window.__init__(self)
self.set_size_request(300, 150)
self.set_position(gtk.WIN_POS_CENTER)
self.connect("destroy", gtk.main_quit)
self.set_title("Font Selection Dialog")
self.label = gtk.Label("The only victory over love is flight.")
button = gtk.Button("Select font")
button.connect("clicked", self.on_clicked)
fix = gtk.Fixed()
fix.put(button, 100, 30)
fix.put(self.label, 30, 90)
self.add(fix)
self.show_all()
def on_clicked(self, widget):
fdia = gtk.FontSelectionDialog("Select font name")
response = fdia.run()
if response == gtk.RESPONSE_OK:
font_desc = pango.FontDescription(fdia.get_font_name())
if font_desc:
self.label.modify_font(font_desc)
fdia.destroy()
PyApp()
gtk.main()
在这个代码示例中,我们有一个按钮和一个标签。我们通过点击按钮来显示一个 FontSelectionDialog。
fdia = gtk.FontSelectionDialog("Select font name")
我们创建了一个 FontSelectionDialog。
if response == gtk.RESPONSE_OK: font_desc = pango.FontDescription(fdia.get_font_name()) if font_desc: self.label.modify_font(font_desc)
如果我们点击OK按钮,标签部件的内容的字体将变成我们在字体选择对话框中所选择的字体。
Figure:FontSelectionDialog
ColorSelectionDialog
颜色选择对话框是一种用来选择颜色的对话框。
Code:colordialog.py
#!/usr/bin/python
# ZetCode PyGTK tutorial
#
# This example works with the
# ColorSelection dialog
#
# author: jan bodnar
# website: zetcode.com
# last edited: February 2009
import gtk
class PyApp(gtk.Window):
def __init__(self):
super(PyApp, self).__init__()
self.set_size_request(300, 150)
self.set_position(gtk.WIN_POS_CENTER)
self.connect("destroy", gtk.main_quit)
self.set_title("Color Selection Dialog")
self.label = gtk.Label("The only victory over love is flight.")
button = gtk.Button("Select color")
button.connect("clicked", self.on_clicked)
fix = gtk.Fixed()
fix.put(button, 100, 30)
fix.put(self.label, 30, 90)
self.add(fix)
self.show_all()
def on_clicked(self, widget):
cdia = gtk.ColorSelectionDialog("Select color")
response = cdia.run()
if response == gtk.RESPONSE_OK:
colorsel = cdia.colorsel
color = colorsel.get_current_color()
self.label.modify_fg(gtk.STATE_NORMAL, color)
cdia.destroy()
PyApp()
gtk.main()
这个列子相对于前一个非常简单,这次我们改变标签的颜色。
cdia = gtk.ColorSelectionDialog("Select color")
我们创建了一个ColorSelectionDialog。
if response == gtk.RESPONSE_OK: colorsel = cdia.colorsel color = colorsel.get_current_color() self.label.modify_fg(gtk.STATE_NORMAL, color)
如果用花点击OK,我们就得到了所选择的颜色,并且来改变标签的颜色。
Figure:ColorSelectionDialog
在教程的这章中,我们用PyGTK内置的对话框来工作。