2013-03-19 99 views
0

我真的想要爱上Python并且离开Matlab。是否有可能在Python中制作Matlab风格的图形用户界面?比较起来有多容易? (我以编程方式制作matlab GUI,不敢使用GUIDE)我可以在这些GUI中放入matplotlib图形吗? tk或wx(或其他)更好吗?python可以使Matlab风格的图形用户界面

+3

你能提供一个你正在谈论的GUI的例子吗? – NightHallow 2013-03-19 18:01:20

+1

挖掘matplotlib ...它会生成图形,你可以将它们显示在任何地方。 – tdelaney 2013-03-19 18:07:16

+0

没有任何截图方便,但相当简单的GUI与选项卡,表格和一些图表。 – user1507844 2013-03-19 18:14:01

回答

1

wxPython有选项卡,网格或ListCtrls(即表),并支持matplotlib和PyPlot的图形。你可以阅读以下链接使用matplotlib:

要查看所有附带的wxPython的小工具,去到www .wxpython.org并点击左边的下载链接。你会发现他们有一个独立的Docs & Demo包,可以向你展示几乎所有的小部件及其工作原理。

1

以前没有用过Matlab,不确定它是否是GUI。但是如果你倾向于交互式地使用Python,你可能想试试iPython。使用Qt的Ipython可以为您提供一个优雅的GUI。

+0

提问者想知道创建GUI的能力,而不是在GUI中使用python – 2013-03-19 19:19:07

1

对于您可能要检查出的GUI中性小部件matplotlib提供简单的接口,这里的文档 - http://matplotlib.org/api/widgets_api.html

下面是使用这些GUI中性部件绘制与被控制的可变参数的函数的一个简单的例子由三个滑块的小部件:

import functools 
import numpy as np 
import pylab 
import matplotlib.pyplot as plt 
from matplotlib.widgets import Slider, Button, RadioButtons, MultiCursor 


def hillfxn(x, B, K, n): 
    xn = float(x**n) 
    return (B * xn)/(K**n + xn) 


def draw_function(x, y, xlabel="Activator concentration (X)", 
        ylabel="Promoter activity"): 
    fig, ax = plt.subplots(1, 1, sharex=True) 
    plt.subplots_adjust(left=0.15, bottom=0.25) 
    lines = ax.plot(x, y) 
    ax.set_xlabel(xlabel) 
    ax.set_ylabel(ylabel) 
    ax.set_ylim(0,max(y)*1.1) 
    return fig, ax, lines 

def draw_interactive_controls(n, B, K): 
    axcolor = 'lightgoldenrodyellow' 
    axK = plt.axes([0.1, 0.01, 0.75, 0.03], axisbg=axcolor) 
    axB = plt.axes([0.1, 0.06, 0.75, 0.03], axisbg=axcolor) 
    axN = plt.axes([0.1, 0.11, 0.75, 0.03], axisbg=axcolor) 
    Nslider = Slider(axN, "$n$", 1, 10, valinit=n, valfmt='%1.3f') 
    Bslider = Slider(axB, "$\\beta$", 0, 20, valinit=B, valfmt='%1.3f') 
    Kslider = Slider(axK, "$K$", 0.01, 20, valinit=K, valfmt='%1.3f')  
    return Nslider, Bslider, Kslider 

def update_plot(val, x=None, lines=None, ax=None, 
       Nslider=None, Bslider=None, Kslider=None): 
    n = Nslider.val 
    B = Bslider.val 
    K = Kslider.val 
    y = [hillfxn(i, B, K, n) for i in x] 
    lines[0].set_ydata(y) 
    ax.set_ylim(0,max(y)*1.1) 
    pylab.draw() 


if __name__ == "__main__": 
    # initial values 
    B, K, n = 5, 5, 1 
    x= np.linspace(0,30,250) 
    y = [hillfxn(i, B, K, n) for i in x] 

    # setup initial graph and control settings 
    fig, ax, lines = draw_function(x,y) 
    Nslider, Bslider, Kslider = draw_interactive_controls(n, B, K) 

    # specify updating function for interactive controls 
    updatefxn = functools.partial(update_plot, x=x, lines=lines, ax=ax, 
        Nslider=Nslider, Bslider=Bslider, Kslider=Kslider) 

    Nslider.on_changed(updatefxn) 
    Bslider.on_changed(updatefxn) 
    Kslider.on_changed(updatefxn) 
    pylab.show() 

这将产生如下所示的接口:

matplotlib GUI neutral widgets