{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n# Embed in Tk\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import tkinter\n\nimport numpy as np\n\n# Implement the default Matplotlib key bindings.\nfrom matplotlib.backend_bases import key_press_handler\nfrom matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg,\n NavigationToolbar2Tk)\nfrom matplotlib.figure import Figure\n\nroot = tkinter.Tk()\nroot.wm_title(\"Embedded in Tk\")\n\nfig = Figure(figsize=(5, 4), dpi=100)\nt = np.arange(0, 3, .01)\nax = fig.add_subplot()\nline, = ax.plot(t, 2 * np.sin(2 * np.pi * t))\nax.set_xlabel(\"time [s]\")\nax.set_ylabel(\"f(t)\")\n\ncanvas = FigureCanvasTkAgg(fig, master=root) # A tk.DrawingArea.\ncanvas.draw()\n\n# pack_toolbar=False will make it easier to use a layout manager later on.\ntoolbar = NavigationToolbar2Tk(canvas, root, pack_toolbar=False)\ntoolbar.update()\n\ncanvas.mpl_connect(\n \"key_press_event\", lambda event: print(f\"you pressed {event.key}\"))\ncanvas.mpl_connect(\"key_press_event\", key_press_handler)\n\nbutton_quit = tkinter.Button(master=root, text=\"Quit\", command=root.destroy)\n\n\ndef update_frequency(new_val):\n # retrieve frequency\n f = float(new_val)\n\n # update data\n y = 2 * np.sin(2 * np.pi * f * t)\n line.set_data(t, y)\n\n # required to update canvas and attached toolbar!\n canvas.draw()\n\n\nslider_update = tkinter.Scale(root, from_=1, to=5, orient=tkinter.HORIZONTAL,\n command=update_frequency, label=\"Frequency [Hz]\")\n\n# Packing order is important. Widgets are processed sequentially and if there\n# is no space left, because the window is too small, they are not displayed.\n# The canvas is rather flexible in its size, so we pack it last which makes\n# sure the UI controls are displayed as long as possible.\nbutton_quit.pack(side=tkinter.BOTTOM)\nslider_update.pack(side=tkinter.BOTTOM)\ntoolbar.pack(side=tkinter.BOTTOM, fill=tkinter.X)\ncanvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=True)\n\ntkinter.mainloop()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.2"
}
},
"nbformat": 4,
"nbformat_minor": 0
}