Ну, я наткнулся на решение, когда работал над чем-то другим.
Когда я использую бэкэнд MacOSX
, то fig.canvas.manager.window
дает AttributeError: 'FigureManagerMac' object has no attribute 'window'
. Однако, когда я использую бэкенд TkAgg
, fig.canvas.manager
имеет атрибут window
. Таким образом, я могу реализовать это предложение следующим образом:
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
fig = plt.figure()
plt.plot([0,1],[0,1])
#Put figure window on top of all other windows
fig.canvas.manager.window.attributes('-topmost', 1)
#After placing figure window on top, allow other windows to be on top of it later
fig.canvas.manager.window.attributes('-topmost', 0)
Достаточно просто, не так ли? Первая сложная часть заключается в том, что вы должны установить серверную часть, прежде чем импортировать pyplot. По моему опыту, изменение бэкэнда впоследствии ничего не дает. Вторая сложная часть заключается в том, что сценарий запуска Spyder Scientific Startup делает import matplotlib.pyplot as plt
правильно, когда вы запускаете Spyder IDE, поэтому у вас нет возможности установить серверную часть до того, как pyplot будет импортирован. Чтобы обойти это, перейдите в «Настройки» -> «Консоль» -> «Внешние модули», установите для GUI Backend значение TkAgg и перезапустите Spyder. Тогда приведенный выше код работает правильно.
Раньше я устанавливал бэкэнд через matplotlib.rcParams['backend'] = 'TkAgg'
сразу после запуска Spyder. Однако, когда я делал что-то еще, я начал получать ошибки, в которых упоминался бэкэнд MacOSX
. Это не имело для меня никакого смысла, так как я думал, что использую TkAgg
. Самое ужасное, что когда я запросил matplotlib.get_backend
, он вернул TkAgg
! По-видимому, установка бэкэнда после импорта pyplot действует так, как если бы вы изменили бэкэнд, но на самом деле это не меняет бэкэнд. Аргг!!
person
Stretch
schedule
17.11.2013