我无法理解如何刷新FigureCanvasWxAgg实例.这是一个例子:
import wx
import matplotlib
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.figure import Figure
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.NewId(), "Main")
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.figure = Figure(figsize=(1,2))
self.axe = self.figure.add_subplot(111)
self.figurecanvas = FigureCanvas(self, -1, self.figure)
self.buttonPlot = wx.Button(self, wx.NewId(), "Plot")
self.buttonClear = wx.Button(self, wx.NewId(), "Clear")
self.sizer.Add(self.figurecanvas, proportion=1, border=5, flag=wx.ALL | wx.EXPAND)
self.sizer.Add(self.buttonPlot, proportion=0, border=2, flag=wx.ALL)
self.sizer.Add(self.buttonClear, proportion=0, border=2, flag=wx.ALL)
self.SetSizer(self.sizer)
self.figurecanvas.Bind(wx.EVT_LEFT_DCLICK, self.on_dclick)
self.buttonPlot.Bind(wx.EVT_BUTTON, self.on_button_plot)
self.buttonClear.Bind(wx.EVT_BUTTON, self.on_button_clear)
self.subframe_opened = False
def on_dclick(self, evt):
self.subframe = SubFrame(self, self.figure)
self.subframe.Show(True)
self.subframe_opened …Run Code Online (Sandbox Code Playgroud) 当我单击主框架的关闭按钮时,应用程序应该关闭.但是我实现它的方式,Segmentation fault当我点击按钮时,它会退出.
我担心安全关闭程序,因为我需要稍后将内容保存到磁盘.
通过关闭按钮终止WxPython应用程序的正确非暴力方法是什么?
这是我实现的程序的"主要"循环:
if __name__ == "__main__":
app = wx.App(False)
mf = MainFrame(None, title='Spectrum Checker') #subclasses frame
mf.register_close_callback( app.Destroy) #what is the apt func?
app.MainLoop()
Run Code Online (Sandbox Code Playgroud)
以下是如何在以下内容中实现回调MainFrame:
def __init__(self, parent, title):
...
self.Bind(wx.EVT_CLOSE, self._when_closed)
...
def _when_closed(self, event):
if self.__close_callback__:
self.__close_callback__()
Run Code Online (Sandbox Code Playgroud) 我想用Python和wxPython显示一条带有一条或两条曲线的实时图表,每秒最多50个样本.该小部件应该支持Win32和Linux平台.
任何提示都是受欢迎的.
编辑添加:
我不需要以50 fps更新显示,但需要在两条曲线上显示多达50个数据样本,并且显示器的更新速率合理(5..10 fps应该没问题).
编辑添加:
我在一个项目中使用了mathplotlib取得了很好的成功.然后我为其他项目选择了wx.lib.plot,我发现它更简单,但更容易使用并且消耗更少的CPU周期.由于wx.lib是标准wxPython发行版的一部分,因此特别容易使用.
我正在开发一个包含许多窗格的应用程序.看截图:

