10

我正在尝试使用 gjs 为 gnome-shell 创建简单的 gtk 应用程序。

它的窗口仅包含 Gtk.TextView ,我想在用户键入时处理事件。

这是我的代码:

#!/usr/bin/gjs

var Gtk = imports.gi.Gtk;

function MainWindow () {
    this._init ();
}

MainWindow.prototype = {
    _init: function () {
        this.window = new Gtk.Window ({
            title: "Just Calculator",
            window_position: Gtk.WindowPosition.CENTER,
            default_height: 400,
            default_width: 440,
        });

        //this.window.show ();
        this.window.connect ("hide", Gtk.main_quit);
        this.window.connect ("delete-event", function () {
            Gtk.main_quit();
            return true;
        });

        this.textbox = new Gtk.TextView();
        this.textbox.connect('key-press-event', this._keyPress);

        var sw = new Gtk.ScrolledWindow ({shadow_type:Gtk.ShadowType.IN});
        sw.add (this.textbox);
        this.window.add(sw);

        this.window.show_all();
    },

    _keyPress: function(textview, event) {
        print(event, event.type, event.keyval);
        textview.buffer.text = 'ok';
        return true;
    }
}

Gtk.init (null, null);
var window = new MainWindow ();
Gtk.main ();

它通常可以工作,但我无法读取 event.keyval:控制台输出为“未定义”:

[union instance proxy GIName:Gdk.Event jsobj@0x7f99b1027040 native@0x1dfeab0] undefined undefined

有人可以告诉我我做错了什么吗?谢谢!

4

1 回答 1

2

Gdk.Event不包含属性typekeyval这就是为什么它们是undefined. 它出现的时间不长,但现在在https://people.gnome.org/~gcampagna/docs上有可用于 GObject Introspection 绑定到 Gjs 的文档。

从您的打印输出中,您可以看到这event是 a Gdk.Event,其文档位于https://people.gnome.org/~gcampagna/docs/Gdk-3.0/Gdk.Event.html。在那里你可以看到有函数get_event_typeget_keyval。第一个返回一个Gdk.EventTypehttps://people.gnome.org/~gcampagna/docs/Gdk-3.0/Gdk.EventType.html),后者返回一个数组,其中第二个元素包含按键的数字代码。您可以将数字键与 Clutter 中以 开头的常量进行比较KEY_

例如,在代码顶部添加一些导入

var Gdk = imports.gi.Gdk;
var Clutter = imports.gi.Clutter;

并将日志记录行更改为

print(event,
      event.get_event_type() === Gdk.EventType.KEY_PRESS, 
      event.get_keyval()[1] === Clutter.KEY_Escape);

得到一些合理的输出。

于 2015-12-13T13:49:35.173 回答