2014-12-22 4 views
2

Я пишу GUI-пакет на Python с модулем Tkinter и используя matplotlib через FigureCanvasTkAgg, чтобы показать некоторые графические данные. Я также хочу взаимодействовать с этим визуальным представлением данных через метод canvas.mpl_connect . Все работает нормально, но я не удовлетворен указателем стрелки по умолчанию: он не позволяет точно нажимать на мои данные (фактическая «точка клика» не совпадает с кончиком стрелки), а также она скрывает от пользователя некоторые рядом с пинтой щелчка. Итак, вопрос в том, как изменить курсор по умолчанию? Я попытался изменить его с помощью методов конфигурации Tk (например, master.config (cursor = "tcross")), но, очевидно, у canvas matplotlib есть своя конфигурация курсора, потому что эта строка изменяет внешний вид курсора над всеми частями главного окна, за исключением MPL холст, над холстом по-прежнему отображается стрелка по умолчанию.Курсор на холсте matplotlib в Tkinter

+1

Существует не полная система для этого, но посмотрите на http://matplotlib.org/examples/widgets/cursor.html (обратите внимание, что blit будет отлично работать и на TkAgg. используя blitting в другом месте вашего кода, вам нужно будет беспокоиться о синхронизации вещей, но это отдельная проблема.) –

+0

Спасибо! Это очень интересное решение, но есть ли возможность скрыть/отключить средний курсор (стрелка)? Теперь я вижу как стрелочный указатель, так и этот красивый виджет курсора MPL. –

ответ

2

Прежде всего, несколько предостережений: я собираюсь погрузиться в некоторые детали реализации. Я думаю, что панель инструментов была недавно реорганизована, поэтому некоторые из них могут измениться со следующей версией 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.

+1

Благодарим вас за подробный ответ! Это решение именно то, что я хотел и хорошо работает. Одна небольшая ошибка: когда курсор перемещается из области MPL, он не изменяется обратно по умолчанию (т.е. в начале курсор стрелка, затем, когда я перемещаю его в область MPL, он превращается в cofee_mug или что-то еще, но когда Я переезжаю, если он, все еще в форме кружки). Я понял, что эта ошибка может быть исправлена, если форма курсора явно выбрана с помощью 'config (cursor = 'стрелка')' метода для других виджетов. –

Смежные вопросы