3D-графики Python Tkinter не могут панорамироваться или масштабироваться - PullRequest
0 голосов
/ 10 января 2019

Я пытался включить 2d / 3d графики с помощью matplotlib в мое приложение Python GUI с использованием TKinter и добился успеха с 2d графиками, но не с 3D графиками. Моя проблема заключается в том, что ни один из трехмерных графиков нельзя панорамировать или масштабировать, даже если кнопки на панели навигации реагировали на нажатия кнопок. Вот пример кода, демонстрирующего мою проблему:

import tkinter as tk

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
import numpy as np

root = tk.Tk()
frame = tk.Frame(root)
frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

#uncomment as needed to demonstrate 2d/3d plot
#subplot_kw = {'projection':'3d'}
subplot_kw = {}
fig, ax = plt.subplots(subplot_kw=subplot_kw)
if len(subplot_kw) > 0:
    ax.plot(range(100), np.random.rand(100), np.random.rand(100))
else:
    ax.plot(range(100), np.random.rand(100))

canvas = FigureCanvasTkAgg(fig, frame)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)

toolbar = NavigationToolbar2Tk(canvas, frame)
toolbar.update()

root.mainloop()

Поэтому, когда я строю 2d, используя приведенный выше код, панорамирование / масштабирование работает, как и ожидалось. Когда я изменил закомментированные строки и использовал трехмерный график, панорамирование / масштабирование не работает. Я упускаю что-то простое или есть проблема с 3d панорамированием / увеличением в tkinter с matplotlib?

1 Ответ

0 голосов
/ 10 января 2019

Во-первых, не используйте pyplot для создания фигуры, которую вы хотите встроить в tkinter (или любой другой графический интерфейс), потому что наличие одной и той же фигуры, управляемой pyplot, а также вашего пользовательского графического интерфейса пользователя, может привести к всевозможным проблемам. Использование matplotlib.figure.Figure (как показано в в примере «Внедрение в tk» ) в этом случае даст дополнительное преимущество при выдаче предупреждения о проблеме:

UserWarning: Axes3D.figure.canvas is 'None', mouse rotation disabled. Set canvas then call Axes3D.mouse_init().

Это по сути означает, что вам нужно либо вызвать mouse_init(), либо просто создать трехмерные оси после установки холста. Последнее показано ниже.

import tkinter
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.backends.backend_tkagg import (
                                    FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figure

root = tkinter.Tk()
root.wm_title("Embedding in Tk")

fig = Figure(figsize=(5, 4), dpi=100)

canvas = FigureCanvasTkAgg(fig, master=root)  # A tk.DrawingArea.
canvas.draw()

ax = fig.add_subplot(111, projection="3d")
t = np.arange(0, 3, .01)
ax.plot(t, 2 * np.sin(2 * np.pi * t))

toolbar = NavigationToolbar2Tk(canvas, root)
toolbar.update()
canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)


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