2017-09-27 85 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()

避免這個問題。