Предотвратить матплотлиб от поднятия фигуры - PullRequest
0 голосов
/ 01 мая 2018

Я недавно обновился до matplotlib 2.1.1 (раньше я использовал 1.5 или около того). Теперь matplotlib продолжает поднимать окна с фигурами на передний план. Раньше это имело место для вновь созданных окон (что имеет смысл), но теперь окна выводятся на передний план всякий раз, когда в скрипте вызывается pause ().

Python 3.6.5 (default, Apr  1 2018, 05:46:30) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib
>>> matplotlib.use('TkAgg')
>>> import matplotlib.pyplot as plt
>>> plt.figure()
<matplotlib.figure.Figure object at 0x7fab8c0ace80>
>>> plt.pause(1)  # <--- the figure gets created and put into foreground here (this is expected)
>>> plt.pause(1)  # <--- the figure gets put into foreground again here (this is undesired)

Странно, поведение немного меняется в других бэкэндах. При использовании qt5 странное поведение поднятия происходит только тогда, когда pause () выполняется более одного раза без интерактивного приглашения между ними:

Python 3.6.5 (default, Apr  1 2018, 05:46:30) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib
>>> matplotlib.use('Qt5Agg')
>>> import matplotlib.pyplot as plt
>>> plt.figure()
<matplotlib.figure.Figure object at 0x7fcaeff5de80>
>>> plt.pause(1)  # <--- the figure gets created and put into foreground here
>>> plt.pause(1)  # <--- the figure stays in background
>>> plt.pause(1); plt.pause(1) # <--- the figure gets put in foreground when the second pause is executed.

Кто-нибудь знает, как отключить это поведение? У меня есть приложение, которое часто обновляет цифры и использует паузу. С фигурами, появляющимися на переднем плане все время, компьютер становится совершенно непригодным для любой другой работы.

Система: Ubuntu 18.04 (протестировано с использованием Gnome и Unity) Матплотлиб 2.1.1 Python 3.6.5

1 Ответ

0 голосов
/ 01 мая 2018

Ссылка ngoldbaum размещена и исходный код показывает проблему. Пауза теперь предназначена для того, чтобы всегда поднимать все цифры. Основываясь на этом, я смог создать обходной путь, который избегает использования pause (), но позволяет мне обновлять и приостанавливать фигуры по мере необходимости.

Требуются две вещи:

1) Каждая вновь созданная фигура должна быть показана. В противном случае окно может никогда не появиться. Таким образом, рисунки создаются с помощью команд

figure = plt.figure()
figure.canvas.manager.show()

2) Эффективно код pause () без show () выполняется всякий раз, когда я не должен был делать паузу:

manager = matplotlib.backend_bases.Gcf.get_active()
if manager is not None:
    canvas = manager.canvas
    if canvas.figure.stale:
        canvas.draw_idle()
    canvas.start_event_loop(1)

Здесь аргумент для canvas.start_event_loop - это продолжительность, на которую мы хотим сделать паузу.

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