我正在写一个关于图论的学校项目。我需要实现一些图形算法(Dijkstra's、Prim's 等)。之后,我需要在同一个程序中可视化它们。
我可以在绘图区域内绘制矩形和线条以可视化图形。但我需要处理鼠标事件以使其具有交互性。
例如,当用户想向图形添加一个顶点时,我需要鼠标的位置。
我的母语不是英语。我无法很好地解释我的问题。:)
使用一个gtk.EventBox
和事件的x
和y
字段:
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 ()
这也适用于我使用 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>