如何在与matplotlib'key_press_event'一起使用时获取tkinter.Entry来保存注释?

时间:2017-09-27 00:50:05

标签: python matplotlib tkinter

我为用户交互编写了一个非常复杂的绘图工具。通过fig.canvas.mpl_connect('key_press_event', on_key)fig.canvas.mpl_connect('pick_event', onpick)

处理互动

当用户按下“c”时,我想使用key_press_event,它会为用户添加tkinter.Entry窗口以添加评论。

然后提取并存储此评论,并且用户继续前进。

tkinter.Entry实现完全可以隔离。

所以我在这里tkComment.py

import tkinter
from tkinter import Entry, StringVar

class tkComment(object):

    def __init__(self):
        root = self.root = tkinter.Tk()
        tkinter.Button(root,text="save comment",command=root.destroy).pack(anchor=tkinter.S,side=tkinter.BOTTOM)

        entryVar = self.entryVar = tkinter.StringVar()
        entry = self.entry = Entry(master=root, width=60, textvariable=self.entryVar)
        entry.pack(side=tkinter.TOP)

我正在使用IPython进行简单测试(但问题仍然存在于Ipython之外)。我导入了这个tkComment并且有一些用于测试的函数

from __future__ import print_function

import matplotlib
matplotlib.use("TkAgg") #necessary for use with tkinter
from tkComment import tkComment

def runtkc():
    global tkC
    tkC = tkComment()
    tkC.root.mainloop()

def print_comment():
    global tkC
    print('comment for this source:', tkC.entryVar.get())

from matplotlib import pyplot as plt

def on_key(event):
    global tkC

    if event.key == 'c':
        runtkc()

    if event.key == 'C':
        print_comment()

def test_plot():
    fig,ax = plt.subplots(1)
    ax.plot(range(10))
    keyID = fig.canvas.mpl_connect('key_press_event', on_key)
    plt.show()

现在,问题是:

如果我只是致电runtkc(),那么print_comment()一切正常。

如果我通过test_plot()中的按键调用这些函数,则存储的字符串为空。即使是在tkComment.tkComment !!

内打印

我如何让这些家伙合作?

1 个答案:

答案 0 :(得分:0)

我认为问题在于matplotlib正在创建自己的tkinter实例。因此,当您在root = self.root = tkinter.Tk()中调用tkComment.__init__时,您有两个tkinter实例,而matplotlib正在与另一个实例进行通信。

如果你改为打电话 root = self.root = tkinter.Toplevel()

避免了这个问题。