更改输入值时如何在GUI上更新热图

时间:2019-06-19 16:52:49

标签: python matplotlib tkinter

我试图显示带有热图和缩放比例/滑块的GUI,并且缩放比例/滑块改变了热图中的值。

我可以显示热图和滑块,并且可以从滑块读取信息,但是在移动滑块后无法更新热图。

我尝试将代码(我认为)用于更新热图,该函数会在移动刻度尺/滑块时被调用,但是我显然缺少了一些东西。

import tkinter
from tkinter import ttk
from tkinter import *
from tkinter.ttk import *
from tkinter import messagebox
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

def myFunc(value):
    print (mySlider.get())
    array[1][2]=mySlider.get()

    #I think I need to put something here to update the heatmap when the
    #scale/slider is changed but do not know what
    figure, ax = plt.subplots()
    ax.imshow(array)

    canvas.get_tk_widget().pack()                           


    root = tkinter.Tk()
    root.title("Something")

array = ([[1,2,3,4],
          [3,9,1,5],
          [8,4,1,7],
          [2,4,9,1]])

figure, ax = plt.subplots()
ax.imshow(array)

canvas = plt.Figure()                   
canvas = FigureCanvasTkAgg(figure, root)                
canvas.get_tk_widget().pack()                           

mySlider = tkinter.Scale(root, from_=0, to=15, orient=HORIZONTAL, command=myFunc)
mySlider.pack()

1 个答案:

答案 0 :(得分:0)

像这样:

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

def myFunc(value):
    print (mySlider.get())
    array[1][2]=mySlider.get()

    im.set_array(array)
    canvas.draw()                        


root = tk.Tk()
root.title("Something")

array = ([[1,2,3,4],
          [3,9,1,5],
          [8,4,1,7],
          [2,4,9,1]])

figure, ax = plt.subplots()
im = ax.imshow(array)

canvas = FigureCanvasTkAgg(figure, root)                
canvas.get_tk_widget().pack()                           

mySlider = tk.Scale(root, from_=0, to=15, orient=tk.HORIZONTAL, command=myFunc)
mySlider.pack()

root.mainloop()

但是这里不需要tkinter。 matplotlib有一个内置的滑块(我想您已经导入了它),它很容易实现:

import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

def myFunc(value):
    array[1][2]=value
    im.set_array(array)

array = ([[1,2,3,4],
          [3,9,1,5],
          [8,4,1,7],
          [2,4,9,1]])

figure, ax = plt.subplots()
im = ax.imshow(array)                        
ax_slider = plt.axes([0.1, 0.1, 0.8, 0.03]) # [left, bottom, width, height]
slide = Slider(ax_slider, '', 0, 15, valinit=0)
slide.on_changed(myFunc)

plt.show()