Article Outline
Python tkinter (gui) example 'demopanels'
Modules used in program:
import inspect
demopanels
Python tkinter example: demopanels
from tkinter import *
from tkinter import ttk
from tkinter.simpledialog import Dialog
from PIL import Image, ImageTk
import inspect
class MsgPanel(ttk.Frame):
def __init__(self, master, msgtxt):
ttk.Frame.__init__(self, master)
self.pack(side=TOP, fill=X)
msg = Label(self, wraplength='4i', justify=LEFT)
msg['text'] = ''.join(msgtxt)
msg.pack(fill=X, padx=5, pady=5)
class SeeDismissPanel(ttk.Frame):
def __init__(self, master):
ttk.Frame.__init__(self, master)
self.pack(side=BOTTOM, fill=X) # resize with parent
# separator widget
sep = ttk.Separator(orient=HORIZONTAL)
# Dismiss button
#im = Image.open('images//delete.png') # image file
#imh = ImageTk.PhotoImage(im) # handle to file
dismissBtn = ttk.Button(text='Dismiss', command=self.winfo_toplevel().destroy)
#dismissBtn.image = imh # prevent image from being garbage collected
dismissBtn['compound'] = LEFT # display image to left of label text
# 'See Code' button
#im = Image.open('images//view.png')
#imh = ImageTk.PhotoImage(im)
codeBtn = ttk.Button(text='See Code', default=ACTIVE, command=lambda: CodeDialog(self.master))
#codeBtn.image = imh
codeBtn['compound'] = LEFT
codeBtn.focus()
# position and register widgets as children of this frame
sep.grid(in_=self, row=0, columnspan=4, sticky=EW, pady=5)
codeBtn.grid(in_=self, row=1, column=0, sticky=E)
dismissBtn.grid(in_=self, row=1, column=1, sticky=E)
# set resize constraints
self.rowconfigure(0, weight=1)
self.columnconfigure(0, weight=1)
# bind <Return> to demo window, activates 'See Code' button;
# <'Escape'> activates 'Dismiss' button
self.winfo_toplevel().bind('<Return>', lambda x: codeBtn.invoke() )
self.winfo_toplevel().bind('<Escape>', lambda x: dismissBtn.invoke() )
class CodeDialog(Dialog):
"""Create a modal dialog to display a demo's source code file. """
def body(self, master):
"""Overrides Dialog.body() to populate the dialog window with a scrolled text window
and custom dialog buttons. """
# get the full path of this object's parent source code file
fileName = inspect.getsourcefile(self.parent._create_widgets)
self.title('Source Code: ' + fileName)
# create scrolled text widget
txtFrame = ttk.Frame(self)
txtFrame.pack(side=TOP, fill=BOTH)
text = Text(txtFrame, height=24, width=100, wrap=WORD, setgrid=1, highlightthickness=0, pady=2, padx=3)
xscroll = ttk.Scrollbar(txtFrame, command=text.xview, orient=HORIZONTAL)
yscroll = ttk.Scrollbar(txtFrame, command=text.yview, orient=VERTICAL)
text.configure(xscrollcommand=xscroll.set, yscrollcommand=yscroll.set)
# position in frame and set resize constraints
text.grid(row=0, column=0, sticky=NSEW)
yscroll.grid(row=0, column=1, sticky=NSEW)
txtFrame.rowconfigure(0, weight=1)
txtFrame.columnconfigure(0, weight=1)
# add text of file to scrolled text widget
text.delete('0.0', END)
text.insert(END, open(fileName).read())
def buttonbox(self):
"""Overrides Dialog.buttonbox() to create custom buttons for this dialog. """
box = ttk.Frame(self)
# Cancel button
cancelBtn = ttk.Button(box, text='Cancel', command=self.cancel)
cancelBtn.pack(side=RIGHT, padx=5, pady=5)
self.bind('<Return>', self.cancel)
self.bind('<Escape>', self.cancel)
box.pack()
Useful links
- Learn Tkinter: https://pythonbasics.org/tkinter/
- Wikipedia tkinter: https://en.wikipedia.org/wiki/Tkinter