Можно ли создать собственный курсор мыши с помощью Python Tkinter? (Используя matplotlib с бэкендом TkAgg)

Вполне вероятно, что это всего лишь общий вопрос о Python Tkinter, а не обязательно о matplotlib.

Итак, я разрабатываю довольно большой набор функций построения графиков поверх matplotlib с использованием бэкэнда Matplotlib «TkAgg» (рендеринг Agg на холст Tk с использованием TkInter). Я использую некоторые функции масштабирования по умолчанию, предоставляемые matplotlib из коробки... в частности, кнопку «Увеличить до поля» на панели инструментов matplotlib по умолчанию. Я создаю свою собственную панель инструментов, создавая подкласс существующего класса «matplotlib.backends.backend_tkagg.NavigationToolbar2TkAgg».

В значительной степени проблема здесь в том, что я ненавижу значок по умолчанию, который использует «Увеличить до окна» (Tkinter «tcross»). Я понял, как использовать другой встроенный курсор Tkinter (например, это меняет курсор на «плюс» вместо «tcross»):

import matplotlib
matplotlib.use('TkAgg')

import matplotlib.backend_bases
import matplotlib.backends.backend_tk_agg

matplotlib.backends.backend_tkagg.cursord[matplotlib.backend_bases.cursors.SELECT_REGION] = "plus"

И вообще, я знаю, что для смены текущего курсора мыши на один из встроенных в Tkinter из класса панели инструментов я могу просто вызвать:

self.window.configure(cursor="cursor_name")

Так что мне бы очень, очень хотелось иметь возможность использовать значок увеличительного стекла, когда пользователь находится в «режиме масштабирования». У меня уже есть .ppm значка увеличительного стекла, который я хотел бы использовать, и все такое, но я не могу понять, как использовать увеличительное стекло в качестве значка курсора мыши. Можно ли использовать пользовательское изображение в качестве курсора мыши в Python Tkinter? Помощь!

Примечание о платформе. Это должно работать в Mac OS X 10.5+, RedHat Enterprise Linux 5 и, возможно, в Solaris 10, поэтому решение для конкретной платформы нежелательно.


person Brent Writes Code    schedule 09.12.2009    source источник
comment
Кстати, в Tkinter есть встроенные значки мыши для Gumby и U.S.S Enterprise, но нет увеличительного стекла? Странный.   -  person Brent Writes Code    schedule 10.12.2009
comment
Может ли кто-нибудь дать ответ для Windows python 3.2.2   -  person Hippolippo    schedule 17.04.2018


Ответы (1)


Что-то подобное работает с файлами unix X11 XBM:

import Tkinter
t = Tkinter.Tk()
t.configure(cursor=('@/usr/include/X11/bitmaps/star', '/usr/include/X11/bitmaps/starMask', 'black', 'white'))
t.mainloop()

Что касается компьютеров Mac, на странице руководства для «Tk_GetCursorFromData»:

Версия Tk для Macintosh поддерживает все курсоры X, а также любые стандартные курсоры Mac, включая ibeam, перекрестие, часы, плюс и стрелку. Кроме того, Tk будет загружать ресурсы курсора Macintosh типов crsr (цветной) и CURS (черно-белый) по имени ресурса.
Приложение и все файлы ресурсов его открытой динамической библиотеки будут искать именованный курсор. В случае конфликтов цветные курсоры всегда будут загружаться вместо черно-белых курсоров.

person Mark    schedule 10.12.2009
comment
@Марк спасибо за отзыв. Думаю, я просто надеялся, что есть более простой способ конвертировать мой существующий PNG, чем конвертировать его в растровый формат X11 (если вы посмотрите на эти файлы, они на самом деле представляют собой код C с массивами пикселей в изображении) . Я попробую и посмотрю, делает ли он то, что я хочу. - person Brent Writes Code; 19.12.2009
comment
@ Брент, я только что провел тест с всегда превосходной утилитой конвертации ImageMagick. Он может конвертировать PNG в XBM. - person Mark; 19.12.2009
comment
Спасибо за ответ. Извините за слишком запоздалый прием. - person Brent Writes Code; 19.08.2010