Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在wx应用程序中嵌入visvis图形_Python_Python 2.7_Wxwidgets - Fatal编程技术网

Python 在wx应用程序中嵌入visvis图形

Python 在wx应用程序中嵌入visvis图形,python,python-2.7,wxwidgets,Python,Python 2.7,Wxwidgets,下面的代码尝试在wx应用程序中嵌入visvis figure,以制作具有3D数据的电影。问题是,每次我使用代码时,都会出现错误 “/src/unix/glx11.cpp(86):在SetCurrent()窗口中断言“xid”失败 必须在调用Figure=app.GetFigureClass()后立即显示 self.fig=图(self) 我花了一些时间研究这个错误,但没有一个答案适合我。有人知道怎么修吗 import wx import h5py import numpy as np impor

下面的代码尝试在wx应用程序中嵌入visvis figure,以制作具有3D数据的电影。问题是,每次我使用代码时,都会出现错误

“/src/unix/glx11.cpp(86):在SetCurrent()窗口中断言“xid”失败 必须在调用Figure=app.GetFigureClass()后立即显示 self.fig=图(self)

我花了一些时间研究这个错误,但没有一个答案适合我。有人知道怎么修吗

import wx
import h5py
import numpy as np
import visvis as vv

app = vv.use('wx')

class CPlot3D (wx.Frame) :
    """
    Class for plotting 3D Dirac 
    """

    def data_for_plotting (self, frame_number) :
        """
        Load the data to be plotted for the frame with the frame_number 
        """
        frame = str(self.frame_names[frame_number])
        return self.f[frame][...]

    def draw_curent_frame (self, event=None) :
        """
        Display the current frame
        """
        # Load data
        data = self.data_for_plotting (self.frame_number.GetValue())    

        try :
            self.volume_plot.SetData (data)
        except AttributeError :
            vv.clf()
            self.volume_plot = vv.volshow (data, clim=(self.global_min, self.global_max), renderStyle='mip', cm=vv.CM_JET)
            a = vv.gca()
            vv.ColormapEditor(a)

            def GetTicks (axis_num, min_val, max_val, label_format="%.2f") :
                size = data.shape[axis_num]
                # Number of ticks
                nticks = int(np.ceil(np.log2(size)))
                nticks += 1 - nticks % 2 # Make <nticks> odd
                ticks_position = np.linspace(0, size-1, nticks)
                ticks_label = map( lambda x : label_format % x, np.linspace(min_val, max_val, nticks) ) 
                return dict( zip(ticks_position, ticks_label)  )

            a.axis.xTicks = GetTicks(0, self.x_min, self.x_max) 
            a.axis.xLabel = "x (rel. units)"

            a.axis.yTicks = GetTicks(1, self.y_min, self.y_max) 
            a.axis.yLabel = "y (rel. units)"

            a.axis.zTicks = GetTicks(2, self.z_min, self.z_max) 
            a.axis.zLabel = "z (rel. units)"

            self.fig.Draw()


    def __init__ (self, parent, file_name, title="Plot Dirac 3D") :
        # Open files
        self.f = h5py.File (file_name, 'r')

        # Extract the dimension
        self.x_gridDIM = int(self.f['x_gridDIM'][...])
        self.y_gridDIM = int(self.f['y_gridDIM'][...])
        self.z_gridDIM = int(self.f['z_gridDIM'][...])

        self.dx = self.f['dx'][...]

        self.x_min = self.f['x_min'][...]
        self.x_max = self.x_min + self.x_gridDIM * self.dx

        self.y_min = self.f['y_min'][...]
        self.y_max = self.y_min + self.y_gridDIM * self.dx

        self.z_min = self.f['z_min'][...]
        self.z_max = self.z_min + self.z_gridDIM * self.dx


        # Collect the frame names
        self.frame_names = []

        for key in self.f.keys () :
            try : self.frame_names.append (int(key)) 
            except ValueError: pass

        self.frame_names.sort ()

        print "\nGet global maximum and minimum..."

        # Find the min and max values in all the frames
        for frame_number in range(len(self.frame_names)) :
            data = self.data_for_plotting (frame_number)
            try :           
                self.global_min = min( self.global_min, data.min() )
                self.global_max = max( self.global_max, data.max() )
            except AttributeError :
                self.global_min = data.min()
                self.global_max = data.max()  

        print "\nStart animation..."

        # Create GUI
        dw, dh = wx.DisplaySize()
        wx.Frame.__init__ (self, parent, title=title, size=(0.4*dw, 0.6*dh) )

        self.ConstructGUI ()
        self.Center()
        self.Show ()
        wx.EVT_CLOSE(self, self.on_close)
        self.On_animation_button ()

    def on_close (self, event) :
        try : self.animation_timer.Stop() 
        except AttributeError : pass
        self.Destroy()

    def ConstructGUI (self) :
        """
        Make a GUI
        """
        ######################### Navigation bar ##############################
        panel = wx.Panel(self)  
        boxsizer = wx.BoxSizer (wx.HORIZONTAL)

        # Frame number indicator    
        boxsizer.Add (wx.StaticText(panel, label="Frame Number:"))
        self.frame_number = wx.SpinCtrl (panel, value="0", min=0, max=len(self.frame_names)-1)
        self.frame_number.Bind (wx.EVT_SPINCTRL, self.draw_curent_frame )
        boxsizer.Add (self.frame_number)

        # Go to the beginning button
        self.go_beginnign_button = wx.Button (panel, label="<<")
        self.Bind (wx.EVT_BUTTON, self.go_to_beginning, self.go_beginnign_button)
        boxsizer.Add (self.go_beginnign_button) 

        # Animation button
        self.animation_button_start_label = "Play  animation  "
        self.animation_button_stop_label =  "STOP animation"
        self.animation_button = wx.Button (panel, label=self.animation_button_start_label) 
        self.Bind (wx.EVT_BUTTON, self.On_animation_button, self.animation_button)
        boxsizer.Add (self.animation_button)

        # Go to the end button
        self.go_end_button = wx.Button (panel, label=">>")
        self.Bind (wx.EVT_BUTTON, self.go_to_end, self.go_end_button)
        boxsizer.Add (self.go_end_button) 

        panel.SetSizer (boxsizer)   
        ############################# Setting up visvis binding #######################################
        Figure = app.GetFigureClass()
        self.fig = Figure(self)
        ################################### Layout #####################################################    
        sizer = wx.BoxSizer (wx.VERTICAL)
        sizer.Add (panel, flag=wx.CENTER)
        sizer.Add(self.fig._widget, 1, flag=wx.EXPAND)

        self.SetSizer(sizer)
        self.SetAutoLayout(True)
        self.Layout() 


    def On_animation_button (self, event=None) :
        """
        <self.animation_button> was clicked
        """
        if self.animation_button.GetLabel() == self.animation_button_start_label :
            # Begin playing animation

            # Set up timer for animation
            timer_id = wx.NewId ()
            self.animation_timer = wx.Timer (self, timer_id) 
            self.animation_timer.Start (200)

            def on_animation_timer (event) :
                self.draw_curent_frame() 
                position = self.frame_number.GetValue()
                if position > len(self.frame_names)-2 : self.On_animation_button ()         
                else : self.frame_number.SetValue (position+1)

            wx.EVT_TIMER (self, timer_id, on_animation_timer)  
            # Channing the button's label
            self.animation_button.SetLabel(self.animation_button_stop_label)
        else : # Stop playing animation
            self.animation_timer.Stop ()
            del self.animation_timer
            # Channing the button's label
            self.animation_button.SetLabel(self.animation_button_start_label)

    def go_to_beginning (self, event) :
        """
        <self.go_beginnign_button> was clicked
        """
        self.frame_number.SetValue (0)  
        self.draw_curent_frame()

    def go_to_end (self, event) :
        """
        <self.go_end_button> was clicked
        """
        self.frame_number.SetValue (len(self.frame_names)-1)
        self.draw_curent_frame()

