How To Create a font Chooser using Tkinter in python

Posted by Yashwant bisht on January 09, 2017 · 22 mins read
hello readers,

               today, we will discuss about how we can create an font chooser window for text editorFor this purpose i am going to use tkFont module. This module is very compatible for this purpose because with this module, we can change font configurations simply. So, here i am going to show you an Screenshots of Font selecting dialog box created by me.


And for this purpose first of all, copy all the codes given below
And save them in a text file as font box. py
Because we will use this script as a module.

  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
try:
import Tkinter
except:
import tkinter as Tkinter
import tkFont,ttk


class Font_wm(Tkinter.Toplevel):
def __init__(self, Font=None):

Tkinter.Toplevel.__init__(self)
self.mainfont=Font
self.title('Font ...')

# Variable
self.var=Tkinter.StringVar()# For Font Face
self.var.set(self.mainfont.actual('family'))
self.var1=Tkinter.IntVar() # for Font Size
self.var1.set(self.mainfont.actual('size'))
self.var2=Tkinter.StringVar() # For Bold
self.var2.set(self.mainfont.actual('weight'))
self.var3=Tkinter.StringVar() # For Italic
self.var3.set(self.mainfont.actual('slant'))
self.var4=Tkinter.IntVar()# For Underline
self.var4.set(self.mainfont.actual('underline'))
self.var5=Tkinter.IntVar() # For Overstrike
self.var5.set(self.mainfont.actual('overstrike'))


# Font Sample
self.font_1=tkFont.Font()
for i in ['family', 'weight', 'slant', 'overstrike', 'underline', 'size']:
self.font_1[i]=self.mainfont.actual(i)

# Function
def checkface(event):
try:
self.var.set(str(self.listbox.get(self.listbox.curselection())))
self.font_1.config(family=self.var.get(), size=self.var1.get(), weight=self.var2.get(), slant=self.var3.get(), underline=self.var4.get(), overstrike=self.var5.get())
except:
pass
def checksize(event):
try:
self.var1.set(int(self.size.get(self.size.curselection())))
self.font_1.config(family=self.var.get(), size=self.var1.get(), weight=self.var2.get(), slant=self.var3.get(), underline=self.var4.get(), overstrike=self.var5.get())
except:
pass
def applied():
self.result=(self.var.get(), self.var1.get(), self.var2.get(), self.var3.get(), self.var4.get(), self.var5.get())
self.mainfont['family']=self.var.get()
self.mainfont['size']=self.var1.get()
self.mainfont['weight']=self.var2.get()
self.mainfont['slant']=self.var3.get()
self.mainfont['underline']=self.var4.get()
self.mainfont['overstrike']=self.var5.get()
def out():
self.result=(self.var.get(), self.var1.get(), self.var2.get(), self.var3.get(), self.var4.get(), self.var5.get())
self.mainfont['family']=self.var.get()
self.mainfont['size']=self.var1.get()
self.mainfont['weight']=self.var2.get()
self.mainfont['slant']=self.var3.get()
self.mainfont['underline']=self.var4.get()
self.mainfont['overstrike']=self.var5.get()
self.destroy()
def end():
self.result=None
self.destroy()

# Main window Frame
self.mainwindow=ttk.Frame(self)
self.mainwindow.pack(padx=10, pady=10)
# Main LabelFrame
self.mainframe=ttk.Frame(self.mainwindow)
self.mainframe.pack(side='top',ipady=30, ipadx=30,expand='no', fill='both')
self.mainframe0=ttk.Frame(self.mainwindow)
self.mainframe0.pack(side='top', expand='yes', fill='x', padx=10, pady=10)
self.mainframe1=ttk.Frame(self.mainwindow)
self.mainframe1.pack(side='top',expand='no', fill='both')
self.mainframe2=ttk.Frame(self.mainwindow)
self.mainframe2.pack(side='top',expand='yes', fill='x', padx=10, pady=10)
# Frame in [ main frame]
self.frame=ttk.LabelFrame(self.mainframe, text='Select Font Face')
self.frame.pack(side='left', padx=10, pady=10, ipadx=20, ipady=20, expand='yes', fill='both')
self.frame1=ttk.LabelFrame(self.mainframe, text='Select Font size')
self.frame1.pack(side='left', padx=10, pady=10, ipadx=20, ipady=20, expand='yes', fill='both')
ttk.Entry(self.frame, textvariable=self.var).pack(side='top', padx=5, pady=5, expand='yes', fill='x')
self.listbox=Tkinter.Listbox(self.frame, bg='gray70')
self.listbox.pack(side='top', padx=5, pady=5, expand='yes', fill='both')
for i in tkFont.families():
self.listbox.insert(Tkinter.END, i)

# Frame in [ 0. mainframe]
self.bold=ttk.Checkbutton(self.mainframe0, text='Bold', onvalue='bold', offvalue='normal', variable=self.var2)
self.bold.pack(side='left',expand='yes', fill='x')
self.italic=ttk.Checkbutton(self.mainframe0, text='Italic', onvalue='italic', offvalue='roman',variable=self.var3)
self.italic.pack(side='left', expand='yes', fill='x')
self.underline=ttk.Checkbutton(self.mainframe0, text='Underline',onvalue=1, offvalue=0, variable=self.var4)
self.underline.pack(side='left', expand='yes', fill='x')
self.overstrike=ttk.Checkbutton(self.mainframe0, text='Overstrike',onvalue=1, offvalue=0, variable=self.var5)
self.overstrike.pack(side='left', expand='yes', fill='x')

# Frame in [ 1. main frame]
ttk.Entry(self.frame1, textvariable=self.var1).pack(side='top', padx=5, pady=5, expand='yes', fill='x')
self.size=Tkinter.Listbox(self.frame1, bg='gray70')
self.size.pack(side='top', padx=5, pady=5, expand='yes', fill='both')
for i in range(30):
self.size.insert(Tkinter.END, i)

Tkinter.Label(self.mainframe1, bg='white',text='''
ABCDEabcde12345
''', font=self.font_1).pack(expand='no', padx=10,pady=10)

# Frame in [ 2. mainframe]
ttk.Button(self.mainframe2, text=' OK ', command=out).pack(side='left', expand='yes', fill='x', padx=5, pady=5)
ttk.Button(self.mainframe2, text=' Cancel ', command=end).pack(side='left', expand='yes', fill='x', padx=5, pady=5)
ttk.Button(self.mainframe2, text=' Apply ', command=applied).pack(side='left', expand='yes', fill='x', padx=5, pady=5)

self.listbox.bind('<<ListboxSelect>>', checkface)
self.size.bind('<<ListboxSelect>>', checksize)

After This step, again copy all the codes given below and save them in a text file with extension py on the same directory  because we will import font box python script. Here , I saved this script as testfont.py

 1
2
3
4
5
6
7
8
9
10
11
12
13
from fontbox import *
try:
import Tkinterex
cept:
importt kinter as Tkinterimpo
rt tkFont


=rootTkinter.Tk()
font1=tkFont.Font()
Tkinter.Text(root,font=font1).pack()
Font_wm(Font=font1)
root.mainloop()
Now, Run this script and you will see an Font chooser with live demo.
You can also upgrade this code as your need.

Thanks For Support
Please, Feel Free To Leave A Comment If Our Article has Helped You.
Suraj
surajsinghbisht054@gmail.com