当前位置: 首页 > 知识库问答 >
问题:

从Tkinter gui中更新matplotlib imshow

颜哲彦
2023-03-14

我试图更新数据在matplotlib imshow窗口内的Tkinter gui,我的代码示例如下:

#minimal example...

import matplotlib, sys
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib import pylab as plt
from scipy import ndimage

if sys.version_info[0] < 3:
    import Tkinter as Tk
else:
    import tkinter as Tk

root = Tk.Tk()
root.wm_title("minimal example")

image = plt.imread('test.jpg')
fig = plt.figure(figsize=(5,4))
im = plt.imshow(image) # later use a.set_data(new_data)
ax = plt.gca()
ax.set_xticklabels([]) 
ax.set_yticklabels([]) 

# a tk.DrawingArea
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.show()
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

def rotate(*args):
    print 'rotate button press...'
    theta = 90
    rotated = ndimage.rotate(image, theta)
    im.set_data(rotated)
    root.update()

def quit(*args):
    print 'quit button press...'
    root.quit()     
    root.destroy() 

button_rotate = Tk.Button(master = root, text = 'Rotate', command = rotate)
button_quit = Tk.Button(master = root, text = 'Quit', command = quit)

button_quit.pack(side=Tk.LEFT)
button_rotate.pack()

Tk.mainloop()

如您所见,我使用imshow()加载图像,然后尝试使用set_data()更新图像的数据,然后希望使用root.update()更新gui的根窗口。执行时,打印“旋转按钮按下......”行被执行,但其余行似乎没有执行。我需要如何将图像句柄传递给旋转函数,还是返回旋转的图像?

共有1个答案

端木震博
2023-03-14

画布需要重新绘制,请尝试以下操作:

def rotate(*args):
    print 'rotate button press...'
    theta = 90
    rotated = ndimage.rotate(image, theta)
    im.set_data(rotated)
    canvas.draw()

更新以保持旋转

注意这是将图像保存为的属性。也许不是最好的方法,但它适用于示例

root = Tk.Tk()
root.wm_title("minimal example")

root.image = plt.imread('test.jpg')
fig = plt.figure(figsize=(5,4))
im = plt.imshow(root.image) # later use a.set_data(new_data)
ax = plt.gca()
ax.set_xticklabels([]) 
ax.set_yticklabels([])

# a tk.DrawingArea
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.show()
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

def rotate(*args):
    print 'rotate button press...'
    root.image = ndimage.rotate(root.image, 90)
    im.set_data(root.image)
    canvas.draw()
 类似资料:
  • 我有一个datatable,其中包含删除行的按钮,我想在之后刷新该表。刷新工作很好,除了一个案例,当我删除最后一个项目。我相信这是因为属性,它在ajax更新时表现不佳。它都在一个复合组件中,datatable是有条件呈现的,看起来都是这样的: 除了我从列表中移除最后一个项目(并希望表消失)的情况外,这工作得很好。通过ajax显示表不是问题,因为我添加的项目也没有提交,并且表在添加第一个项目后正确显

  • 我想知道ehcache是否有办法检测数据库更新/插入(spring/java,hibernate web应用程序),并使用数据库中的当前(最新)数据刷新其缓存。如果没有,检测数据库更新的最佳方法是什么,以保持与缓存和数据库之间的数据同步?

  • 更新在 Illustrator 10 中创建的文字 在 Illustrator 10 或更早版本中创建的文字对象,必须在新版本中更新后,方可进行编辑。进行更新后,您可以访问 Illustrator CS4 中的所有文本功能,如段落和字符样式、视觉字偶间距调整和完整的 OpenType® 字体支持。 如果不需要编辑文本,则不必对其进行更新。尚未更新的文本称为旧版文本。您可以查看、移动和打印旧版文本,

  • 我在通知CursorAdapter数据已更改时遇到问题。 SQLite数据库用AsyncTask更新(有公共接口,ListFragment用listener实现),我尝试用onPostExecute刷新ListAdapter,但我真的不知道如何刷新。

  • 问题内容: 我的GUI中有一个由菜单填充的OptionMenu。每次用户运行某个进程时,列表都会更新以反映这一点。有没有一种方法可以基于列表更新OptionMenu?我已经试过按照这个问题,但无济于事。但是,关闭并重新打开该窗口并不会像您期望的那样刷新OptionMenu。相关代码: 问题答案: OptionMenu中的选项未绑定到创建它们的列表。因此,更改列表不会更改OptionMenu,您必须