Python 在wx应用程序中嵌入visvis图形
下面的代码尝试在wx应用程序中嵌入visvis figure,以制作具有3D数据的电影。问题是,每次我使用代码时,都会出现错误 “/src/unix/glx11.cpp(86):在SetCurrent()窗口中断言“xid”失败 必须在调用Figure=app.GetFigureClass()后立即显示 self.fig=图(self) 我花了一些时间研究这个错误,但没有一个答案适合我。有人知道怎么修吗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
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()
如果位置>透镜(自身帧名称)-