主循环和信号
像大多数GUI工具包一样,GTK+使用事件驱动的编程模型。当用户什么都不做时,GTK+会坐在主循环中并等待输入。如果用户执行某些操作(例如,单击鼠标),则主循环“醒来”,并将事件传递给GTK+。
当Gtk.Widget接收到事件时,它们经常发出一个或多个信号。信号通过调用已连接到信号的函数来通知程序“发生了一些有趣的事情”。此类函数通常称为回调。调用回调时,通常会采取一些措施-例如,单击“打开”按钮时,可能会显示一个文件选择器对话框。回调完成后,GTK+将返回主循环并等待更多用户输入。
一个通用的示例是:
handler_id = widget.connect("event", callback, data)
上述代码连接了信号event
和处理方法callback
,callback
的参数是data
首先,widget是我们之前创建的widget的一个实例。
接下来,我们感兴趣的事件。每个小部件都有其自己可能发生的特定事件。例如,如果您有一个按钮,通常希望连接到“clicked”事件。这意味着当单击按钮时,将发出信号。
第三,callback
参数是回调函数的名称。它包含在发出指定类型的信号时运行的代码。
最后,data
参数包含发出信号时应传递的任何数据。但是,此参数是完全可选的,如果不需要,可以将其省略。
另外handler_id
可以用于断开与信号的连接widget.disconnect(handler_id)
如果由于某种原因丢失了“handler_id”(例如,使用来安装处理程序Gtk.Builder.connect_signals()
),您仍然可以使用函数断开特定的回调disconnect_by_func()
:
widget.disconnect_by_func(callback)
应用程序应连接到顶层窗口的“destroy”信号。当销毁一个对象时会发出该消息,因此当用户请求关闭顶级窗口时,此信号的默认处理程序将销毁该窗口,但不会终止应用程序。将顶层窗口的“销毁”信号连接到该功能Gtk.main_quit()
将导致所需的行为。
window.connect("destroy", Gtk.main_quit)
调用Gtk.main_quit()
使主循环Gtk.main()
返回return
Gtk.main_quit()
方法可以从GTK的文档 https://lazka.github.io/pgi-docs/Gtk-3.0/index.html 中找到,在API分类下的Functions。
属性
属性描述窗口小部件的配置和状态。至于信号,每个窗口小部件都有其自己的特定属性集。例如,按钮具有“标签”属性,其中包含按钮内部的标签小部件的文本。创建小部件的实例时,可以将任意数量的属性的名称和值指定为关键字参数。要创建一个与文本“ Hello World”和25度角向右对齐的标签,请使用:
label = Gtk.Label(label="Hello World", angle=25, halign=Gtk.Align.END)
相当于
label = Gtk.Label()
label.set_label("Hello World")
label.set_angle(25)
label.set_halign(Gtk.Align.END)
除了使用getter和setter之外,您还可以通过“ props”属性(例如 widget.props.prop_name = value
)获取和设置gobject属性。这相当于widget.get_property("prop-name")
和widget.set_property("prop-name", value)
要查看正在运行的GTK版本中的窗口小部件可以使用哪些属性,可以“dir”一下“props”属性:
widget = Gtk.Box()
print(dir(widget.props))
这将在控制台中打印Gtk.Box具有的属性列表。