Python GTK+3 Note - 「1」基础

基础

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import gi
gi.require_version('Gtk', '3.0') # 指定使用的 GTK 版本
from gi.repository import Gtk # 导入 GTK 模块

class MyWindow(Gtk.Window):

def __init__(self):
Gtk.Window.__init__(self, title="Hello World") # 初始化窗口

self.button = Gtk.Button(label="Click Here") # 初始化按钮实例
self.button.connect("clicked", self.on_button_clicked) # 将按钮和事件连接
self.add(self.button) # 添加按钮控件

def on_button_clicked(self, widget): # 定义按钮点击事件行为
print("Hello World")

win = MyWindow()
win.connect("delete-event", Gtk.main_quit) # 将主窗口连接退出事件
win.show_all() # 显示所有部分
Gtk.main() # 主循环

GTK+ 采用事件驱动编程模型。用户无操作时 GTK+ 处于主循环(main loop)等待输入,有动作输入时唤醒并将事件传递给 GTK+。

控件收到一个事件通常会发出一个或多个信号,信号触发连接的函数。这种函数通常称为回调(callbacks)。回调函数通常会执行相关操作,完成之后返回主循环。

1
handler_id = widget.connect("event", callback, data)

widget 是之前创建的控件实例。每个控件有它特定的事件。比如按钮被点击触发一个信号。callback 是回调函数名。data 参数包含信号发送时传递的数据,可选。

函数返回一个数字,代表特定的 信号-回调 对。不需要之后需要与信号断开连接,保证回调函数不再被调用。

1
widget.disconnect(handler_id)

如果丢失了 handler_id(比如使用 Gtk.Builder.connect_signals() 安装 handler),断开指定回调:

1
widget.disconnect_by_func(callback)

几乎所有应用顶层窗口都连接到“delete-event”事件。点击关闭,信号默认行为是销毁窗口,而不中止程序。需使用:

1
window.connect("delete-event", Gtk.main_quit)

Gtk.main_quit() 使得 Gtk.main() 中的主循环 return。


属性

属性描述控件的配置和状态。控件有它自己特定的一组属性。如按钮属性“label”在按钮内包含一个文本标签控件。

1
label = Gtk.Label(label="Hello World", angle=25, halign=Gtk.Align.END)

以上代码和下列语句等效:

1
2
3
4
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。这个语句和 widget.get_property(“prop-name”) 以及 widget.set_property(“prop-name”, value) 等效。

通过 dir 可以查看控件可用的属性,下面在终端窗口列出 Gtk.Box 的属性。

1
2
widget = Gtk.Box()
print(dir(widget.props))

字符串的处理(Python 3)

Python 3.x 中的字符串

Python 3 中所有字符串都存储为 Unicode 形式,str 类型。编码过的字符串以二进制数据的表示形式存储到 bytes 类型。概念上来说,str 指文本,bytes 指数据。str 到 bytes 转换使用 str.encode(),反之 bytes.decode()。

Unicode 字符串和编码后的字符串也不能够混合了,会导致 TypeError:

1
2
3
4
5
6
7
8
9
10
>>> text = "Fu\u00dfb\u00e4lle"
>>> data = b" sind rund"
>>> text + data
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't convert 'bytes' object to str implicitly
>>> text + data.decode("utf-8")
'Fußbälle sind rund'
>>> text.encode("utf-8") + data
b'Fu\xc3\x9fb\xc3\xa4lle sind rund'

GTK+ 中的 Unicode

Python 3.x 中字符串更加简单明了,在给方法传递或方法返回字符串时,PyGObject 会自动从或编码/解码到 UTF-8。字符串,或者说文本,总是以 str 实例的方式展现:

1
2
3
4
5
6
7
8
9
>>> from gi.repository import Gtk
>>> label = Gtk.Label()
>>> text = "Fu\u00dfb\u00e4lle"
>>> label.set_text(text)
>>> txt = label.get_text()
>>> type(txt), txt
(<class 'str'>, 'Fußbälle')
>>> txt == text
True

参考链接:Python GTK+ 3 Tutorial