使用Ktinter/PySimpleGUI重绘Matplotlib交互式固定背景图

yvgpqqbh  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(102)

我已经找了一整天,找到了很多解决方案,但不能应用于我的问题,所以我现在绝望地问你们。我只是想要一个界面,你可以移动滑块,这将改变相应的情节。我已经做了,但问题是,整个图被重新绘制,这需要时间,是丑陋的。我只是想更新情节本身,但与轴等背景.应该保持不变我希望有人能帮助我。我的代码相当混乱,因为我试图实现各种解决方案,但如果你运行它,你就会明白我的想法和问题。
我读过使用blitting,但我只是不能将其应用于FigureCanvasTkAgg,因为我希望它是交互式的,而不是一个正在进行的动画。我的主要问题是,我需要将人物和画布交付给FigurCanvasTkAgg,并且无法将其与背景的保存和恢复结合在一起。

import tkinter as tk
import numpy as np
import PySimpleGUI as sg
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib
import matplotlib.pyplot as plt

_VARS = {'window': False,
         'fig_agg': False,
         'pltFig': False}

layout = [[sg.Canvas(key='figCanvas')],
          [sg.Button('Send message'), sg.Button('Bye!')],
          [sg.Slider(range=(0, 3000), default_value=1000,
          expand_x=True, enable_events=True,
          orientation='horizontal', key='-SL-')]]
_VARS['window'] = sg.Window('Such Window',
                            layout,
                            finalize=True,
                            resizable=True,
                            location=(100, 100),
                            element_justification="right")

x = np.linspace(0, 2 * np.pi, 100)

fig, ax = plt.subplots()
plt.show(block=False)
plt.pause(0.1)
bg = fig.canvas.copy_from_bbox(fig.bbox)
ax.plot(x, x)
fig.canvas.blit(fig.bbox)

calib_frame = tk.LabelFrame(_VARS['window']['figCanvas'].TKCanvas, text='probe angle calibration', padx=5, pady=5)
calib_frame.grid(column=0, row=0, sticky='ns')
calib_canvas = FigureCanvasTkAgg(fig, master=calib_frame)
calib_canvas.draw()
calib_canvas.blit(fig.bbox)
calib_canvas.get_tk_widget().grid(column=0, row=0)

def updateChart(Mon_Rueck):
    fig.canvas.restore_region(bg)
    fig.canvas.blit(fig.bbox)
    calib_canvas = FigureCanvasTkAgg(fig, master=calib_frame)
    ax.clear()
    ax.plot(x, np.sin(Mon_Rueck*x))
    calib_canvas.draw()
    calib_canvas.get_tk_widget().grid(column=0, row=0)

while True:
    event, values = _VARS['window'].read()
    if event == sg.WIN_CLOSED or event == 'Bye!':
        break
    if event == '-SL-':
        response = 'Monatliche Rücklagen: ' + str(values['-SL-'])
        updateChart(values['-SL-'])
_VARS['window'].close()

字符串

mum43rcc

mum43rcc1#

我可能已经搞砸了轴值的变化,但它的平滑。问题,我能说的最好的,只发生在滑块被按住的时候。
我所做的更改是注解掉updateChart的前两行,这样它就不会进行恢复和blit。

def updateChart(Mon_Rueck):
    # fig.canvas.restore_region(bg)
    # fig.canvas.blit(fig.bbox)
    calib_canvas = FigureCanvasTkAgg(fig, master=calib_frame)
    ax.clear()
    ax.plot(x, np.sin(Mon_Rueck*x))
    calib_canvas.draw()
    calib_canvas.get_tk_widget().grid(column=0, row=0)

字符串


的数据

相关问题