Я пишу GUI-пакет на Python с модулем Tkinter и используя matplotlib через FigureCanvasTkAgg, чтобы показать некоторые графические данные. Я также хочу взаимодействовать с этим визуальным представлением данных через метод canvas.mpl_connect . Все работает нормально, но я не удовлетворен указателем стрелки по умолчанию: он не позволяет точно нажимать на мои данные (фактическая «точка клика» не совпадает с кончиком стрелки), а также она скрывает от пользователя некоторые рядом с пинтой щелчка. Итак, вопрос в том, как изменить курсор по умолчанию? Я попытался изменить его с помощью методов конфигурации Tk (например, master.config (cursor = "tcross")), но, очевидно, у canvas matplotlib есть своя конфигурация курсора, потому что эта строка изменяет внешний вид курсора над всеми частями главного окна, за исключением MPL холст, над холстом по-прежнему отображается стрелка по умолчанию.Курсор на холсте matplotlib в Tkinter
ответ
Прежде всего, несколько предостережений: я собираюсь погрузиться в некоторые детали реализации. Я думаю, что панель инструментов была недавно реорганизована, поэтому некоторые из них могут измениться со следующей версией matplotlib. Кроме того, эти значения, которые я указал для курсора, применимы только к бэкенду TkAgg
. Общая концепция аналогична для других бэкендов, но местоположение cursord
и ориентированные на бэкэнд курсоры будут различаться. В качестве примера для Qt4Agg
, cursord
dict находится в backend_qt4
вместо backend_qt4agg
, а значениями являются Qt-курсоры: например. QtCore.Qt.ArrowCursor
.
Как я уже упоминал в своем комментарии, взгляните на matplotlib's Cursor
widget. Тем не менее, более широкая проблема, связанная с настройкой использования курсора (ов) matplotlib, немного более дорога.
Причина, по которой вы не можете напрямую изменить использование курсора matplotlib (например, master.config(cursor='whatever')
), заключается в том, что панель инструментов по умолчанию переопределяет его (разные курсоры для разных инструментов на панели инструментов).
Один из вариантов - не добавлять панель инструментов. В этом случае вы можете просто позвонить parent.config(cursor='tcross')
и сделать это. Однако вы, вероятно, хотите, чтобы панель инструментов присутствовала для упрощения панорамирования/масштабирования/и т. Д.
На панели инструментов используется указатель настоящих курсоров для каждого инструмента: backend_tkagg.cursord
. Ключами для этого являются коды int
, поэтому читать их можно с помощью matplotlib.backend_bases.cursors
. Инструментом по умолчанию является cursors.POINTER
.
Как простой пример (Для простоты я использую интерфейс pyplot
построить холст, рисунок и т.д.)
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from matplotlib.backend_bases import cursors
import matplotlib.backends.backend_tkagg as tkagg
# Change the default cursor to any valid TK cursor
# To hide it, you'd use the string "none" (or possibly "no" on windows)
tkagg.cursord[cursors.POINTER] = 'coffee_mug'
fig, ax = plt.subplots()
plt.show()
Обратите внимание, что вы также можете управлять курсором для любого инструмента (например, увеличение , панорамирование и т. д.). Ваши варианты: cursor.HAND
, cursor.POINTER
, cursor.SELECT_REGION
и cursor.MOVE
.
Благодарим вас за подробный ответ! Это решение именно то, что я хотел и хорошо работает. Одна небольшая ошибка: когда курсор перемещается из области MPL, он не изменяется обратно по умолчанию (т.е. в начале курсор стрелка, затем, когда я перемещаю его в область MPL, он превращается в cofee_mug или что-то еще, но когда Я переезжаю, если он, все еще в форме кружки). Я понял, что эта ошибка может быть исправлена, если форма курсора явно выбрана с помощью 'config (cursor = 'стрелка')' метода для других виджетов. –
- 1. Python tkinter: как ограничить курсор мыши в холсте?
- 2. несколько задач на холсте tkinter?
- 3. Python Tkinter _tkinter.TclError на холсте
- 4. Вращение площади на холсте Tkinter
- 5. метод удаления на холсте tkinter
- 6. Tkinter: Масштабирование элементов на холсте
- 7. tkinter images на холсте исчезает
- 8. рисунок на холсте // python tkinter
- 9. Полоса прокрутки на холсте в Tkinter
- 10. Обновление плитки на холсте в tkinter
- 11. Запуск matplotlib в tkinter
- 12. Поворот линии в холсте Tkinter
- 13. Получение пользовательской легенды на холсте на matplotlib
- 14. Установите курсор для выбора текста matplotlib
- 15. Как обновить сюжет на холсте Tkinter?
- 16. Вертикальный текст в холсте Tkinter
- 17. Список отслеживания элементов на холсте (tkinter)
- 18. Рисунок на холсте tkinter из командной строки
- 19. Изображение не будет отображаться на холсте tkinter
- 20. Tkinter - создать мигающую графику на холсте?
- 21. Отображение изображения на холсте tkinter не работает
- 22. Понимание ограничений производительности на холсте Tkinter
- 23. Как обновить изображения на холсте Tkinter?
- 24. Сделать кнопки работать на холсте (tkinter)
- 25. одновременное перемещение нескольких объектов на холсте Tkinter
- 26. Tkinter: рисовать круг на холсте без create_oval
- 27. Удаление строк на холсте python tkinter
- 28. Обновление текстового поля на холсте tkinter
- 29. Рисование этикеток на холсте с использованием Tkinter
- 30. отслеживание собственных объектов на холсте tkinter
Существует не полная система для этого, но посмотрите на http://matplotlib.org/examples/widgets/cursor.html (обратите внимание, что blit будет отлично работать и на TkAgg. используя blitting в другом месте вашего кода, вам нужно будет беспокоиться о синхронизации вещей, но это отдельная проблема.) –
Спасибо! Это очень интересное решение, но есть ли возможность скрыть/отключить средний курсор (стрелка)? Теперь я вижу как стрелочный указатель, так и этот красивый виджет курсора MPL. –