Tkinter 在点击时获取鼠标坐标并将它们用作变量
Tkinter get mouse coordinates on click and use them as variables
我对 Python 完全陌生。因此,不要生我的气,因为我确信我缺少一些基本的东西。这是我的问题:
我正在尝试从图像中提取鼠标单击坐标并将这些坐标用作变量。
代码允许导入图像,我想从中提取坐标。一些提示询问用户图表的大小和范围,之后我想通过分别单击 x 轴和 y 轴上的原点和终点来设置坐标网格。思路是利用这3组坐标,通过一些转换函数(见代码),转换成Pressure和Temperature坐标。
# Determine the origin by clicking
# Probably with classes??
class Origin:
def getorigin(eventorigin):
eventorigin.x0 = eventorigin.x
eventorigin.y0 = eventorigin.y
#mouseclick event
w.bind("<Button 1>",getorigin)
# What do I do here??
x0 = ...
y0 = ...
我真的不知道如何将通过单击获得的坐标分配给我稍后可以在代码中使用的新变量。
我可以打印坐标,但由于它们是一个函数,所以它们是局部的,在函数之外无法使用(据我所知)。因此,使用 类 的方法可能会更好,但我不知道该怎么做。
感谢任何帮助。
完整代码(改编):
from tkinter import *
from tkinter.filedialog import askopenfilename
from PIL import Image, ImageTk
import tkinter.simpledialog
root = Tk()
#setting up a tkinter canvas
w = Canvas(root, width=1000, height=1000)
w.pack()
#adding the image
File = askopenfilename(parent=root, initialdir="./",title='Select an image')
original = Image.open(File)
original = original.resize((1000,1000)) #resize image
img = ImageTk.PhotoImage(original)
w.create_image(0, 0, image=img, anchor="nw")
#ask for pressure and temperature extent
xmt = tkinter.simpledialog.askfloat("Temperature", "degrees in x-axis")
ymp = tkinter.simpledialog.askfloat("Pressure", "bars in y-axis")
#ask for real PT values at origin
xc = tkinter.simpledialog.askfloat("Temperature", "Temperature at origin")
yc = tkinter.simpledialog.askfloat("Pressure", "Pressure at origin")
#instruction on 3 point selection to define grid
tkinter.messagebox.showinfo("Instructions", "Click: \n"
"1) Origin \n"
"2) Temperature end \n"
"3) Pressure end")
# From here on I have no idea how to get it to work...
# Determine the origin by clicking
def getorigin(eventorigin):
global x0,y0
x0 = eventorigin.x
y0 = eventorigin.y
print(x0,y0)
#mouseclick event
w.bind("<Button 1>",getorigin)
# Determine the extent of the figure in the x direction (Temperature)
def getextentx(eventextentx):
global xe
xe = eventextentx.x
print(xe)
#mouseclick event
w.bind("<Button 1>",getextentx)
# Determine the extent of the figure in the y direction (Pressure)
def getextenty(eventextenty):
global ye
ye = eventextenty.y
print(ye)
#mouseclick event
w.bind("<Button 1>",getextenty)
#message to confirm that the grid is set up
tkinter.messagebox.showinfo("Grid", "Grid is set. You can start picking coordinates.")
#Coordinate transformation into Pressure-Temperature space
def printcoords(event):
xmpx = xe-x0
xm = xmt/xmpx
ympx = ye-y0
ym = -ymp/ympx
#coordinate transformation
newx = (event.x-x0)*(xm)+xc
newy = (event.y-y0)*(ym)+yc
#outputting x and y coords to console
print (newx,newy)
#mouseclick event
w.bind("<Button 1>",printcoords)
root.mainloop()
最简单的方法就是将x,y设置为全局,class与否无所谓。
我没有看到你的完整代码,因为我无法在 phone 上打开 zip 文件。所以这就是我可以帮助你的例子
import tkinter as tk
def getorigin(eventorigin):
global x,y
x = eventorigin.x
y = eventorigin.y
print(x,y)
root = tk.Tk()
root.bind("<Button 1>",getorigin)
如果我在之前的评论中所说的是你想要做的,因为 tkinter 不会暂停程序来等待鼠标点击事件,你将不得不这样做:它每次重新绑定它鼠标按钮被点击
from tkinter import *
from tkinter.filedialog import askopenfilename
from PIL import Image, ImageTk
import tkinter.simpledialog
root = Tk()
#setting up a tkinter canvas
w = Canvas(root, width=1000, height=1000)
w.pack()
#adding the image
File = askopenfilename(parent=root, initialdir="./",title='Select an image')
original = Image.open(File)
original = original.resize((1000,1000)) #resize image
img = ImageTk.PhotoImage(original)
w.create_image(0, 0, image=img, anchor="nw")
#ask for pressure and temperature extent
xmt = tkinter.simpledialog.askfloat("Temperature", "degrees in x-axis")
ymp = tkinter.simpledialog.askfloat("Pressure", "bars in y-axis")
#ask for real PT values at origin
xc = tkinter.simpledialog.askfloat("Temperature", "Temperature at origin")
yc = tkinter.simpledialog.askfloat("Pressure", "Pressure at origin")
#instruction on 3 point selection to define grid
tkinter.messagebox.showinfo("Instructions", "Click: \n"
"1) Origin \n"
"2) Temperature end \n"
"3) Pressure end")
# From here on I have no idea how to get it to work...
# Determine the origin by clicking
def getorigin(eventorigin):
global x0,y0
x0 = eventorigin.x
y0 = eventorigin.y
print(x0,y0)
w.bind("<Button 1>",getextentx)
#mouseclick event
w.bind("<Button 1>",getorigin)
# Determine the extent of the figure in the x direction (Temperature)
def getextentx(eventextentx):
global xe
xe = eventextentx.x
print(xe)
w.bind("<Button 1>",getextenty)
# Determine the extent of the figure in the y direction (Pressure)
def getextenty(eventextenty):
global ye
ye = eventextenty.y
print(ye)
tkinter.messagebox.showinfo("Grid", "Grid is set. You can start picking coordinates.")
w.bind("<Button 1>",printcoords)
#Coordinate transformation into Pressure-Temperature space
def printcoords(event):
xmpx = xe-x0
xm = xmt/xmpx
ympx = ye-y0
ym = -ymp/ympx
#coordinate transformation
newx = (event.x-x0)*(xm)+xc
newy = (event.y-y0)*(ym)+yc
#outputting x and y coords to console
print (newx,newy)
root.mainloop()
我对 Python 完全陌生。因此,不要生我的气,因为我确信我缺少一些基本的东西。这是我的问题:
我正在尝试从图像中提取鼠标单击坐标并将这些坐标用作变量。
代码允许导入图像,我想从中提取坐标。一些提示询问用户图表的大小和范围,之后我想通过分别单击 x 轴和 y 轴上的原点和终点来设置坐标网格。思路是利用这3组坐标,通过一些转换函数(见代码),转换成Pressure和Temperature坐标。
# Determine the origin by clicking
# Probably with classes??
class Origin:
def getorigin(eventorigin):
eventorigin.x0 = eventorigin.x
eventorigin.y0 = eventorigin.y
#mouseclick event
w.bind("<Button 1>",getorigin)
# What do I do here??
x0 = ...
y0 = ...
我真的不知道如何将通过单击获得的坐标分配给我稍后可以在代码中使用的新变量。
我可以打印坐标,但由于它们是一个函数,所以它们是局部的,在函数之外无法使用(据我所知)。因此,使用 类 的方法可能会更好,但我不知道该怎么做。
感谢任何帮助。
完整代码(改编):
from tkinter import *
from tkinter.filedialog import askopenfilename
from PIL import Image, ImageTk
import tkinter.simpledialog
root = Tk()
#setting up a tkinter canvas
w = Canvas(root, width=1000, height=1000)
w.pack()
#adding the image
File = askopenfilename(parent=root, initialdir="./",title='Select an image')
original = Image.open(File)
original = original.resize((1000,1000)) #resize image
img = ImageTk.PhotoImage(original)
w.create_image(0, 0, image=img, anchor="nw")
#ask for pressure and temperature extent
xmt = tkinter.simpledialog.askfloat("Temperature", "degrees in x-axis")
ymp = tkinter.simpledialog.askfloat("Pressure", "bars in y-axis")
#ask for real PT values at origin
xc = tkinter.simpledialog.askfloat("Temperature", "Temperature at origin")
yc = tkinter.simpledialog.askfloat("Pressure", "Pressure at origin")
#instruction on 3 point selection to define grid
tkinter.messagebox.showinfo("Instructions", "Click: \n"
"1) Origin \n"
"2) Temperature end \n"
"3) Pressure end")
# From here on I have no idea how to get it to work...
# Determine the origin by clicking
def getorigin(eventorigin):
global x0,y0
x0 = eventorigin.x
y0 = eventorigin.y
print(x0,y0)
#mouseclick event
w.bind("<Button 1>",getorigin)
# Determine the extent of the figure in the x direction (Temperature)
def getextentx(eventextentx):
global xe
xe = eventextentx.x
print(xe)
#mouseclick event
w.bind("<Button 1>",getextentx)
# Determine the extent of the figure in the y direction (Pressure)
def getextenty(eventextenty):
global ye
ye = eventextenty.y
print(ye)
#mouseclick event
w.bind("<Button 1>",getextenty)
#message to confirm that the grid is set up
tkinter.messagebox.showinfo("Grid", "Grid is set. You can start picking coordinates.")
#Coordinate transformation into Pressure-Temperature space
def printcoords(event):
xmpx = xe-x0
xm = xmt/xmpx
ympx = ye-y0
ym = -ymp/ympx
#coordinate transformation
newx = (event.x-x0)*(xm)+xc
newy = (event.y-y0)*(ym)+yc
#outputting x and y coords to console
print (newx,newy)
#mouseclick event
w.bind("<Button 1>",printcoords)
root.mainloop()
最简单的方法就是将x,y设置为全局,class与否无所谓。 我没有看到你的完整代码,因为我无法在 phone 上打开 zip 文件。所以这就是我可以帮助你的例子
import tkinter as tk
def getorigin(eventorigin):
global x,y
x = eventorigin.x
y = eventorigin.y
print(x,y)
root = tk.Tk()
root.bind("<Button 1>",getorigin)
如果我在之前的评论中所说的是你想要做的,因为 tkinter 不会暂停程序来等待鼠标点击事件,你将不得不这样做:它每次重新绑定它鼠标按钮被点击
from tkinter import *
from tkinter.filedialog import askopenfilename
from PIL import Image, ImageTk
import tkinter.simpledialog
root = Tk()
#setting up a tkinter canvas
w = Canvas(root, width=1000, height=1000)
w.pack()
#adding the image
File = askopenfilename(parent=root, initialdir="./",title='Select an image')
original = Image.open(File)
original = original.resize((1000,1000)) #resize image
img = ImageTk.PhotoImage(original)
w.create_image(0, 0, image=img, anchor="nw")
#ask for pressure and temperature extent
xmt = tkinter.simpledialog.askfloat("Temperature", "degrees in x-axis")
ymp = tkinter.simpledialog.askfloat("Pressure", "bars in y-axis")
#ask for real PT values at origin
xc = tkinter.simpledialog.askfloat("Temperature", "Temperature at origin")
yc = tkinter.simpledialog.askfloat("Pressure", "Pressure at origin")
#instruction on 3 point selection to define grid
tkinter.messagebox.showinfo("Instructions", "Click: \n"
"1) Origin \n"
"2) Temperature end \n"
"3) Pressure end")
# From here on I have no idea how to get it to work...
# Determine the origin by clicking
def getorigin(eventorigin):
global x0,y0
x0 = eventorigin.x
y0 = eventorigin.y
print(x0,y0)
w.bind("<Button 1>",getextentx)
#mouseclick event
w.bind("<Button 1>",getorigin)
# Determine the extent of the figure in the x direction (Temperature)
def getextentx(eventextentx):
global xe
xe = eventextentx.x
print(xe)
w.bind("<Button 1>",getextenty)
# Determine the extent of the figure in the y direction (Pressure)
def getextenty(eventextenty):
global ye
ye = eventextenty.y
print(ye)
tkinter.messagebox.showinfo("Grid", "Grid is set. You can start picking coordinates.")
w.bind("<Button 1>",printcoords)
#Coordinate transformation into Pressure-Temperature space
def printcoords(event):
xmpx = xe-x0
xm = xmt/xmpx
ympx = ye-y0
ym = -ymp/ympx
#coordinate transformation
newx = (event.x-x0)*(xm)+xc
newy = (event.y-y0)*(ym)+yc
#outputting x and y coords to console
print (newx,newy)
root.mainloop()