Tkinter bekommen Maus-Koordinaten auf klicken Sie auf und verwenden Sie als Variablen
Ich bin komplett neu in Python. Also nicht zu Sauer auf mich, weil ich sicher bin, dass es grundlegende Dinge, die mir fehlen. Hier ist mein problem:
Ich versuche zu extrahieren Maus-Klick Koordinaten aus einem Bild und verwenden diese Koordinaten als Variablen.
Code ermöglicht das importieren und Bild, von denen ich möchte zum extrahieren der Koordinaten. Einige Aufforderungen, bitten Sie den Benutzer über Größe und Umfang des Diagramms, nach welcher, ich möchte gerne ein Koordinaten-Gitter, indem Sie auf den Ursprung und den Endpunkt auf der x - und y-Achsen. Die Idee ist, diese 3 Sätze von Koordinaten und transformieren Sie in Druck-und Temperatur-Koordinaten durch einige transformation von Funktionen (siehe code).
# 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 = ...
Ich weiß wirklich nicht, wie das zuweisen der Koordinaten, die ich durch klicken, auf eine neue variable, die ich verwenden können, die später im code.
Kann ich drucken Sie die Koordinaten, aber da Sie eine Funktion, Sie sind lokal und werden nicht nutzbare außerhalb der Funktion (soweit ich das verstehen konnte). So, und den Ansatz mit Klassen könnte besser sein, aber ich habe keine Ahnung, wie das geht.
Jede Hilfe ist willkommen.
VOLLSTÄNDIGEN CODE (ANGEPASST):
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()
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn das, was ich sagte in meinem vorherigen Kommentar ist das, was du versuchst zu tun, da tkinter nicht das Programm angehalten zu warten, für ein Mausklick-Ereignis, das Sie haben, dies zu tun: es bindet es jedes mal, wenn die Maustaste gedrückt bekommen geklickt
ympx=ye-y0
zuympx=y0-ye
flip-Koordinatensystem (aber das hat nichts mit der Frage zu tun, ahaha).Der einfachste Weg ist, um x, y zu globalen, Klasse oder nicht, spielt keine Rolle.
Ich sah nicht, Ihren vollständigen code, denn ich kann nicht öffnen Sie zip-Dateien auf meinem Handy. So, hier ist, was ich kann Ihnen helfen, mit Ihrem Beispiel
print(x,y)
am Ende, die FehlermeldungNameError: name 'x' is not defined
wird gezeigt. Könnte es sein, dass ich einige irgendwie eineif
Anweisung oder Schleife, um speichern zu können, die 3 Koordinaten, die einer nach dem anderen?you can only bind "<Button 1>" once using w.bind
: Ich denke, dass ich etwas neues gelernt heute 🙂 vielen Dank!