2012-11-23 45 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