На этом шаге мы рассмотрим приложение, строящее трехмерный объект.
В примере ниже мы повторим последовательномть шагов предыдущего шага, создавая трехмерное изображение сферы.
from tkinter import * import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg # добавление кнопки "Выход" def prog_quit(): root.quit() # stops mainloop root.destroy() # используется в Windows root = Tk() frm = Frame(root, relief=RIDGE, borderwidth=4) frm.pack(fill=BOTH, expand=1) fig = plt.figure(figsize=(4, 4)) ax = Axes3D(fig) # рисуем сферу по ее параметрическим уравнениям u = np.linspace(0, 2 * np.pi, 100) v = np.linspace(0, np.pi, 100) X = np.outer(np.cos(u), np.sin(v)) Y = np.outer(np.sin(u), np.sin(v)) Z = np.outer(np.ones(np.size(u)), np.cos(v)) ax.plot_surface(X, Y, Z, rstride=4, cstride=4, color='lightgreen', linewidth=1) canvasAgg = FigureCanvasTkAgg(fig, master=frm) canvasAgg.draw() canvasAgg.get_tk_widget().pack(side='top', fill='both', expand=1, padx=4, pady=4) ax.mouse_init() # подключение событий мыши button = Button(master=root, text='Выход', command=prog_quit) button.pack(side=BOTTOM) root.mainloop()
Программа начинается с импортирования необходимых модулей и создания главного окна программы. Затем мы рисуем трехмерную сферу, используя трехмерную графическую область Axes3D:
fig = plt.figure(figsize=(4, 4)) ax = Axes3D(fig) # рисуем сферу по ее параметрическим уравнениям u = np.linspace(0, 2 * np.pi, 100) v = np.linspace(0, np.pi, 100) X = np.outer(np.cos(u), np.sin(v)) Y = np.outer(np.sin(u), np.sin(v)) Z = np.outer(np.ones(np.size(u)), np.cos(v)) ax.plot_surface(X, Y, Z, rstride=4, cstride=4, color='lightgreen', linewidth=1)
После создания графического окна fig с графической областью ax в памяти, мы создаем объект класса "составного" холста FigureCanvasTkAgg, который связывается с объектом fig и родительским виджетом - рамкой frm:
canvasAgg = FigureCanvasTkAgg(fig, master=frm)
Затем "составной" холст отображается методом draw() и размещается менеджером pack():
canvasAgg.draw() canvasAgg.get_tk_widget().pack(side='top', fill='both', expand=1, padx=4, pady=4)
Чтобы трехмерное изображение можно было вращать мышкой, используем инструкцию ax.mouse_init(), которая подключает события мыши к графической области рисунка ax. Эта инструкция должна вызываться после создания составного холста:
ax.mouse_init() # подключение событий мыши
В конце примера мы создаем кнопку завершения приложения и вызываем цикл обработки сообщений mainloop():
button = Button(master=root, text='Выход', command=prog_quit)
button.pack(side=BOTTOM)
root.mainloop()
Результат работы программы показан на рисунке 1.
Рис.1. Результат работы приложения
На следующем шаге мы рассмотрим одновременное использование векторной графики и графики matplotlib.