gpt4 book ai didi

python - Matplotlib 及其与 tkinter 的连接

转载 作者:行者123 更新时间:2023-12-01 03:39:13 25 4
gpt4 key购买 nike

我有一个问题,可能与模块无关。

在下面的代码中,有一个函数 update,它将通过 matplotlib 创建一个 Canvas ,并将其分配给 tkinter 中的相关框架。然后它创建一个事件处理程序 Cursor,它应该将鼠标的位置打印到控制台中。但事实并非如此。但是,如果您删除方法更新并仅在模块主体中使用用于创建图形、光标和连接的行,则一切正常。

我错过了什么?我猜这是Python的基础知识,可见性和传递正确的实例,我不知道。

import matplotlib.pyplot as plt
from tkinter import *
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

class Cursor (object):
def __init__ (self, fig):
self.fig = fig
print ("initializing")

def mouse_move (self, event):
if not event.inaxes:
return
x, y = event.xdata, event.ydata
print (x, y)

def connect (self):
print ("Connecting")
self.conmove = self.fig.canvas.mpl_connect ('motion_notify_event', self.mouse_move)

def pyplot_f ():
fig = plt.figure(figsize=(6,4), dpi=100)
axes = fig.add_subplot (111)
axes.plot([1,2,3,4], [1,2,3,4])

Canvas = FigureCanvasTkAgg (fig, master=frame_output)

canvas = Canvas.get_tk_widget()
canvas.grid(row=0,column=0, padx=5, pady=5, sticky="nesw")

return fig

w_width = 1000
w_height = 600
root = Tk()
root.resizable(0,0)

frame_output = Frame (root, bg="", relief=SUNKEN, width=w_width*0.8, height=w_height*0.9)
frame_output.grid(row=0, column=0, padx=20, pady=20, sticky=W+N+E+S)
frame_input = Frame (root, bg="", relief=RAISED,width=w_width*0.2, height=w_height*0.9)
frame_input.grid(row=0, column=1, padx=20, pady=20, sticky=W+N+E+S)

def update ():
fig = pyplot_f()
cursor = Cursor(fig)
cursor.connect()

def on_closing():
print ("Exiting")
root.quit()

update()
root.protocol("WM_DELETE_WINDOW", on_closing)
root.mainloop()

最佳答案

您的问题似乎与变量范围和生命周期有关。

当您的 update() 函数结束时,其中声明的变量 figcursor 将超出范围。在 update() 中创建的图形和光标对象没有进一步的引用指向它们,因此它们最终会被垃圾收集。您的 update() 函数已成功创建图形和光标,但并不能阻止它们再次被删除。

当您将 update() 中的三行移动到模块主体时,变量 figcursor 仍保留在作用域内并且在程序结束之前不会进行垃圾收集。因此,您的图形和光标被创建,但不会立即被垃圾收集。

解决此问题的最简单方法是使用 update() 函数返回光标,然后将其保留在模块范围内:

def update ():
fig = pyplot_f()
cursor = Cursor(fig)
cursor.connect()
return cursor

# ...

cursor = update()

这可以防止光标被垃圾收集,并且由于光标引用了图窗,因此图窗也不会被垃圾收集。

关于python - Matplotlib 及其与 tkinter 的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39931797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com