if __name__ == '__main__' :

    import sys
    app.Create()

    # Loading files
    if len(sys.argv) <> 2 :
        openFileDialog = wx.FileDialog(None, "Open HDF5 file to load 3D Dirac", "", "",
                                       "HDF5 files (*.hdf5)|*.hdf5", wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_CHANGE_DIR)
        # Check whether user canceled
        if openFileDialog.ShowModal() == wx.ID_CANCEL:
            print "Error:  file name is  needed as argument"
            exit()
        else : filename = openFileDialog.GetPath()  

    else : filename = sys.argv[1]

    CPlot3D (None, filename)
    app.Run ()
导入wx
进口h5py
将numpy作为np导入
进口visvis作为vv
app=vv.use('wx')
CPlot3D类(wx.Frame):
"""
用于绘制三维狄拉克的类
"""
用于打印的def数据(自身、帧编号):
"""
加载要为具有帧编号的帧打印的数据
"""
frame=str(self.frame\u名称[帧编号])
返回self.f[帧][…]
def绘图当前帧(自身,事件=无):
"""
显示当前帧
"""
#加载数据
data=self.data\u用于绘图(self.frame\u number.GetValue())
尝试:
self.volume\u plot.SetData(数据)
除属性错误外:
vv.clf()
self.volume\u plot=vv.volshow(数据,clim=(self.global\u min,self.global\u max),renderStyle='mip',cm=vv.cm\u JET)
a=vv.gca()
彩色地图编辑器(a)
def GetTicks(轴数、最小值、最大值、标签格式=“.2f”):
大小=数据。形状[轴数]
#滴答声数
nticks=int(np.ceil(np.log2(大小)))
nticks+=1-nticks%2#使其成为奇数
刻度线位置=np.linspace(0,大小1,nticks)
ticks_label=map(lambda x:label_格式%x,np.linspace(最小值,最大值,nticks))
返回dict(拉链(滴答声位置、滴答声标签))
a、 axis.xTicks=GetTicks(0,self.x_最小值,self.x_最大值)
a、 axis.xLabel=“x(相对单位)”
a、 axis.yTicks=GetTicks(1,self.y\u最小值,self.y\u最大值)
a、 axis.yLabel=“y(相对单位)”
a、 axis.zTicks=GetTicks(2,self.z_最小值,self.z_最大值)
a、 axis.zLabel=“z(相对单位)”
self.fig.Draw()
def _uinit _uuu(self,parent,file_name,title=“Plot Dirac 3D”):
#打开文件
self.f=h5py.File(文件名'r')
#提取维度
self.x_gridDIM=int(self.f['x_gridDIM'][…])
self.y_gridDIM=int(self.f['y_gridDIM'][…])
self.z_gridDIM=int(self.f['z_gridDIM'][…])
self.dx=self.f['dx'][…]
self.x_min=self.f['x_min'][…]
self.x_max=self.x_min+self.x_gridDIM*self.dx
self.y_min=self.f['y_min'][…]
self.y_max=self.y_min+self.y_gridDIM*self.dx
self.z_min=self.f['z_min'][…]
self.z_max=self.z_min+self.z_gridDIM*self.dx
#收集帧名称
self.frame_name=[]
对于self.f.keys()中的键:
try:self.frame_names.append(int(key))
除了ValueError:通过
self.frame\u names.sort()
打印“\n设置全局最大值和最小值…”
#查找所有帧中的最小值和最大值
对于范围内的帧号(len(self.frame_名称)):
数据=用于绘图的self.data(帧编号)
尝试:
self.global\u min=min(self.global\u min,data.min())
self.global\u max=max(self.global\u max,data.max())
除属性错误外:
self.global_min=data.min()
self.global_max=data.max()
打印“\n开始动画…”
#创建GUI
dw,dh=wx.DisplaySize()
wx.Frame.\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.gui()
self.Center()
self.Show()
wx.EVT_关闭(自,自开_关闭)
self.On_动画_按钮()
def on_关闭(自身、事件):
try:self.animation\u timer.Stop()
除属性错误:通过
自我毁灭
def ConstructGUI(自我):
"""
制作图形用户界面
"""
#########################导航栏##############################
面板=wx.面板(自)
boxsizer=wx.boxsizer(wx.水平)
#帧号指示器
添加(wx.StaticText(panel,label=“Frame Number:”)
self.frame\u number=wx.SpinCtrl(面板,value=“0”,min=0,max=len(self.frame\u名称)-1)
self.frame\u number.Bind(wx.EVT\u SPINCTRL、self.draw\u current\u frame)
boxsizer.Add(自身框架编号)
#转到开始按钮
self.go\u beginign\u button=wx.button(面板,标签=”)
self.Bind(wx.EVT_按钮、self.go_至_端、self.go_端按钮)
boxsizer.Add(self.go\u end\u按钮)
panel.SetSizer(boxsizer)
#############################设置visvis绑定#######################################
Figure=app.GetFigureClass()
self.fig=图(self)
###################################3月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日##############
sizer=wx.BoxSizer(wx.VERTICAL)
sizer.Add(面板,标志=wx.CENTER)
sizer.Add(self.fig.\u小部件,1,flag=wx.EXPAND)
自整定器(施胶器)
self.SetAutoLayout(真)
self.Layout()
动画按钮上的def(自身,事件=无):
"""
点击
"""
如果self.animation\u按钮.GetLabel()==self.animation\u按钮\u开始\u标签:
#开始播放动画
#设置动画计时器
计时器\u id=wx.NewId()
self.animation\u timer=wx.timer(self,timer\u id)
self.animation\u timer.Start(200)
动画计时器上的def(事件):
self.draw\u current\u frame()
position=self.frame\u number.GetValue()
如果位置>透镜(自身帧名称)-