【发布时间】:2020-04-11 14:29:07
【问题描述】:
我有这个代码:
for item in items:
print ( "Item: ", item, mycanvas.coords (item) )
print ("Item at 26.0, 188.0 ", mycanvas.find_closest(26.0, 188.0))
print ("Item at 998.0, 594.0 ", mycanvas.find_closest(998.0, 594.0))
当我运行它时,我得到:
('Item: ', 1, [985.0, 565.0])
('Item: ', 8, [25.0, 25.0])
('Item: ', 15, [505.0, 25.0])
('Item: ', 28, [1362.0, 31.0])
('Item: ', 35, [1020.0, 119.0])
('Item: ', 42, [1050.0, 583.0])
('Item: ', 49, [25.0, 25.0])
('Item: ', 56, [26.0, 188.0])
('Item: ', 63, [998.0, 594.0])
('Item: ', 70, [1152.0, 38.0])
('Item at 26.0, 188.0 ', (57,))
('Item at 998.0, 594.0 ', (64,))
最后两行应分别读取找到的项目56 和63。
我在屏幕上有 10 张图片,我试图找出点击的是哪一张。更糟糕的是 X,Y 坐标被传递给屏幕位置而不是画布位置,我必须弄清楚如何转换:
def popup(event):
x = mycanvas.canvasx(event.x_root)
y = mycanvas.canvasy(event.y_root)
print( "Adjusted x, y: ", x, y )
FoundItem=mycanvas.find_closest(x, y)
print( "Found Item @ x, y: ", FoundItem, event.x_root, event.y_root )
FoundTuple=mycanvas.find_overlapping(x, y, x+1, y+1)
print( "Found Tuple: ", FoundTuple )
# use coordinates relative to the canvas
# ItemNdx=items.index(FoundItem)
# print( "ItemNdx: ", ItemNdx )
menu.tk_popup(event.x_root, event.y_root)
在 Python 的 Tkinter 中,找出用户点击了哪个图像(项目/标签 ID)的最简单方法是什么?
使用窗口图像监控图像
了解画布的外观:
这是三个显示器 eDP-1-1 之一的部分。给出最坏的情况,打开四个窗口:
-
gedit有问题的源代码在底部打开。 - 带有此问答的 Firefox 浏览器在上面打开。
- Nautilus 窗户在上面。
- Gnome 终端在顶部。
窗口堆叠顺序还不完善,因为wmctrl 用于获取桌面上所有打开的窗口,尚未按堆叠顺序进行任何排序。
所以用户会点击最接近他们想要选择的图像的左上角。用户也可以点击没有被窗口覆盖的空白监视器区域来选择监视器图像。 - 本网站的火狐浏览器
标签电流也是一关
我输入了这段代码:
tag_current=event.widget.find_withtag("current")
print ("tag_current: ", tag_current)
结果是这样的:
('Item: ', 1, [985.0, 565.0])
('Item: ', 8, [25.0, 25.0])
('Item: ', 15, [505.0, 25.0])
('Item: ', 28, [1362.0, 31.0])
('Item: ', 35, [949.0, 167.0])
('Item: ', 42, [1050.0, 583.0])
('Item: ', 49, [83.0, 52.0])
('Item: ', 56, [26.0, 188.0])
('Item: ', 63, [998.0, 594.0])
('Item: ', 70, [25.0, 25.0])
('Item: ', 77, [1091.0, 644.0])
('Item at 26.0, 188.0 ', (70,))
('Item at 998.0, 594.0 ', (64,))
('tag_current: ', (41,))
tag_current 应该是 42,但被报告为 41。
63 被报告为 64 和 56 被报告为 70 (之前报告为 57 上次运行作业)的问题非常相似。
12 小时更新
12 小时后,我越来越近了。需要将窗口坐标(三个显示器的整个桌面)转换为画布坐标(其中一个显示器上的一个 Python 程序):
def popup(event):
global FoundItem, MouseXY
x = mycanvas.canvasx(event.x)
y = mycanvas.canvasy(event.y)
MouseXY=(x, y)
print( "Adjusted x, y: ", x, y )
FoundItem=mycanvas.find_closest(x, y)
希望今晚能解决问题...
【问题讨论】:
-
1) 为所有图像项分配标签,例如
img = mycanvas.create_image(..., tag='image'); 2)将鼠标单击事件绑定到这些图像项,例如mycanvas.tag_bind('image', '<Button-1>', on_image_click); 3) 使用mycanvas.find_withtag('current')获取on_image_click()函数中点击的图像。 -
@acw1668 图像是桌面上打开的窗口。图片的数量是无限的,所以用无限的“on_image_click”语句硬编码标签是不可能的。
-
该图像不是桌面上打开的窗口,它是一个放在打开窗口位置的画布图像项。所以需要调用
mycanvas.create_image(...)来创建图片项,只需在mycanvas.create_image(...)语句中添加tag='whatever'即可。 -
@acw1668 我的画布包含 10 个图像:3 个监视器(通过屏幕截图获得的 HDMI-1、DP-1-1 和 eDP-1-1)和使用
wmctrl -lG获得的 7 个窗口。项目列表中填充有item=mycanvas.create.image(...),后跟items.append( [item] )我将在接下来的几天内尝试一个新的程序版本,其标签设置为xrandr监视器名称和wmctrl窗口编号。谢谢。
标签: python tkinter mouse-coordinates