Tkinter widgets
last modified January 30, 2024
In this article we cover some basic Tkinter widgets. We work with the following
widgets: Checkbutton
, Label
,
Scale
, and Listbox
.
Widgets are basic building blocks of a GUI application. Over the years, several widgets became a standard in all toolkits on all OS platforms; for example a button, a check box or a scroll bar. Some of them might have different names. For instance, a check box is called a check button in Tkinter. Tkinter has a small set of widgets which cover basic programming needs. More specialized widgets can be created as custom widgets.
Tkinter Checkbutton
Checkbutton
is a widget that has two states: on and off.
The on state is visualized by a check mark. (Some themes may have different visuals.)
It is used to denote some boolean property.
The Checkbutton
widget provides a check box with a text label.
#!/usr/bin/python from tkinter import Tk, Frame, Checkbutton from tkinter import BooleanVar, BOTH class Example(Frame): def __init__(self): super().__init__() self.initUI() def initUI(self): self.master.title("Checkbutton") self.pack(fill=BOTH, expand=True) self.var = BooleanVar() cb = Checkbutton(self, text="Show title", variable=self.var, command=self.onClick) cb.select() cb.place(x=50, y=50) def onClick(self): if self.var.get() == True: self.master.title("Checkbutton") else: self.master.title("") def main(): root = Tk() root.geometry("250x150+300+300") app = Example() root.mainloop() if __name__ == '__main__': main()
In our example, we place a check button on the window. The check button shows or hides the title of the window.
self.var = BooleanVar()
We create an BooleanVar
object. It is a value holder for Boolean
values for widgets in Tkinter.
cb = Checkbutton(self, text="Show title", variable=self.var, command=self.onClick)
An instance of the Checkbutton
is created. The value holder
is connected to the widget via the variable
parameter. When
we click on the check button, the onClick()
method is called.
This is done with the command
parameter.
cb.select()
Initially, the title is shown in the titlebar. So at the start, we make it
checked with the select()
method.
if self.var.get() == True: self.master.title("Checkbutton") else: self.master.title("")
Inside the onClick()
method, we display or hide the title based on
the value from the self.var
variable.
Tkinter Label
The Label
widget is used to display text or images.
No user interaction is available.
#!/usr/bin/python from PIL import Image, ImageTk from tkinter import Tk from tkinter.ttk import Frame, Label import sys class Example(Frame): def __init__(self): super().__init__() self.loadImage() self.initUI() def loadImage(self): try: self.img = Image.open("tatras.jpg") except IOError: print("Unable to load image") sys.exit(1) def initUI(self): self.master.title("Label") tatras = ImageTk.PhotoImage(self.img) label = Label(self, image=tatras) # reference must be stored label.image = tatras label.pack() self.pack() def setGeometry(self): w, h = self.img.size self.master.geometry(("%dx%d+300+300") % (w, h)) def main(): root = Tk() ex = Example() ex.setGeometry() root.mainloop() if __name__ == '__main__': main()
Our example shows an image on the window.
from PIL import Image, ImageTk
By default, the Label
widget can display only a limited
set of image types. To display a JPG image, we must use the PIL, Python
Imaging Library module.
self.img = Image.open("tatras.jpg")
We create an Image
from the image file in the
current working directory.
tatras = ImageTk.PhotoImage(self.img)
We create a photo image from the image.
label = Label(self, image=tatras)
The photoimage is given to the image
parameter of the
label widget.
label.image = tatras
In order not to be garbage collected, the image reference must be stored.
w, h = self.img.size self.master.geometry(("%dx%d+300+300") % (w, h))
We make the size of the window to exactly fit the image size.
Tkinter Scale
Scale
is a widget that lets the user graphically select
a value by sliding a knob within a bounded interval. Our example will
show a selected number in a label widget.
#!/usr/bin/python from tkinter import Tk, BOTH, IntVar, LEFT from tkinter.ttk import Frame, Label, Scale, Style class Example(Frame): def __init__(self): super().__init__() self.initUI() def initUI(self): self.master.title("Scale") self.style = Style() self.style.theme_use("default") self.pack(fill=BOTH, expand=1) scale = Scale(self, from_=0, to=100, command=self.onScale) scale.pack(side=LEFT, padx=15) self.var = IntVar() self.label = Label(self, text=0, textvariable=self.var) self.label.pack(side=LEFT) def onScale(self, val): v = int(float(val)) self.var.set(v) def main(): root = Tk() ex = Example() root.geometry("250x100+300+300") root.mainloop() if __name__ == '__main__': main()
We have two widgets in the above script: a scale and a label. A value from the scale widget is shown in the label widget.
scale = Scale(self, from_=0, to=100, command=self.onScale)
A Scale
widget is created. We provide the lower and upper
bounds. The from is a regular Python keyword that is why there is an
underscore after the first parameter. When we move the knob of the scale,
the onScale()
method is called.
self.var = IntVar() self.label = Label(self, text=0, textvariable=self.var)
An integer value holder and label widget are created. Value from the holder is shown in the label widget.
def onScale(self, val): v = int(float(val)) self.var.set(v)
The onScale
method receives a currently selected value from the
scale widget as a parameter. The value is first converted to a float
and then to integer. Finally, the value is set to the value holder of the
label widget.
Tkinter Listbox
Listbox
is a widget that displays a list of objects. It allows the user
to select one or more items.
#!/usr/bin/python from tkinter import Tk, BOTH, Listbox, StringVar, END from tkinter.ttk import Frame, Label class Example(Frame): def __init__(self): super().__init__() self.initUI() def initUI(self): self.master.title("Listbox") self.pack(fill=BOTH, expand=1) acts = ['Scarlett Johansson', 'Rachel Weiss', 'Natalie Portman', 'Jessica Alba'] lb = Listbox(self) for i in acts: lb.insert(END, i) lb.bind("<<ListboxSelect>>", self.onSelect) lb.pack(pady=15) self.var = StringVar() self.label = Label(self, text=0, textvariable=self.var) self.label.pack() def onSelect(self, val): sender = val.widget idx = sender.curselection() value = sender.get(idx) self.var.set(value) def main(): root = Tk() ex = Example() root.geometry("300x250+300+300") root.mainloop() if __name__ == '__main__': main()
In our example, we show a list of actresses in the Listbox
.
The currently selected actress is displayed in a label widget.
acts = ['Scarlett Johansson', 'Rachel Weiss', 'Natalie Portman', 'Jessica Alba']
This is a list of actresses to be shown in the listbox.
lb = Listbox(self) for i in acts: lb.insert(END, i)
We create an instance of the Listbox
and insert all
the items from the above mentioned list.
lb.bind("<<ListboxSelect>>", self.onSelect)
When we select an item in the listbox, the <<ListboxSelect>>
event is generated. We bind the onSelect()
method to this event.
self.var = StringVar() self.label = Label(self, text=0, textvariable=self.var)
A label and its value holder is created. In this label we will display the currently selected item.
sender = val.widget
We get the sender of the event. It is our listbox widget.
idx = sender.curselection()
We find out the index of the selected item using the
curselection
method.
value = sender.get(idx)
The actual value is retrieved with the get()
method,
which takes the index of the item.
self.var.set(value)
Finally, the label is updated.
Source
In this article we have presented several Tkinter widgets.