Здравствуйте. Пишу маленькую гуишку, которая строит графики при загрузке файлов.
Проблема — хочу, чтобы при нажатии кнопок «Нижний предел» и «Верхний предел» в окне, где строится график, изменялся курсор, и при нажатии на график менялся на стандартный. Непонятно, потому что у FigureCanvasTkAgg
нет метода config
а в опциях нельзя установить курсор. Какие есть варианты?
import matplotlib from matplotlib.figure import Figure from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg from tkinter import * class CustomToolbar(NavigationToolbar2TkAgg): toolitems = filter(lambda x: x[0] != "Home", NavigationToolbar2TkAgg.toolitems) class GUI: def __init__(self, parent): self.parent = parent self.initUI() def initUI(self): f1 = Frame(self.parent, width=1000, height=500) f1.pack() global fig1, a, canvas fig1 = Figure(figsize=(6.5, 4.5)) a = fig1.add_subplot(111) canvas = FigureCanvasTkAgg(fig1, master=self.parent) canvas.get_tk_widget().pack() canvas.get_tk_widget().place(x=300, y=40) lbl1 = Button(f1, text='Нижний предел', command=self.connect_canv) lbl1.pack() lbl1.place(x=80, y=20) lbl2 = Button(f1, text='Верхний предел') lbl2.pack() lbl2.place(x=80, y=50) self.entry = Entry(f1, width=10) self.entry.pack() self.entry.place(x=10, y=20) self.entry2 = Entry(f1, width=10) self.entry2.pack() self.entry2.place(x=10, y=50) self.toolbar = CustomToolbar(canvas, self.parent) def plt_g(self, values, time): a.clear() a.plot(values, time) a.set_title("Current graphic", fontsize=15) a.set_ylabel("Signal", fontsize=13) a.set_xlabel("N", fontsize=13) canvas.draw() def getXY(self, event): x, y = event.inaxes.transData.inverted().transform((event.x, event.y)) getx = event.x if self.entry.get() == '': self.entry.insert(0, str('%1.2f' % x)) fig1.canvas.mpl_disconnect(cid) else: pass def connect_canv(self): self.entry.delete(0, END) global cid cid = fig1.canvas.mpl_connect('button_press_event',self.getXY) def main(): root = Tk() root.geometry("1000x560") root.resizable(0, 0) app = GUI(root) root.mainloop() if __name__ == '__main__': main()
Да, у FigureCanvasTkAgg
нет config/configure
метода, потому что он наследуется от FigureCanvasAgg
и не обеспечивает Tkinter-widget
интерфейса.
Вы же хотите работать с tkinter.Canvas
, ссылку на который вы уже умеете получать. Вот пример из вышего кода:
canvas.get_tk_widget().pack() canvas.get_tk_widget().place(x=300, y=40)
Точно таким же образом можно и менять вид курсора:
canvas.get_tk_widget().configure(cursor='pirate')
или:
canvas._tkcanvas.configure(cursor='pirate')
UPD Описанный выше метод устанавливает курсор для всего canvas
. Если необходимо, чтобы курсор менялся только в области осей:
-
Необходимо переопределить метод
_set_cursor
дляCustomToolbar
:def _set_cursor(self, event): if event.inaxes and self._active == 'CUSTOM_LIMIT': self.window.configure(cursor='pirate') self._lastCursor = None return NavigationToolbar2TkAgg._set_cursor(self, event)
-
В методе
connect_canv
устанавливать флаг:self.toolbar._active = 'CUSTOM_LIMIT'