2017-09-27 68 views
-1

我已经为用户交互写了一个非常复杂的绘图工具。交互是通过fig.canvas.mpl_connect('key_press_event', on_key)fig.canvas.mpl_connect('pick_event', onpick)如何让tkinter.Entry在与matplotlib'key_press_event'一起使用时保存注释?

处理,我想使用key_press_event当用户按下“C”,它会提高一个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

如果您低估了我,请提供评论,告诉我如何改善此问题。我花了几天(甚至是晚上)在这方面工作,并且已经耗尽了我的编码能力。在SO或任何其他网站上都没有重复的问题,据我所知,这似乎是一个独特的问题。我也花了一些时间写作清理最低工作示例,以便于为SO进行简单的调试。 – FriskyGrub

+0

这个例子并不是最小的。您不仅包含了美观的配置选项,而且还没有将代码修剪至受影响的区域。你需要给我们看似被打破的逻辑,某种输入和某种输出。 **没有**程序的其余部分是必要的,只要它可以运行。 –

+0

@EthanField我真的认为这个例子很少。任何额外的代码都可以帮助我们理解问题,并显示课程本身按预期工作。这不应该泄气,因为每个想要帮助的人都需要自己写这些测试用例。也就是说,从找到一个变量*可以被存储并从类中读取的情况下,尝试找到一个最小*工作*例子当然是有意义的。这可以成为调试的一部分,最终可以看到工作与非工作之间的差异。 – ImportanceOfBeingErnest

回答

0

我认为问题在于matplotlib正在创建自己的tkinter实例。所以当你在tkComment.__init__中调用root = self.root = tkinter.Tk()时,你有两个tkinter实例,而matplotlib正在与另一个实例交谈。

如果改为调用 root = self.root = tkinter.Toplevel()

避免这个问题。

相关问题