我一直在尝试用Python编写简单的CAD应用程序。我在修补pyglet时,得到了一些结果:,但我决定改回Gtk,然后撞到了墙:
我不能将鼠标指针放在EventBox上(使用pyglet,它是图片中窗口应用程序左下角的标签)。为此设计了什么信号?还是应该使用其他方法?
我将不胜感激任何信息或资源。提前致谢。
问题:如何检测EventBox上的鼠标位置?
Gtk.EventBox
小部件是Gtk.Bin
的子类,它也有自己的窗口。这很有用,因为它允许您捕获没有自己窗口的窗口小部件的事件。
将位域
events
中的events
添加到self
的事件掩码中。
一组用于指示窗口将接收哪些事件的位标志。
- GDK_MOTION_NOTIFY指针(通常是鼠标)已移动
Gtk.EventBox
应该有标志,而不是窗口!
box = Gtk.EventBox()
box.connect("motion-notify-event", self.on_mouse_move)
box.add_events(Gdk.EventMask.POINTER_MOTION_MASK)
借助from gi.repository import Gtk
from gi.repository import Gdk
# (...)
box = Gtk.EventBox()
box.add_events(Gdk.EventMask.POINTER_MOTION_MASK) # 1
box.connect("button-press-event", self.on_click)
box.connect("motion-notify-event", self.on_mouse_move) # 2
self.canvas = Gtk.DrawingArea()
self.canvas.connect("draw", self.on_draw)
self.canvas.set_size_request(800, 600)
box.add(self.canvas)
grid = Gtk.Grid()
frame = Gtk.Frame()
frame.set_label("KHAD")
frame.add(box)
grid.attach(frame, 0, 1, 1, 1)
self.add(grid)
# (...)
self.locationLabel = Gtk.Label("X,Y")
self.locationLabel.set_alignment(0, 0)
grid.attach(self.locationLabel, 0, 2, 1, 1)
解决方案是:
POINTER_MOTION_MASK
添加到事件框中:box.add_events(Gdk.EventMask.POINTER_MOTION_MASK)
。motion-notify-event
与方法连接,该方法读取并更新标签(左下角;与self.locationLabel.set_alignment(0, 0)
对齐)。