wx.ScrolledPanel包含许多wx.Panels.wx.grid.Grid.wx.Panel包含一个wx.grid.Grid.wx.Panel包含一个enthought chaco情节.wx.Panel.我想实现焦点跟随鼠标,这样当我将鼠标移动到绘图上时,我可以使用我的滚轮立即放大或缩小,而无需先点击绘图给它焦点.
类似地,当我将鼠标移到左侧设置,顶部事件或底部数据窗格时,我希望能够使用滚轮立即滚动窗口,而无需先单击窗口.
目前我定义了一个函数:
def focusFollowsMouse(window):
window.Bind(wx.EVT_ENTER_WINDOW, lambda event: window.SetFocus())
Run Code Online (Sandbox Code Playgroud)
我想仅在四个顶级窗格上应用此功能:绘图,设置,事件和数据.
但是,我需要为每个顶级窗格中的每个子面板或控件调用此函数以使其工作.例如,我需要将此功能单独应用于测量设置,分析参数,视图设置等面板.
很可能EVT_ENTER_WINDOW事件不会传播到父窗口.
有没有办法在不应用于focusFollowsMouse每个子面板或控件的情况下使其工作?
谢谢
在我作为博士生的日常工作中,我做地质建模.在业余时间(主要是为了好玩),我正在学习Python并尝试编写一个简单的程序来查看3D地理细胞模型.
地质模型http://img710.imageshack.us/img710/6503/sgems.png geo model2 http://img638.imageshack.us/img638/529/1sblockmodel.jpg
地理细胞模型只是一个3D网格,其中每个网格单元都有一些值(如右图所示).所以,我希望我的观察者能够像右侧的图片一样显示3D网格模型.同样,我希望它能够在x,y和z方向上显示模型的横截面(如左图所示).
我还希望模型能够围绕所有三个轴旋转并放大和缩小.
我做了一些初步调查(主要是在这里),似乎VisVis和VTK是两个潜在的选择.我试图使用wxPython作为主GUI,看起来这两个选项将与wxPython一起使用,据我所知.
问题:
当我说我认为VisVis和VTK可以满足我的需求时,我是对的吗?一个比另一个好吗?
这两个选项中哪一个最容易实现?
还有其他选择我还应该考虑吗?
请记住,我是Python的新手,也是wxPython的新手.
一次完成这一切是否更好?我对wxPython很新,我认为以我熟悉的方式编写程序会更好,然后在我对应用程序的整体设计感到满意后应用wxPython gui.有什么建议?
正如我在上一个问题中所提到的,我试图在功能上做一些类似向导的东西.我已经选择了添加了sizer的单帧.我为每个希望用户看到的屏幕构建面板,将它们添加到框架的sizer中,然后.Hide()通过一个面板在面板之间切换,然后.ShowYourself()在下一个面板上调用自定义面板.显然,我希望按钮与用户在整个过程中保持同一位置.
我通过"后退"和"下一步"按钮将两个面板链接在一个无限循环中,这样你就可以看到发生了什么.第一个小组看起来很棒; tom10的代码在那个级别上工作,因为它避开了我最初的,过度花哨的尝试,边界各处飞行.然后第二个小组似乎缩小到最低限度.当我们返回第一个面板时,这里也发生了收缩.为什么它在第一个面板上看起来很好,但是在我返回后没有?.Fit()如果我不想要10像素乘10像素的灰色,为什么需要调用?如果有必要,为什么会.Fit()给出不一致的结果?
这个无限循环似乎是我对此经历的一个特征:我在面板上修复了布局,但却发现切换会破坏其他面板的布局.我解决了这个问题,通过使用sizer_h.Add(self.panel1, 0)而不是sizer_h.Add(self.panel1, 1, wx.EXPAND),现在我的布局再次关闭.
到目前为止,我的"解决方案"是为mastersizer.SetMinSize((475, 592))每个面板的主sizer 添加一个(在下面的代码中注释掉).这是一个肮脏的解决方案,因为1)我必须找到通过试验和错误工作的数字(宽度为-5像素,高度为-28像素).2)我不明白为什么潜在的问题仍然存在.
什么是正确的,非丑陋的解决方案?如果切换面板不是将所有面板同时添加到框架的大小调整器中,而是应该.Detach()从框架的大小调整器中将面板包含在内,然后.Add()将下一个面板连接到框架的大小调整器上?是否有一种.JustMakeThisFillThePanel()隐藏在wxWidgets和wxPython文档在线的错过的方法?
我显然在布局的心理模型中遗漏了一些东西.粘贴在下面的极简主义代码.

