1

我正在写一个关于图论的学校项目。我需要实现一些图形算法(Dijkstra's、Prim's 等)。之后,我需要在同一个程序中可视化它们。

我可以在绘图区域内绘制矩形和线条以可视化图形。但我需要处理鼠标事件以使其具有交互性。

例如,当用户想向图形添加一个顶点时,我需要鼠标的位置。

我的母语不是英语。我无法很好地解释我的问题。:)

4

2 回答 2

4

使用一个gtk.EventBox和事件的xy字段:

import gtk

win  = gtk.Window ()
box  = gtk.EventBox ()
area = gtk.DrawingArea ()

def onclick (box, event):
   print event.x, event.y

box.connect ('button-press-event', onclick)

box.add (area)
win.add (box)
win.show_all ()
win.connect ('destroy', lambda *x: gtk.main_quit ())

gtk.main ()
于 2012-12-22T12:25:22.777 回答
0

这也适用于我使用 vala。我确实使用了 Gtk.Layout 而不是 Gtk.DrawingArea。此示例还显示了如何检测双击。

public class MyApp : Gtk.Application {
    public MyApp () {
    }

    protected override void activate () {

        var window = new Gtk.Window ();
        window.set_default_size (300, 400);

        var layout = new Gtk.Layout();
        layout.add (new Gtk.Label ("hello"));

        var eventbox = new Gtk.EventBox();
        eventbox.button_press_event.connect ((event) => {
            var type = event.type;
            string position = event.x.to_string() + "; " + event.y.to_string();
            if (type == Gdk.EventType.2BUTTON_PRESS) {
                print (position + " (Double click)" + "\n");
                return true;
            }
            print (position + "\n");
            return true;
        });
        eventbox.add (layout);
        window.add (eventbox);
        window.show_all ();

        add_window (window);

    }

    public static int main (string[] args) {
        return new MyApp ().run (args);
    }
}

编译代码valac --pkg gtk+-3.0 <file>.vala

执行./<file>

于 2021-05-17T14:35:31.050 回答