在Python Gtk+ 3中为窗口/应用绑定快捷键,无需菜单项、UI管理器等

3 投票
2 回答
2469 浏览
提问于 2025-04-18 02:58

我正在尝试用Python结合GTK3和Cairo来做一个简单的绘图应用,Cairo的输出在屏幕上显示主要是为了方便用户。

我通常的使用方式是,运行一个命令后,图表会弹出来,同时也会保存到文件中。我希望能尽快关闭这个窗口,理想情况下只需要按“q”键,当然也希望能支持常用的Ctrl-W和Ctrl-Q,当然还有默认的Alt-F4(真的有人经常用这个吗?)。

我还希望窗口里尽量少一些杂乱的界面元素:理想情况下只保留标准的窗口边框,不要菜单、工具栏等等。

那么...我该如何把我的“q”、“Ctrl-Q”等按键绑定到Gtk.main_quit,而不需要a) 创建一个杂乱的下拉菜单栏,b) 还要使用比较复杂的Gtk.UIManager,这个在Python Gtk+ 3的文档中有提到:http://python-gtk-3-tutorial.readthedocs.org/en/latest/menus.html。我希望这能实现,而且不需要写很多代码(至少不要像设置所有菜单那样多!),但我在网上找不到任何例子:也许我是用错了搜索词,因为我还是个GTK的新手。

不幸的是,似乎没有关于如何设置这样一个简单快捷键的文档,而且配置快捷键的代码在GTK2和GTK3之间差别很大...谢谢你的帮助。

2 个回答

0

不要使用按键事件和键值,这对使用非拉丁字母键盘的用户来说是行不通的。GTK+ 在内部很好地处理了将键值与硬件按键匹配的工作,这个功能通过加速器(在API中通常简写为 accel)和绑定来实现。

3

要把一个信号连接到你的主窗口,可以用这行代码:Win.connect('key-press-event', self.on_key_function)。在这个叫做 on_key_function 的函数里,你需要检查事件的键值,也就是 event.keyval。如果你想直接写死的话,ESC键的值是65307。对于组合键,event.state会告诉你是否按下了shift、alt(也叫meta)等键。例如:if Gdk.ModifierType.CONTROL_MASK & event.state:do_something,这段意思是如果按下了ctrl键,就做某件事情。 你可以为左边的ctrl和右边的alt分别写不同的判断语句;不过要注意,不要试图捕捉一些已经定义好的组合键,因为这些可能会被窗口管理器使用掉。 使用一个功能强大的集成开发环境(IDE)会对你很有帮助,只需输入Gdk(之前已经导入过的),然后自动补全功能会弹出很多函数和类,大部分都有自解释的名字。

撰写回答