原文: http://zetcode.com/gui/pygtk/widgetsII/

在 PyGTK 编程教程的这一部分中,我们将继续介绍 PyGTK 小部件。

Entry

Entry是单行文本输入字段。 该小部件用于输入文本数据。

entry.py

  1. #!/usr/bin/python
  2. # ZetCode PyGTK tutorial
  3. #
  4. # This example demonstrates the Entry widget
  5. #
  6. # author: jan bodnar
  7. # website: zetcode.com
  8. # last edited: February 2009
  9. import gtk
  10. class PyApp(gtk.Window):
  11. def __init__(self):
  12. super(PyApp, self).__init__()
  13. self.set_title("Entry")
  14. self.set_size_request(250, 200)
  15. self.set_position(gtk.WIN_POS_CENTER)
  16. fixed = gtk.Fixed()
  17. self.label = gtk.Label("...")
  18. fixed.put(self.label, 60, 40)
  19. entry = gtk.Entry()
  20. entry.add_events(gtk.gdk.KEY_RELEASE_MASK)
  21. fixed.put(entry, 60, 100)
  22. entry.connect("key-release-event", self.on_key_release)
  23. self.connect("destroy", gtk.main_quit)
  24. self.add(fixed)
  25. self.show_all()
  26. def on_key_release(self, widget, event):
  27. self.label.set_text(widget.get_text())
  28. PyApp()
  29. gtk.main()

此示例显示了条目小部件和标签。 我们输入的文本将立即显示在标签控件中。

  1. entry = gtk.Entry()

Entry小部件已创建。

  1. entry.connect("key-release-event", self.on_key_release)

如果Entry小部件中的文本被更改,我们将调用on_key_release()方法。

  1. def on_key_release(self, widget, event):
  2. self.label.set_text(widget.get_text())

我们从Entry小部件获取文本并将其设置为标签。

PyGTK 中的小部件 II - 图1

图:Entry小部件

HScale

HScale是水平滑块,它使用户可以通过在有限间隔内滑动旋钮来以图形方式选择一个值。 我们的示例将显示音量控制。

hscale.py

  1. #!/usr/bin/python
  2. # ZetCode PyGTK tutorial
  3. #
  4. # This example demonstrates the HScale widget
  5. #
  6. # author: jan bodnar
  7. # website: zetcode.com
  8. # last edited: February 2009
  9. import gtk
  10. import sys
  11. class PyApp(gtk.Window):
  12. def __init__(self):
  13. super(PyApp, self).__init__()
  14. self.set_title("Scale")
  15. self.set_size_request(260, 150)
  16. self.set_position(gtk.WIN_POS_CENTER)
  17. scale = gtk.HScale()
  18. scale.set_range(0, 100)
  19. scale.set_increments(1, 10)
  20. scale.set_digits(0)
  21. scale.set_size_request(160, 35)
  22. scale.connect("value-changed", self.on_changed)
  23. self.load_pixbufs()
  24. self.image = gtk.Image()
  25. self.image.set_from_pixbuf(self.mutp)
  26. fix = gtk.Fixed()
  27. fix.put(scale, 20, 40)
  28. fix.put(self.image, 219, 50)
  29. self.add(fix)
  30. self.connect("destroy", lambda w: gtk.main_quit())
  31. self.show_all()
  32. def load_pixbufs(self):
  33. try:
  34. self.mutp = gtk.gdk.pixbuf_new_from_file("mute.png")
  35. self.minp = gtk.gdk.pixbuf_new_from_file("min.png")
  36. self.medp = gtk.gdk.pixbuf_new_from_file("med.png")
  37. self.maxp = gtk.gdk.pixbuf_new_from_file("max.png")
  38. except Exception, e:
  39. print "Error reading Pixbufs"
  40. print e.message
  41. sys.exit(1)
  42. def on_changed(self, widget):
  43. val = widget.get_value()
  44. if val == 0:
  45. self.image.set_from_pixbuf(self.mutp)
  46. elif val > 0 and val <= 30:
  47. self.image.set_from_pixbuf(self.minp)
  48. elif val > 30 and val < 80:
  49. self.image.set_from_pixbuf(self.medp)
  50. else:
  51. self.image.set_from_pixbuf(self.maxp)
  52. PyApp()
  53. gtk.main()

在上面的示例中,我们有HScaleImage小部件。 通过拖动比例尺,我们可以在Image小部件上更改图像。

  1. scale = gtk.HScale()

HScale小部件已创建。

  1. scale.set_range(0, 100)

我们设置刻度的上下边界。

  1. scale.set_increments(1, 10)

set_increments()方法设置范围的步长和页面大小。

  1. scale.set_digits(0)

我们希望刻度上具有整数值,因此我们将小数位数设置为零。

  1. if val == 0:
  2. self.image.set_from_pixbuf(self.mutp)
  3. elif val > 0 and val <= 30:
  4. self.image.set_from_pixbuf(self.minp)
  5. elif val > 30 and val < 80:
  6. self.image.set_from_pixbuf(self.medp)
  7. else:
  8. self.image.set_from_pixbuf(self.maxp)

根据获得的值,我们在图像小部件中更改图片。

PyGTK 中的小部件 II - 图2

图:HScale小部件

ToggleButton

ToggleButton是具有两种状态的按钮。 已按下但未按下。 通过单击可以在这两种状态之间切换。 在某些情况下此功能非常合适。

