2012-11-23 88 views
4

我讀能夠嵌入Tkinter的一個pyplot,但我有一個問題:Tkinter的與matplotlib

我需要顯示一些幀,其中在主窗口的Tkinter的框架的pyplot, 它必須對我的按鍵作出反應。

根據http://matplotlib.org/examples/user_interfaces/embedding_in_tk.html 這個工程:

#!/usr/bin/env python 
from Tkinter import * 
import matplotlib 
matplotlib.use('TkAgg')  
from numpy import arange, sin, pi 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
import matplotlib.backend_bases  
from matplotlib.figure import Figure  
import sys 
if sys.version_info[0] < 3: 
    import Tkinter as Tk 
else: 
    import tkinter as Tk 

root = Tk.Tk() 
root.wm_title("Embedding in TK") 


f = Figure(figsize=(5,4), dpi=100) 
a = f.add_subplot(111) 
t = arange(0.0,3.0,0.01) 
s = sin(2*pi*t) 

a.plot(t,s) 

canvas = FigureCanvasTkAgg(f, master=root) 
canvas.show() 
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) 

canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) 

def on_key_event(event): 
    print('you pressed %s'%event.key) 

canvas.mpl_connect('key_press_event', on_key_event) 

def _quit(): 
    root.quit()  # stops mainloop 
    root.destroy() # this is necessary on Windows to prevent 
        # Fatal Python Error: PyEval_RestoreThread: NULL tstate 

button = Tk.Button(master=root, text='Quit', command=_quit) 
button.pack(side=Tk.BOTTOM) 

Tk.mainloop() 

,我很高興......但如果我嘗試,作爲一個例子,有在它上面的文本框:

t=Text(root) 
t.pack() 

(在畫布變量定義之前)只要我點擊文字框架&寫入它,就沒有辦法點擊pyplot窗口,並使它再次捕捉我的按鍵!

任何提示?

+0

沒有一個修復,但一種變通方法,'按Ctrl + Tab'允許我把重點放在Matplot畫布(Linux)的 – FabienAndre

回答

4

在tkinter中,關鍵事件被路由到獲取焦點的小部件,因此您的問題是將焦點設置回畫布。這可以通過綁定點擊畫布來設置焦點。

例如:

canvas.mpl_connect('button_press_event', lambda event:canvas._tkcanvas.focus_set()) 
#or canvas._tkcanvas.bind('<Button1>', ...) 
+0

是的,僅僅是!謝謝... – alessandro