Tkinter textvariable未使用MatplotLib更新

时间:2018-10-30 10:49:01

标签: python matplotlib tkinter label

有人可以在这里帮助我吗?当我添加以下行时,textvariable不会被更新:

f = plt.figure(0, figsize=(20,9))

如果我在上面的行中添加了注释,那么我会看到Label中的textvariable正在更新,但是取消注释该行后,Label便不再更新。 有人可以帮我吗?

from tkinter import *
from tkinter import ttk
from tkinter import StringVar

import matplotlib
import matplotlib.artist as artists
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
import matplotlib.animation as animation

f = plt.figure(0, figsize=(20,9))

class make_window():

    def __init__(self, *args, **kwargs):

        self.win = Tk()
        self.win.title("Test")
        self.win.state("zoomed")

        Frame = ttk.Frame(self.win)
        Frame.pack()

        labelVar = StringVar()
        labelVar.set("Hi")
        self.LabelUpdate = Label(Frame, textvariable = labelVar)
        self.LabelUpdate.pack()


#################################################################################

window = make_window()
window.win.mainloop()

1 个答案:

答案 0 :(得分:0)

我注意到您需要解决一些问题。

首先,导入(from tkinter import *)的方式会引起问题,实际上,在这种情况下,您会犯这种导入众所周知的错误。稍后在您的代码中执行Frame = ttk.Frame(),而这一行实际上是覆盖从Frame导入的from tkinter import *。不要将变量的名称与内置方法的名称相同。为了防止这种错误,您可以简单地执行import tkinter as tk并始终使用tk.前缀来防止代码中的任何覆盖。

接下来,我注意到您的标签确实装在屏幕上,但显示的文字不够奇怪,但是当我注释掉f = plt.figure(0, figsize=(20,9))时,标签开始按预期工作。

因此,与matplotlib和此标签存在一些奇怪的相互作用。

当我将f = plt.figure(0, figsize=(20,9))更改为f = Figure(figsize=(20,9))时,标签也会再次起作用。

如果Figure()并不完全是您要在此处使用的内容,那么请向您的代码中添加更多上下文,以了解您期望如何使用f

更新:

我也确实注意到,当您将f移到self.win = tk.Tk()之后时,代码可以正常工作。我唯一的猜测是为什么会发生这种情况,可能是matplotlib如何在其中确实拥有自己的tkinter代码。因此,如果您在创建tkinter实例之前尝试创建plt.figure,那么我在后端通过matplotlib运行了一个tkinter实例,这就是导致异常行为的原因。我可能是错的,但我别无选择。也许Tkinter大师布莱恩·奥克利(Bryan Oakley)可以启发我们有关造成此问题的原因:D

import tkinter as tk
import tkinter.ttk as ttk

import matplotlib
import matplotlib.artist as artists
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
import matplotlib.animation as animation


class make_window():
    def __init__(self, *args, **kwargs):
        self.win = tk.Tk()
        # moving the line to here should at least allow your code to work.
        f = plt.figure(0, figsize=(20,9))
        self.win.title("Test")
        self.win.state("zoomed")

        frame = ttk.Frame(self.win)
        frame.pack()

        labelVar = tk.StringVar()
        labelVar.set("Hi")
        self.LabelUpdate = tk.Label(frame, textvariable = labelVar)
        self.LabelUpdate.pack()


window = make_window()
window.win.mainloop()