python - 为什么我会在按钮按下事件中获得鼠标位置的小数值?
问题描述
我试图在我的应用程序中处理鼠标事件,但我不明白为什么x
和y
在我的事件中是小数(我希望鼠标位置包含整数)。
我用来测试它的简单应用程序:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk
class Example(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
self.set_default_size(800, 600)
drawing_area = Gtk.DrawingArea();
drawing_area.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
drawing_area.connect("button-press-event", self.handle_image_click)
self.add(drawing_area)
def handle_image_click(self, widget, event):
print("click", event.x, event.y)
win = Example()
win.show_all()
Gtk.main()
示例输出:
click 734.751708984375 306.2582092285156
click 631.0667114257812 416.09857177734375
click 435.015625 462.9517822265625
我正在使用 Gtk 3.24.20 和 python-gobject 3.36.1。这种行为的原因可能是什么?
解决方案
事件坐标来自窗口系统,窗口系统可以为指针坐标提供亚像素精度。此外,GTK 将规范化事件坐标以处理 HiDPI 缩放因子,这意味着即使物理坐标没有,逻辑位置也可能具有分数分量。
如果需要,可以使用floor()
或将事件坐标四舍五入以与像素网格对齐ceil()
。
推荐阅读
- python-3.x - 如何在python中将dict列表转换为json?
- sql-server - 将像✅这样的unicode从表单存储到数据库
- javascript - 在 Bootstrap 加载时使用 HMTLWebPackPlugin 测试基于 WebPack 的 WebApp
- machine-learning - 如何处理电影推荐中的发行年份差异
- swift - Swift - 如何为特定节点添加场景边界?
- spring-cloud - Spring Cloud Config 创建什么样的消息队列?
- firebase - Flutter中Firebase一对一聊天的数据结构
- java - 尝试为 mapsforge/vtm 创建 Xamarin Android 绑定 Java 库时出错
- entity-framework - 升级到 Entity Framework Core 3 时出错:当前上下文中不存在 RelationalReferenceCollectionBuilderExtensions
- python - 在 codejam 2019 中提交代码时出现运行时错误