Я работаю над визуализацией 3D-графика, сгенерированного с помощью mayavi.mlab, а затем создавая окно GUI с помощью Tkinter для изменения некоторых параметров (точнее, 2) моего 3D-графика. Моя проблема в том, что я не могу подключить холст от Tkinter, чтобы разместить мой майяви. Более конкретно: Я создал класс для своих 3D-вычислений и класс для графического интерфейса.Tkinter холст containg mayavi.mlab plot
import numpy as np
from mayavi import mlab
from Tkinter import *
import tkMessageBox as msg
class 3Dplot_calc:
x,y,z = np.mgrid[-10:10:150j,-10:10:150j,-10:10:150j]
def __init__(self, R, I):
self.R = R
self.I = I
Существует ряд методов между ними, чтобы помочь рассчитать полезную часть
class GUI:
def __init__(self,master):
frame = Frame(master)
frame.pack()
self.Set_Figure(frame)
self.Inputs(frame)
def Set_Figure(self,frame):
self.fig = mlab.figure(1, size=(500,500))
### i need to attach it to the canvas somehow and make it upgrade
Вот где я застрял !!! GUI класс определяет определяющие ползунки для R и I, некоторые другие кнопки, кнопку сюжета и определение их места в кадре. Соответствующие детали:
def Inputs(self,frame):
input_frame = Frame(frame)
input_frame.grid(column=0, row=0)
#Add Sliders
self.slR = Scale(input_frame, from_=1.0, to=5.0, orient=HORIZONTAL)
self.slR.set(1.0)
self.slI = Scale(input_frame, from_=-5.0, to=5.0, orient=HORIZONTAL)
self.slI.set(1.0)
#Add Plot Button
self.plot_button = Button(input_frame, text='PLOT', command = self.Generate_Values)
def Generate_Values(self):
R = int(self.slR.get())
I = float(self.slI.get())
a = 3Dplot_calc(R,I)
Bx,By,Bz = a.Bx, a.By, a.Bz #Those are the useful methods
field = mlab.pipeline.vector_field(Bx, By, Bz)
magnitude = mlab.pipeline.extract_vector_norm(field)
contours = mlab.pipeline.iso_surface(magnitude,contours=3)
field_lines = mlab.pipeline.streamline(magnitude, seedtype='line',
integration_direction='both')
self.canvas.show()
root = Tk()
gui = GUI(root)
root.mainloop()
Класс 3Dplot отлично работает сам по себе. Ошибка, которую я получаю: GUI-экземпляр не имеет атрибута «холст». Я мог бы отредактировать сообщение и поместить свой полный код, если это необходимо.
Единственный способ, которым я нашел, - это если команда кнопки PLOT создает сцену Mayavi, а при изменении значений ползунков создается новая сцена Mayavi. Я попытался создать графический интерфейс с TraitsUI, но мои ограниченные знания о том, как вызвать методы mlab в классе GUI, сделали невозможным его работу. Ссылка на этот код: http://stackoverflow.com/questions/34125317/using-traitsui-in-mayavi-to-create-a-gui-magnetic-field-simulation – nikjohn