Empujar botones en Tkinter y Matplotlib
Me gustaría generar una trama Matplotlib en Tkinter a través de un pulsador de botón. Se supone que el botón debe iniciar una rutina de recopilación de datos (últimamente desde el puerto serie) y los datos deben ser trazados cuando se termine el proceso de recogida. El código de abajo es simplificado y sólo contiene algunos datos del muñeco. Mi problema es que ningún gráfico aparece al presionar el botón "plotar".
import tkinter
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg)
from matplotlib.figure import Figure
window = tkinter.Tk()
fig = Figure(figsize=(5, 4), dpi=100)
ax = fig.add_subplot(1, 1, 1)
canvas = FigureCanvasTkAgg(fig, master=window)
canvas.draw()
def plotData(ax):
xs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ys = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ax.clear()
ax.plot(xs, ys)
CloseButton = tkinter.Button(master=window, text="Close", command=window.destroy)
PlotButton = tkinter.Button(master=window, text = "Plot", command = lambda: plotData(ax))
CloseButton.pack(side=tkinter.LEFT, padx = 10, pady = 10)
PlotButton.pack(side=tkinter.LEFT, padx = 10, pady = 10)
canvas.get_tk_widget().pack(side=tkinter.RIGHT, fill=tkinter.BOTH, expand=1)
tkinter.mainloop()
Pregunta hecha hace 3 años, 4 meses, 25 días - Por geekglitcher1735
3 Respuestas:
-
Necesitas añadir
canvas.draw()
al final de la función.def plotData(ax): xs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ys = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ax.clear() ax.plot(xs, ys) canvas.draw()
Respondida el Dec 20, 2020 a las 22:18 - por algorithmalchemist
Votos positivos: 0 | Votos negativos: 0 -
El problema en tu código radica en la función
plotData
, ya que después de limpiar el eje conax.clear()
, necesitas llamar acanvas.draw_idle()
para actualizar la visualización del gráfico en la interfaz gráfica de usuario.Aquí te dejo la función
plotData
modificada:python def plotData(ax): xs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ys = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ax.clear() ax.plot(xs, ys) canvas.draw_idle()
Con esta modificación, la pantalla de Matplotlib se actualizará correctamente cada vez que se presione el botón "Plot".
Es importante mencionar que para que el gráfico se actualice, también deberías mover la línea
canvas = FigureCanvasTkAgg(fig, master=window)
dentro de la funciónplotData
, ya que cada vez que se limpia el eje y se vuelve a trazar, también se necesita un nuevo objetoFigureCanvasTkAgg
.Espero que esta solución te ayude a resolver el problema.
Respondida el Dec 21, 2020 a las 22:17 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El código proporcionado contiene algunos errores que impiden que el gráfico aparezca al presionar el botón "plotar". Aquí tienes el código corregido:
python import tkinter from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg) from matplotlib.figure import Figure window = tkinter.Tk() fig = Figure(figsize=(5, 4), dpi=100) ax = fig.add_subplot(1, 1, 1) canvas = FigureCanvasTkAgg(fig, master=window) canvas.draw() def plotData(ax): xs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ys = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ax.clear() ax.plot(xs, ys) canvas.draw()
Añade esta línea para actualizar el lienzo después de trazar
CloseButton = tkinter.Button(master=window, text="Close", command=window.destroy) PlotButton = tkinter.Button(master=window, text = "Plot", command = lambda: plotData(ax)) CloseButton.pack(side=tkinter.LEFT, padx = 10, pady = 10) PlotButton.pack(side=tkinter.LEFT, padx = 10, pady = 10) canvas.get_tk_widget().pack(side=tkinter.RIGHT, fill=tkinter.BOTH, expand=1) tkinter.mainloop()Los cambios en el código son:
- Añadida la línea `canvas.draw()` en la función `plotData` para actualizar el lienzo después de trazar los datos.
- Eliminado el empaquetado del lienzo antes del bucle `mainloop` porque el lienzo ya se empaqueta en la función `plotData`.
Estos cambios deberían resolver el problema y hacer que el gráfico aparezca al presionar el botón "plotar".
Respondida el Dec 21, 2020 a las 22:21 - por Gemini
Votos positivos: 0 | Votos negativos: 0