【问题标题】:How to get tkinter.Entry to save comment when used with matplotlib 'key_press_event'?与 matplotlib 'key_press_event' 一起使用时如何让 tkinter.Entry 保存评论?
【发布时间】:2018-03-08 08:22:36
【问题描述】:

我为用户交互编写了一个非常复杂的绘图实用程序。通过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 内部打印的!!

如何让这些家伙合作?

【问题讨论】:

  • 如果您对我投了反对票,请就我如何改进这个问题发表评论。我已经花了几天(和几夜)的时间来解决这个问题,并且已经耗尽了我的编码能力。 SO或任何其他网站上没有重复的问题,据我所知,这似乎是一个独特的问题。我还花了一些时间编写尽可能干净的最小工作示例,以方便 SO 的调试。
  • 这个例子不是最小的。您不仅包含了美观的配置选项,还没有将代码缩减到仅受影响的区域。你需要给我们似乎被破坏的逻辑,某种输入和某种输出。 没有程序的其余部分是必需的,只要它可以运行。
  • @EthanField 我真的认为这个例子是最小的。任何额外的代码都可以帮助我们理解问题并表明类本身按预期工作。这不应该气馁,因为每个想要提供帮助的人都需要自己编写这些测试用例。话虽如此,尝试找到一个最小的工作示例当然是有意义的,即找到一个变量可以从一个类中存储和读取的情况.这可以是调试的一部分,最终可以看到工作和非工作之间的差异。
  • @ImportanceOfBeingErnest 如果 OP 提供一个程序来传递预先编写的输入或通过有问题的算法生成输入并显示输出,那就更好了。它不需要更多的东西。
  • @EthanField 因此,如果您已经知道问题不是由从文本输入中读取的文本引起的,那将是您可以与提问者分享的有趣信息,谁是肯定的对解决方案的任何步骤感兴趣。

标签: python matplotlib tkinter


【解决方案1】:

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

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

避免了这个问题。

【讨论】:

    猜你喜欢
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2015-10-17
    • 2021-03-05
    相关资源
    最近更新 更多