2015-12-08 3 views
1

Я работаю над визуализацией 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-экземпляр не имеет атрибута «холст». Я мог бы отредактировать сообщение и поместить свой полный код, если это необходимо.

ответ

0

Я не думаю что это возможно, по основным причинам. Программа может иметь только один GUI-сервер, управляющий циклом событий, а IIUC, текущие версии Mayavi поддерживают только Qt (хорошо) и Wx (несколько), а не Tkinter. Я бы предложил использовать TraitsUI с бэкэндом Qt для изменения ваших параметров, а не TKinter. Например. см. http://docs.enthought.com/mayavi/mayavi/auto/example_mayavi_traits_ui.html

+0

Единственный способ, которым я нашел, - это если команда кнопки PLOT создает сцену Mayavi, а при изменении значений ползунков создается новая сцена Mayavi. Я попытался создать графический интерфейс с TraitsUI, но мои ограниченные знания о том, как вызвать методы mlab в классе GUI, сделали невозможным его работу. Ссылка на этот код: http://stackoverflow.com/questions/34125317/using-traitsui-in-mayavi-to-create-a-gui-magnetic-field-simulation – nikjohn