tkinter .after() 函数没有暂停
tkinter .after() function is not pausing
当我尝试 运行 我的代码时,所有内容都会执行,但后函数调用会立即更新,尽管我延迟了 5 秒。最重要的是,gui 不显示任何图形。
import tkinter as tk
import numpy as np
import time
import functools
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
main = tk.Tk()
container = tk.Frame(main)
container.pack(side="top", fill="both", expand = True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
f = Figure(figsize=(5,5), dpi=100)
a = f.add_subplot(111)
canvas = FigureCanvasTkAgg(f, master=main)
canvas.show()
canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
def update(a, canvas):
data = np.genfromtxt('test.csv', delimiter=',', names=['x', 'y'])
a.clear()
a.plot(data['x'], data['y'], color='r', label='the data')
canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
print ("update")
main.after(5000, functools.partial(update, a)(canvas))
main.after(5000, functools.partial(update, a)(canvas))
main.mainloop()
任何解决此问题的帮助或只是一般性的 python 提示,我们将不胜感激。
考虑这行代码:
main.after(5000, functools.partial(update, a)(canvas))
它做的事情与此完全相同:
func = functools.partial(update, a)
result = func(canvas)
main.after(5000, result)
为了让 after
完成它的工作,您必须给它一个 reference 要调用的函数。在您的代码中,您实际上是立即调用它,然后将结果传递给 after
.
由于您可以向 after
提供位置参数,这些参数将传递给您的命令,因此您可以像这样重写 after
:
main.after(5000, functools.partial(update, a), canvas)
不过,我不太明白你为什么认为你需要 functools.partial
。您应该能够将其浓缩为:
main.after(5000, update, a, canvas)
当我尝试 运行 我的代码时,所有内容都会执行,但后函数调用会立即更新,尽管我延迟了 5 秒。最重要的是,gui 不显示任何图形。
import tkinter as tk
import numpy as np
import time
import functools
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
main = tk.Tk()
container = tk.Frame(main)
container.pack(side="top", fill="both", expand = True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
f = Figure(figsize=(5,5), dpi=100)
a = f.add_subplot(111)
canvas = FigureCanvasTkAgg(f, master=main)
canvas.show()
canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
def update(a, canvas):
data = np.genfromtxt('test.csv', delimiter=',', names=['x', 'y'])
a.clear()
a.plot(data['x'], data['y'], color='r', label='the data')
canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
print ("update")
main.after(5000, functools.partial(update, a)(canvas))
main.after(5000, functools.partial(update, a)(canvas))
main.mainloop()
任何解决此问题的帮助或只是一般性的 python 提示,我们将不胜感激。
考虑这行代码:
main.after(5000, functools.partial(update, a)(canvas))
它做的事情与此完全相同:
func = functools.partial(update, a)
result = func(canvas)
main.after(5000, result)
为了让 after
完成它的工作,您必须给它一个 reference 要调用的函数。在您的代码中,您实际上是立即调用它,然后将结果传递给 after
.
由于您可以向 after
提供位置参数,这些参数将传递给您的命令,因此您可以像这样重写 after
:
main.after(5000, functools.partial(update, a), canvas)
不过,我不太明白你为什么认为你需要 functools.partial
。您应该能够将其浓缩为:
main.after(5000, update, a, canvas)