1

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.

1
  • first try to use grid(). You can also group elements in Frame and inside use pack()/grid()/place() to put elements horizontally, and outside use place()/grid()/pack() to arrange Frames vertically. Commented Oct 16, 2019 at 2:12

1 Answer 1

2

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()
Sign up to request clarification or add additional context in comments.

1 Comment

Didn't know you can simply add a button to toolbar... +1.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.