matplotlib PolygonSelector зависает при вызове в tkinter - PullRequest
0 голосов
/ 28 декабря 2018

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

Следует отметить, что эта проблема возникает, когда включен интерактивный режим рисунка matplotlib.

Упрощенный код и результат показаны ниже:

#!/usr/bin/env python3
import matplotlib
matplotlib.use("TkAgg")
import tkinter as tk
import matplotlib.pyplot as plt
from matplotlib.widgets import PolygonSelector

root = tk.Tk()

def draw():
    fig = plt.figure()
    ax = fig.add_subplot(111)
    plt.ion()    # interactive mode is on
    plt.show()

    def onselect(data_input):
        print(data_input)

    PS = PolygonSelector(ax, onselect)

tk.Button(root, text='draw', command=draw).pack()
root.mainloop()

Это график после нажатия кнопки «рисовать» в графическом интерфейсе tkinter, начальная точка многоугольника застряла в точке (0,0), ожидается, что она будет двигаться с курсором:

enter image description here

Когда я звоню draw() за пределами Ткинтера, PolygonSelector работает нормально:

def draw():
    fig = plt.figure()
    ax = fig.add_subplot(111)
    plt.ion()    # interactive mode is on
    plt.show()

    def onselect(data_input):
        print(data_input)

    PS = PolygonSelector(ax, onselect)
    a = input()    # prevent window from closing when execution is done
draw()

enter image description here

1 Ответ

0 голосов
/ 28 декабря 2018

Простым решением было бы сделать ваш Polygon Selector глобальной переменной.Это позволит визуально обновлять селектор.

#!/usr/bin/env python3
import tkinter as tk
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.widgets import PolygonSelector
matplotlib.use("TkAgg")


root = tk.Tk()
ps = None

def draw():
    global ps
    fig = plt.figure()
    ax = fig.add_subplot(111)
    plt.ion()
    plt.show()
    ps = PolygonSelector(ax, on_select)


def on_select(data_input):
    print(data_input)

tk.Button(root, text='draw', command=draw).pack()
root.mainloop()

Если вы встроите его в класс, вы можете избежать использования global и получить желаемое поведение, применив Polygon Selector в качестве атрибута класса.

#!/usr/bin/env python3
import tkinter as tk
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.widgets import PolygonSelector
matplotlib.use("TkAgg")


class GUI(tk.Tk):
    def __init__(self):
        super().__init__()
        self.ps = None
        tk.Button(self, text='draw', command=self.draw).pack()

    def draw(self):
        fig = plt.figure()
        ax = fig.add_subplot(111)
        plt.ion()
        plt.show()
        self.ps = PolygonSelector(ax, self.on_select)

    def on_select(self, data_input):
        print(data_input)


if __name__ == "__main__":
    GUI().mainloop()

Результаты:

enter image description here

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