Шаг 73.
Библиотека Tkinter. Компоненты и вспомогательные классы. Нестилизуемые компоненты. Компонент Canvas: построение трехмерного объекта

    На этом шаге мы рассмотрим приложение, строящее трехмерный объект.

    В примере ниже мы повторим последовательномть шагов предыдущего шага, создавая трехмерное изображение сферы.

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.




Предыдущий шаг Содержание Следующий шаг