togglebuttons.py

  1. #!/usr/bin/python
  2. # ZetCode PyGTK tutorial
  3. #
  4. # This example demonstrates the ToggleButton widget
  5. #
  6. # author: jan bodnar
  7. # website: zetcode.com
  8. # last edited: February 2009
  9. import gtk
  10. class PyApp(gtk.Window):
  11. def __init__(self):
  12. super(PyApp, self).__init__()
  13. self.color = [0, 0, 0]
  14. self.set_title("ToggleButtons")
  15. self.resize(350, 240)
  16. self.set_position(gtk.WIN_POS_CENTER)
  17. self.connect("destroy", gtk.main_quit)
  18. red = gtk.ToggleButton("Red")
  19. red.set_size_request(80, 35)
  20. red.connect("clicked", self.onred)
  21. green = gtk.ToggleButton("Green")
  22. green.set_size_request(80, 35)
  23. green.connect("clicked", self.ongreen)
  24. blue = gtk.ToggleButton("Blue")
  25. blue.set_size_request(80, 35)
  26. blue.connect("clicked", self.onblue)
  27. self.darea = gtk.DrawingArea()
  28. self.darea.set_size_request(150, 150)
  29. self.darea.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("black"))
  30. fixed = gtk.Fixed()
  31. fixed.put(red, 30, 30)
  32. fixed.put(green, 30, 80)
  33. fixed.put(blue, 30, 130)
  34. fixed.put(self.darea, 150, 30)
  35. self.add(fixed)
  36. self.show_all()
  37. def onred(self, widget):
  38. if widget.get_active():
  39. self.color[0] = 65535
  40. else: self.color[0] = 0
  41. self.darea.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(self.color[0],
  42. self.color[1], self.color[2]))
  43. def ongreen(self, widget):
  44. if (widget.get_active()):
  45. self.color[1] = 65535
  46. else: self.color[1] = 0
  47. self.darea.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(self.color[0],
  48. self.color[1], self.color[2]))
  49. def onblue(self, widget):
  50. if (widget.get_active()):
  51. self.color[2] = 65535
  52. else: self.color[2] = 0
  53. self.darea.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(self.color[0],
  54. self.color[1], self.color[2]))
  55. PyApp()
  56. gtk.main()

在我们的示例中,我们显示了三个切换按钮和一个DrawingArea。 我们将区域的背景色设置为黑色。 切换按钮将切换颜色值的红色,绿色和蓝色部分。 背景颜色取决于我们按下的切换按钮。

  1. self.color = [0, 0, 0]

这是将使用切换按钮更新的颜色值。

  1. red = gtk.ToggleButton("Red")
  2. red.set_size_request(80, 35)
  3. red.connect("clicked", self.onred)

ToggleButton小部件已创建。 我们将其大小设置为80x35像素。 每个切换按钮都有其自己的处理器方法。

  1. self.darea = gtk.DrawingArea()
  2. self.darea.set_size_request(150, 150)
  3. self.darea.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("black"))

DrawingArea小部件是显示颜色的小部件,由切换按钮混合。 开始时,它显示为黑色。

  1. if widget.get_active():
  2. self.color[0] = 65535
  3. else: self.color[0] = 0

如果按下切换按钮,我们将相应地更改颜色的 R,G 或 B 部分。

  1. self.darea.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(self.color[0],
  2. self.color[1], self.color[2]))

我们更新DrawingArea小部件的颜色。

PyGTK 中的小部件 II - 图3

图:ToggleButton widget

Calendar

我们最终的窗口小部件是Calendar小部件。 它用于处理日期。

calendar.py

  1. #!/usr/bin/python
  2. # ZetCode PyGTK tutorial
  3. #
  4. # This example demonstrates the Calendar widget
  5. #
  6. # author: jan bodnar
  7. # website: zetcode.com
  8. # last edited: February 2009
  9. import gtk
  10. class PyApp(gtk.Window):
  11. def __init__(self):
  12. super(PyApp, self).__init__()
  13. self.set_title("Calendar")
  14. self.set_size_request(300, 270)
  15. self.set_position(gtk.WIN_POS_CENTER)
  16. self.set_border_width(2)
  17. self.label = gtk.Label("...")
  18. calendar = gtk.Calendar()
  19. calendar.connect("day_selected", self.on_day_selected)
  20. fix = gtk.Fixed()
  21. fix.put(calendar, 20, 20)
  22. fix.put(self.label, 40, 230)
  23. self.add(fix)
  24. self.connect("destroy", gtk.main_quit)
  25. self.show_all()
  26. def on_day_selected(self, widget):
  27. (year, month, day) = widget.get_date()
  28. self.label.set_label(str(month) + "/" + str(day) + "/" + str(year))
  29. PyApp()
  30. gtk.main()

我们有Calendar小部件和Label。 从日历中选择的日期显示在标签中。

  1. calendar = gtk.Calendar()

Calendar小部件已创建。

  1. (year, month, day) = widget.get_date()
  2. self.label.set_label(str(month) + "/" + str(day) + "/" + str(year))

on_day_selected()方法中,我们检索当前选择的日期,并更新标签。

PyGTK 中的小部件 II - 图4

图:Calendar

在 PyGTK 教程的这一章中,我们完成了有关 PyGTK 小部件的讨论。