2013-05-21 23 views
0

我有一個包含多個滑塊和圖形的GUI程序。滑塊設置一個函數的參數,該函數應該被繪製在圖上。我開始按照http://matplotlib.org/examples/user_interfaces/embedding_in_tk.html中的指示,從包裝變爲網格,並嘗試了廣告噁心。如果我移動一個滑塊,現在我有更新的情節,但如果我移動另一個滑塊,則不會。我沒有看到兩者之間的區別。Matplotlib有時在tkinter中更新

import matplotlib 
matplotlib.use('TkAgg') 
import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
from matplotlib.figure import Figure 
from Tkinter import * 

domain_min = 1 
domain_max = 10 
order_min = 0 
order_max = 3 
fig = Figure(figsize=(10,5), dpi=50) 

def module(x): 
    global domain, order, output_message, fig, a, x_vals, y_vals 

    domain = float(domain_slide.get()) 
    order = int(order_slide.get()) 

    output_message = 'f(1) = %i\nf(2) = %i\nf(3) = %i\nf(4) = %i\nf(5) = %i\nf(6) = %i\n\ 
f(7) = %i\nf(8) = %i\nf(9) = %i\nf(10)= %i'%(1**order,2**order,3**order,4**order,5**order,\ 
              6**order,7**order,8**order,9**order,10**order) 

    output_message_text.set(output_message) 

    x_vals = np.linspace(0,domain,100) 
    y_vals = x_vals**order 

    a = fig.add_subplot(111) 
    a.clear() 
    a.plot(x_vals,y_vals,color='blue') 

#GUI 
root = Tk() 

domain_slide = DoubleVar() 
order_slide = DoubleVar() 
output_message_text = StringVar() 

ds = Scale(root, variable = domain_slide, from_ = domain_min, to = domain_max, command = module) 
ds.grid(column = 0, row = 0) 

o_s = Scale(root, variable = order_slide, from_ = order_min, to = order_max, command = module) 
o_s.grid(column = 1, row = 0) 

out_message = Message(root, textvariable = output_message_text, width = 300, bg = 'white').grid(column = 0, row = 1, rowspan = 3) 


canvas = FigureCanvasTkAgg(fig, master=root) 
canvas.show() 
canvas.get_tk_widget().grid(column=3,row=1) 
canvas.show() 

label = Label(root) 
label.grid() 

root.mainloop() 

python在兩個滑塊中看到了什麼區別?在該程序的更深入版本中,沒有一個滑塊更新該圖。

+0

當您移動滑塊時,被調用的函數,但繪圖不會更改,或者函數未被調用? –

+0

在您的示例中,兩個滑塊都能正常工作,但只有正確的滑塊纔會更改比例,即如果更改左滑塊,然後右邊出現正確的輸出 – tacaswell

+0

函數被調用,因爲左下角的文本變化。情節不會改變。我想知道的是如何使左側滑塊也直接更新劇情。 – jdj081

回答

0

你需要一個

fig.cavas.draw() 

添加到您的回調函數。

我不太確定爲什麼它是用這個重繪畫布。

+0

工作。謝謝!我不確定爲什麼它爲一些而不是其他人工作。也就是'fig.canvas.draw'。 – jdj081