Tkinter canvas 包含一个 mayavi.mlab 图
Tkinter canvas containg a mayavi.mlab plot
我一直致力于可视化使用 mayavi.mlab 生成的 3D 图,然后使用 Tkinter 生成 GUI window 来改变我的 3D 图的一些参数(准确地说是 2 个)。我的问题是我无法从 Tkinter 连接 canvas 来托管我的 mayavi 图。更详细:
我为我的 3D 计算创建了一个 class,为 GUI 创建了一个 class。
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 class 继续为 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 class 独立运行良好。我得到的错误是:GUI 实例没有属性 'canvas'。
如果需要,我可以编辑 post 并放置我的完整代码。
出于根本原因,我认为这不可能。一个程序只能有一个 GUI 后端 运行 事件循环,而 IIUC,当前版本的 Mayavi 仅支持 Qt(很好)和 Wx(有点)后端,不支持 Tkinter。我建议使用带有 Qt 后端的 TraitsUI 来改变参数而不是 TKinter。例如。见 http://docs.enthought.com/mayavi/mayavi/auto/example_mayavi_traits_ui.html
我一直致力于可视化使用 mayavi.mlab 生成的 3D 图,然后使用 Tkinter 生成 GUI window 来改变我的 3D 图的一些参数(准确地说是 2 个)。我的问题是我无法从 Tkinter 连接 canvas 来托管我的 mayavi 图。更详细: 我为我的 3D 计算创建了一个 class,为 GUI 创建了一个 class。
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 class 继续为 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 class 独立运行良好。我得到的错误是:GUI 实例没有属性 'canvas'。 如果需要,我可以编辑 post 并放置我的完整代码。
出于根本原因,我认为这不可能。一个程序只能有一个 GUI 后端 运行 事件循环,而 IIUC,当前版本的 Mayavi 仅支持 Qt(很好)和 Wx(有点)后端,不支持 Tkinter。我建议使用带有 Qt 后端的 TraitsUI 来改变参数而不是 TKinter。例如。见 http://docs.enthought.com/mayavi/mayavi/auto/example_mayavi_traits_ui.html