Как получить обратный звонок, если нажать где-то, но на фигуре? - PullRequest
0 голосов
/ 14 февраля 2019

Я написал код, который позволяет щелкать внутри виджета ввода и активировать функцию, которая возвращает координаты мыши при нажатии на фигуру.Проблема в том, что я хочу щелкнуть где-то еще, кроме виджета фигуры или ввода, чтобы деактивировать функцию, но я не знаю, как это сделать.

То, что я пробовал до сих пор, - это связывание (с bind)функция обратного вызова, которая отключает функцию select_marker до master (что, очевидно, не имеет смысла) или до определенной Frame (не помогло).Я не мог найти никакого решения, просматривая SO или Интернет.

import sys
if sys.version_info[0] < 3:
    import Tkinter as Tk
else:
    import tkinter as Tk
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import numpy as np

class Application():

    def __init__(self, master):

        self.master = master
        master.iconify

        self.entry_frame = Tk.Frame(master)
        self.entry_frame.pack(side=Tk.TOP, fill=Tk.BOTH, expand=0)

        self.m1_label = Tk.Label(self.entry_frame, text='Mouse Coordinates: ')
        self.m1_label.pack(side=Tk.LEFT)
        self.m1_entry = Tk.Entry(self.entry_frame, width=10)
        self.m1_entry.pack(side=Tk.LEFT)
        self.m1_entry.bind('<Button-1>', lambda e:self.callback(1))

        self.image_frame = Tk.Frame(master)
        self.image_frame.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
        self.image_frame.bind('<Button-1>', lambda e:self.callback(0))  # something like this

        self.fig = Figure()
        self.ax = self.fig.add_subplot(111)
        self.ax.set_aspect('equal')

        self.canvas = FigureCanvasTkAgg(self.fig, self.image_frame)
        self.canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
        self.canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)  

        self.widget_active = 0
        self.fig.canvas.mpl_connect('button_press_event', self.select_marker)


    def callback(self, state):
        self.widget_active = state
        print(state)

    def select_marker(self, event):
        if self.widget_active == 1:
            if event.button == 1:
                x = np.round(event.xdata,2)
                y = np.round(event.ydata,2)
                print(x,y)
                self.m1_entry.delete(0,'end')
                self.m1_entry.insert(0,(str(x)+', '+str(y)))
            else:
                pass
        if self.widget_active == 0:
            pass

root = Tk.Tk()
Application(root)
root.mainloop()

Я был бы очень признателен, если бы кто-нибудь знал способ получить обратный вызов, если щелкнуть где-нибудь, кроме виджета ввода или рисунка.Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...