【问题标题】:Tkinter canvas containg a mayavi.mlab plotTkinter 画布包含一个 mayavi.mlab 图
【发布时间】:2015-12-08 06:05:42
【问题描述】:

我一直致力于可视化使用 mayavi.mlab 生成的 3D 图,然后使用 Tkinter 生成 GUI 窗口来改变我的 3D 图的一些参数(准确地说是 2 个)。我的问题是我无法从 Tkinter 连接画布来托管我的 mayavi 绘图。更详细: 我为我的 3D 计算创建了一个类,并为 GUI 创建了一个类。

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 实例没有属性“画布”。 如果需要,我可以编辑帖子并输入我的完整代码。

【问题讨论】:

    标签: python tkinter mayavi tkinter-canvas mayavi.mlab


    【解决方案1】:

    出于根本原因,我不认为这是可能的。一个程序只能有一个 GUI 后端运行事件循环,而 IIUC,Mayavi 的当前版本只支持 Qt(很好)和 Wx(有点)后端,不支持 Tkinter。我建议使用带有 Qt 后端的 TraitsUI 来改变你的参数,而不是 TKinter。例如。见http://docs.enthought.com/mayavi/mayavi/auto/example_mayavi_traits_ui.html

    【讨论】:

    • 我发现的唯一方法是,如果 PLOT 按钮的命令创建一个 mayavi 场景,并且当您更改滑块的值时,会创建一个新的 mayavi 场景。我尝试使用 TraitsUI 创建 GUI,但我对如何在 GUI 类中调用 mlab 方法的知识有限,使其无法正常工作。该代码的链接:stackoverflow.com/questions/34125317/…
    猜你喜欢
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多