1

私は、matplotlibnumpygtkを使用して情報をプロットするPythonでアプリケーションを開発しています。matplotlibを使用してnumpyデータをプロットしています。ユーザーはウィジェットのいくつかのパラメーターを変更して、プロットを変更できます。

設計上の理由から、プロット(およびデータ)をコントロールGUIから分離したいので、データを1つのウィンドウにプロットし、コントロールを分離したウィンドウに配置します。gtkで、見た目が複数のウィンドウを介してデータを送信できるWindowGroupウィジェットを見つけましたが、その方法がわかりません。

次のコードは、問題の単純化を示しています。ウィンドウに正弦をプロットすると、ユーザーは垂直調整バー(イベント)を使用してウィンドウの変数fmを変更できます。スクリプトを実行すると、イベント(垂直調整バーを移動)が関数をトリガーしますが、プロットは実現されないことがわかります。

プロットをどのように変更できますか?または、 WindowGroupウィジェットを使用して2つのウィンドウ間でメッセージを送信しますか?

#!/usr/bin/python

import gtk
import numpy
import matplotlib.pyplot as plt

from matplotlib.backends.backend_gtkagg \
    import FigureCanvasGTKAgg as FigureCanvas

def update_hscale(event):
    global t    
    fm = hscale.get_value()
    y_new = numpy.sin(2*fm*t)
    l.set_ydata(y_new)
    plt.draw()
    print "doing fm=", fm


# define the window group
window_group=gtk.WindowGroup()

# matplotlib plot in window 1
fm = 5.0
t = numpy.arange(200)
y = numpy.sin(2*fm*t)
fig = plt.figure(1)  
ax = fig.add_subplot(111)
l, = ax.plot(t, y)

win1 = gtk.Window()
win1.connect("destroy", gtk.main_quit)
win1.set_default_size(800,300)
vbox1 = gtk.VBox()
canvas = FigureCanvas(fig)
vbox1.pack_start(canvas, fill=True)
win1.add(vbox1)

# controls in window 2
win2 = gtk.Window()   
vbox2 = gtk.VBox()    
adj = gtk.Adjustment(0.0, -5, 5, 1.0, 1.0, 1.0)
hscale = gtk.HScale(adj)
hscale.set_size_request(200, 30)
vbox2.pack_start(hscale)
hscale.connect("value-changed", update_hscale)
win2.add(vbox2)

# adding windows to window_group
window_group.add_window(win1)   
window_group.add_window(win2)   

win1.set_default_size(400,300)
win1.show_all()
win2.show_all()
gtk.main()
4

1 に答える 1

0

私は解決策を見つけました、最初に私はすべてのものを削除しましたgtk.WindowGroup

  • window_group=gtk.WindowGroup()
  • window_group.add_window(win1)
  • window_group.add_window(win2))。

そして、私はプロットではなくcanvas関数で再描画します:update_hscalel

def update_hscale(event):
    global t    
    fm = hscale.get_value()
    y_new = numpy.sin(2*fm*t)
    l.set_ydata(y_new)
    canvas.draw()
    print "doing fm=", fm
于 2012-10-09T20:17:51.397 に答える