mistersenpai
mistersenpai

Reputation: 59

How to resize matplotlib graph in tkinter window

I'm trying to set up some program that includes a matplotlib graph and tkinter buttons and whatnot below it. However, the matplotlib graph occupies the entire window overlaying the tkinter buttons and stuff.

I'd tried using pack, but it doesn't let me put stuff side by side, so I'd like the tkinter widgets to be arranged with .grid or coordinates.

from tkinter import *
from tkinter import StringVar
import tkinter
from matplotlib.backends.backend_tkagg import (
    FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figure
import matplotlib.pyplot as plt

def eggs():
  print("eggs")

root = Tk()
root.geometry("600x600")
root.title("eggs")


fig = Figure(figsize=(10, 6), dpi=100)
x = [1,2,3,4]
y = [1,2,3,4]
AS = [10/2**0]
fig.add_subplot(111).plot(x,y)
#fig.add_subplot(111).plot(AS)

canvas = FigureCanvasTkAgg(fig, master=root)  # A tk.DrawingArea.
canvas.draw()
canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)

toolbar = NavigationToolbar2Tk(canvas, root)
toolbar.update()
canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)

testbutton = Button(root, text = "test button", command = eggs)
testbutton.place(x=100, y=550)


root.mainloop()

Wanting the top part of the window to be occupied by the graph and the buttons and other additional stuff below it.

Upvotes: 1

Views: 4414

Answers (1)

furas
furas

Reputation: 143056

You can use one Frame to keep graph and its toolbar vertically, and another Frame to keep buttons horizontally. And then you can use pack() to put one Frame at top top and other at the bottom.


The only problem makes figsize=(10, 6) which needs more space than "600x600"


BTW: you can use Button(toolbar, ...) to add button to NavigationToolbar2Tk - see "my tool".


enter image description here]1

import tkinter as tk
from matplotlib.backends.backend_tkagg import (
    FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figure
import matplotlib.pyplot as plt

# --- functions ---

def eggs():
    print("eggs")

# --- main ---

x = [1, 2, 3, 4]
y = [1, 2, 3, 4]
AS = [10/2**0]

# ---

root = tk.Tk()
root.geometry("600x600")
root.title("eggs")

# ---

frame_top = tk.Frame(root)
frame_top.pack(fill='both', expand=True)

fig = Figure(dpi=100) # figsize=(10, 6), 
fig.add_subplot(111).plot(x,y)
#fig.add_subplot(111).plot(AS)

canvas = FigureCanvasTkAgg(fig, master=frame_top)  # A tk.DrawingArea.
canvas.draw()
canvas.get_tk_widget().pack(fill='both', expand=True)

toolbar = NavigationToolbar2Tk(canvas, frame_top)
toolbar.update()

tool = tk.Button(toolbar, text="my tool")
tool.pack(side='left')#, fill='x', expand=True)

# ---

frame_bottom = tk.Frame(root)
frame_bottom.pack(fill='x')

button1 = tk.Button(frame_bottom, text="button1")
button1.pack(side='left', fill='x', expand=True)

button2 = tk.Button(frame_bottom, text="button2")
button2.pack(side='left', fill='x', expand=True)

button3 = tk.Button(frame_bottom, text="button3")
button3.pack(side='left', fill='x', expand=True)

# ---

root.mainloop()

Upvotes: 2

Related Questions