我为用户交互编写了一个非常复杂的绘图工具。通过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
!!
我如何让这些家伙合作?
答案 0 :(得分:0)
我认为问题在于matplotlib正在创建自己的tkinter实例。因此,当您在root = self.root = tkinter.Tk()
中调用tkComment.__init__
时,您有两个tkinter实例,而matplotlib正在与另一个实例进行通信。
如果你改为打电话
root = self.root = tkinter.Toplevel()
避免了这个问题。