Вопрос по coordinates, click, tkinter, python, mouse – Вы пытаетесь заставить программу ждать, пока пользователь что-то нажмет? Затем продолжите ждать, пока пользователь снова нажмет что-нибудь еще?

2

ершенно новичок в Python. Поэтому не сердитесь на меня, потому что я уверен, что есть основные вещи, которые мне не хватает. Вот моя проблема:

Я пытаюсь извлечь координаты щелчка мышью из изображения и использовать эти координаты в качестве переменных.

Код позволяет импортировать и изображение, из которого я хочу извлечь координаты. Некоторые подсказки спрашивают пользователя о размере и экстенте диаграммы, после чего я хотел бы настроить координатную сетку, щелкнув начало и конечную точку на осях X и Y соответственно. Идея состоит в том, чтобы использовать эти 3 набора координат и преобразовать их в координаты давления и температуры с помощью некоторых функций преобразования (см. Код).

# 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()

Ваш Ответ

2   ответа
2

Если то, что я сказал в своем предыдущем комментарии, это то, что вы пытаетесь сделать, так как 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()
ВАУ, кажется, это делает то, что я хочу (возможно, мне придется адаптировать свои преобразования, но в остальном программа в порядке!) Я занимаюсь другими делами прямо сейчас, но позже опробую и прокомментирую. Спасибо! Lele
Все работает. Спасибо! (только пришлось изменитьympx=ye-y0 вympx=y0-ye перевернуть систему координат (но это не имеет ничего общего с вопросом, ахаха). Lele
1

Самый простой способ - установить x, y в global, class или нет, не имеет значения. Я не видел ваш полный код, потому что я не могу открыть 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)
Я адаптировал код. Сама часть, кажется, работает, но в контексте полного кода это не так. Если я попробуюprint(x,y) в конце сообщение об ошибкеNameError: name 'x' is not defined показано. Может быть, мне нужен какой-тоif оператор или цикл для того, чтобы иметь возможность сохранять 3 координаты одну за другой? Lele
Вот это адаптированная версия полного кода Lele
@ Леле, вы можете связать «<Button 1>» только один раз, используя w.bind. Делая это повторно, просто замените предыдущую привязку abccd
@ Леле, ты не против скопировать и вставить свой адаптированный код в свой вопрос в разделе РЕДАКТИРОВАТЬ. Я нахожусь на моем телефоне, поэтому я не могу просматривать файлы .py abccd
Вы пытаетесь заставить программу ждать, пока пользователь что-то нажмет? Затем продолжите ждать, пока пользователь снова нажмет что-нибудь еще? abccd

Похожие вопросы