我有一个表单(格式为.png),里面有空白文本框(通常是手工填写的)。我想用文本填充框。在
为此,我使用tkinter在屏幕上显示表单,然后使用鼠标(使用箭头键进行更精细的定位)获取框的像素坐标,然后使用PIL将文本写入该框。下面是一个工作示例。在
我的主要问题是我正在努力对齐tkinter画布中的像素坐标和PIL图像中的像素坐标。在
一些额外的背景。该图像具有高分辨率,大约为4961×7016像素。我的屏幕分辨率是1920x1080。我在需要这样写的地方写文字时遇到了问题,如果我缩放图像使其完全适合屏幕,我会发现更大的成功。我只能假设这是因为我曾经/正在混淆屏幕像素和图片像素(当我将图像调整到屏幕以对齐这两个像素时,解决了这个问题-但是理解这里的差异以及如何在不缩放的情况下执行此任务也将非常有帮助)。在
但我也有困难协调像素坐标在tkinter画布和PIL图片。例如,下面的代码被设计成将(x,y)像素坐标,然后将它的页面相对性{x%在页面上,y%在页面上}写到框中(这是因为它是另一个进程的输入)。例如:(346481)>>{49.856,51.018}
但如果(使用比例因子0.14)单击图像底部的非常低的位置,则得到(209986)>>{30.115,-0.407}。相对性应该在0到100%之间,所以不应该是负的,我在我的PIL生成的.png文件上看不到这一点。在
如果我使用0.125的比例因子,我可以很好地将文本写入tkinter canvas box,但是文本在保存到驱动器的PIL.png文件中显示得要低一些(即在框外)。所以这两个系统之间显然有些东西不起作用。在
如何协调PIL和tkinter像素坐标?在
另外,我有四个单独的功能来处理更精细的按键调整。理想情况下,这些是一个函数,但我不能让箭头按钮(等)在if elif块中工作(例如,我尝试了这个函数以及一些left、right等的派生函数)def mouseMovement(event):
moveSpeed = 1
try:
int(event.char)
moveSpeed = max(1, int(event.char)*5)
return True
except ValueError:
return False
x, y = pyautogui.position()
if event.char == '':
pyautogui.moveTo(x-moveSpeed, y)
elif event.char == '':
pyautogui.moveTo(x+moveSpeed, y)
root.bind('' , mouseMovement)
非常感谢任何帮助!在
下面是几乎可以工作的例子:
^{pr2}$