import wx
import sys
class My_App(wx.App):
def OnInit(self):
self.frame = My_Frame(None)
self.frame.Show()
self.SetTopWindow(self.frame)
return True
def OnExit(self):
print 'Dying ...'
class My_Frame(wx.Frame):
def __init__(self, image, parent=None,id=-1, title='Generic Title', pos=wx.DefaultPosition, style=wx.CAPTION | wx.STAY_ON_TOP):
size = (480, 620)
wx.Frame.__init__(self, parent, id, 'Program Title', pos, size, …Run Code Online (Sandbox Code Playgroud) 我在Python中找出错误消息时遇到了麻烦.
昨天,我使用最新的EPD软件包安装了python,并使用适用于Mac OS的wxPython2.9-osx-cocoa-py2.7软件包安装了wxPython2.9.然后我把wx添加到我的PYTHONPATH中.
export WXDIR=/usr/local/lib/wxPython-2.9.1.1/lib/python2.7/site-packages/wx-2.9.1-osx_cocoa
export PYTHONPATH=$WXDIR
export PYTHONPATH=$PYTHONPATH:$WXDIR/tools
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行东西时,我收到此错误:
In [14]: import matplotlib.pyplot
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
/Users/imrisofer/Documents/third/hddm-read-only/hddm/<ipython console> in <module>()
/Library/Frameworks/EPD64.framework/Versions/7.0/lib/python2.7/site-packages/matplotlib/pyplot.py in <module>()
93
94 from matplotlib.backends import pylab_setup
---> 95 new_figure_manager, draw_if_interactive, show = pylab_setup()
96
97 @docstring.copy_dedent(Artist.findobj)
/Library/Frameworks/EPD64.framework/Versions/7.0/lib/python2.7/site-packages/matplotlib/backends/__init__.py in pylab_setup()
23 backend_name = 'matplotlib.backends.%s'%backend_name.lower()
24 backend_mod = __import__(backend_name,
---> 25 globals(),locals(),[backend_name])
26
27 # Things we pull in from all backends
/Library/Frameworks/EPD64.framework/Versions/7.0/lib/python2.7/site-packages/matplotlib/backends/backend_wxagg.py in <module>()
21
22 from backend_agg import FigureCanvasAgg
---> 23 import …Run Code Online (Sandbox Code Playgroud) 我希望可视化数据,希望能使它具有互动性.现在我正在使用NetworkX和Matplotlib,当我试图"绘制"图形时,它最大化了我的8gb.我不知道有哪些选项和技术可用于处理如此大的数据集**.如果有人能指出我正确的方向,那就太好了.我也有一个支持CUDA的GFX卡,如果它可以使用.
现在,我正在考虑仅绘制连接最多的节点,比如说顶部5%的顶点边缘最多,然后在用户缩放或点击时填充连接较少的节点.
我的三个栏目wx.ListCtrl(size=(-1,200)).我希望列在其创建后填充ListCtrl的宽度.理想情况下,第一列可以扩展以填充可用的额外空间.第二列和第三列不需要扩展,并且优选地不会改变宽度(格式化ocd).
目前,每个ListCtrl列都是使用设置的(width=-1).
我有一种感觉,我可以使用这段代码对我有利...
# Expand first column to fit longest entry item
list_ctrl.SetColumnWidth(0, wx.LIST_AUTOSIZE)
Run Code Online (Sandbox Code Playgroud)
伪代码(也许):
# After wx.ListCtrl creation
Get width of ListCtrl control
Get width of each ListCtrl column
Calculate unused width of ListCtrl
Set first column width to original width + unused width
Run Code Online (Sandbox Code Playgroud)
鉴于以下示例,我不明白如何启动autowidthmixin.目前,我正在尝试将listctrl放在foldpanel中.foldpanel是一个类,类中的函数创建listctrl.鉴于我目前的代码结构,我甚至不相信这可以做到!
class MyPanel(wx.Panel):
def __init__(self, parent, dictionary):
self.dictionary = dictionary
"""Constructor"""
wx.Panel.__init__(self, parent)
# Layout helpers (sizers) and content creation (setPanel)
self.mainSizer = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(self.mainSizer)
list_ctrl = self.setPanel()
self.mainSizer.Add(list_ctrl, 0, …Run Code Online (Sandbox Code Playgroud) wxpython ×10
python ×9
wxwidgets ×3
3d ×1
graph ×1
graphics ×1
importerror ×1
matplotlib ×1
sizer ×1
vtk ×1