Skip to content

Commit 1a20e5e

Browse files
committed
add gui dictionary app tkinter tutorial
1 parent 99b7a18 commit 1a20e5e

File tree

7 files changed

+146
-0
lines changed

7 files changed

+146
-0
lines changed

Diff for: README.md

+1
Original file line numberDiff line numberDiff line change
@@ -257,5 +257,6 @@ This is a repository of all the tutorials of [The Python Code](https://www.thepy
257257
- [How to Build a GUI Voice Recorder App in Python](https://www.thepythoncode.com/article/make-a-gui-voice-recorder-python). ([code](gui-programming/voice-recorder-app))
258258
- [How to Make a Chess Game with Pygame in Python](https://www.thepythoncode.com/article/make-a-chess-game-using-pygame-in-python). ([code](gui-programming/chess-game))
259259
- [How to Build a GUI QR Code Generator and Detector Using Python](https://www.thepythoncode.com/article/make-a-qr-code-generator-and-reader-tkinter-python). ([code](gui-programming/qrcode-generator-reader-gui))
260+
- [How to Build a GUI Dictionary App with Tkinter in Python](https://www.thepythoncode.com/article/make-a-gui-audio-dictionary-python). ([code](gui-programming/word-dictionary-with-audio))
260261

261262
For any feedback, please consider pulling requests.

Diff for: gui-programming/word-dictionary-with-audio/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# [How to Build a GUI Dictionary App with Tkinter in Python](https://www.thepythoncode.com/article/make-a-gui-audio-dictionary-python)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
# this imports everything from the tkinter module
2+
from tkinter import *
3+
# importing the ttk module from tkinter that's for styling widgets
4+
from tkinter import ttk
5+
# importing message boxes like showinfo, showerror, askyesno from tkinter.messagebox
6+
from tkinter.messagebox import showerror, askyesno
7+
# importing the PyDictionary library
8+
from PyDictionary import PyDictionary
9+
# this package converts text to speech
10+
import pyttsx3
11+
12+
13+
# the function for closing the application
14+
def close_window():
15+
# this will ask the user whether to close or not
16+
# if the value is yes/True the window will close
17+
if askyesno(title='Close Audio Dictionary', message='Are you sure you want to close the application?'):
18+
# this destroys the window
19+
window.destroy()
20+
21+
22+
# function for searching the word meaning
23+
def search_word():
24+
# getting the word from the entry using the get()
25+
word = word_entry.get()
26+
# checking if the word variable is empty
27+
if word == '':
28+
# message box to display if the word variable is empty
29+
showerror(title='Error', message='Please enter the word you wanna search for!!')
30+
# the else statement will execute if the word variable is not empty
31+
else:
32+
# this will execute the code that will find the word meanings
33+
try:
34+
# creating a dictionary object
35+
dictionary = PyDictionary()
36+
# passing a word to the dictionary object
37+
meanings = dictionary.meaning(word)
38+
# deleting content in the text field
39+
text_field.delete(1.0, END)
40+
# inserting content(meanings) in the text field
41+
text_field.insert('1.0', meanings)
42+
# adding the word to the empty label
43+
word_label.config(text=word)
44+
# enabling the audio button to normal state
45+
audio_button.config(state=NORMAL, command=speak)
46+
# this will catch all the exceptions, No/slow internet connection, word with wrong spellings
47+
except:
48+
# display the error to the user
49+
showerror(title='Error', message='An error occurred while trying to search word meaning' \
50+
'\nThe following could be ' \
51+
'the cause:\n->No/Slow internet connection\n' \
52+
'->Wrong word spelling\n' \
53+
'Please make sure you have a stable internet connection&\nthe word spelling is correct')
54+
55+
56+
57+
58+
# function to turn textual data into audio data
59+
def speak():
60+
# getting the word from the entry
61+
word = word_entry.get()
62+
# initializing the pyttsx3 object
63+
engine = pyttsx3.init()
64+
# gets the speaking rate
65+
rate = engine.getProperty('rate')
66+
# setting the speaking rate
67+
engine.setProperty('rate', 125)
68+
# getting the available voices
69+
voices = engine.getProperty('voices')
70+
# seeting the second voice, the female voice
71+
engine.setProperty('voice', voices[1].id)
72+
# this function takes the word to be spoken
73+
engine.say(word)
74+
# this fucntion processes the voice commands
75+
engine.runAndWait()
76+
77+
78+
79+
# creates the window using Tk() fucntion
80+
window = Tk()
81+
# creates title for the window
82+
window.title('Audio-Dictionary')
83+
# this is for closing the window via the close_window() function
84+
window.protocol('WM_DELETE_WINDOW', close_window)
85+
# adding the window's icon
86+
window.iconbitmap(window, 'dictionary.ico')
87+
# dimensions and position of the window
88+
window.geometry('560x480+430+180')
89+
# makes the window non-resizable
90+
window.resizable(height=FALSE, width=FALSE)
91+
92+
"""Styles for the widgets"""
93+
# style for the big text label
94+
big_label_style = ttk.Style()
95+
big_label_style.configure('big_label_style.TLabel', foreground='#000000', font=('OCR A Extended', 40))
96+
# style for small text labels
97+
small_label_style = ttk.Style()
98+
small_label_style.configure('small_label_style.TLabel', foreground='#000000', font=('OCR A Extended', 15))
99+
# style for the entry
100+
entry_style = ttk.Style()
101+
entry_style.configure('TEntry', font=('Dotum', 20))
102+
# style for the two buttons
103+
button_style = ttk.Style()
104+
button_style.configure('TButton', foreground='#000000', font='DotumChe')
105+
106+
# creates the canvas for containing all the widgets
107+
canvas = Canvas(window, width=480, height=560)
108+
# packing the canvas
109+
canvas.pack()
110+
# creating a ttk label
111+
text_label = ttk.Label(window, text='Audio Dictionary', style='big_label_style.TLabel')
112+
# adding the label to the canvas
113+
canvas.create_window(250, 55, window=text_label)
114+
# creating a ttk entry
115+
word_entry = ttk.Entry(window, width=73, style='TEntry')
116+
# adding the entry to the canvas
117+
canvas.create_window(230, 110, window=word_entry, height=35)
118+
# loading the icon
119+
search_icon = PhotoImage(file='search.png')
120+
# creates dimensions of the icon
121+
logo = search_icon.subsample(20, 20)
122+
# creating a ttk button with a search icon
123+
search_button = ttk.Button(window, image=logo, style='TButton', command=search_word)
124+
# adding the entry to the canvas
125+
canvas.create_window(468, 110, window=search_button)
126+
# loading the icon
127+
audio_icon = PhotoImage(file='speaker.png')
128+
# creates dimensions of the logo
129+
icon = audio_icon.subsample(10, 10)
130+
word_label = ttk.Label(window, style='small_label_style.TLabel')
131+
# adding the label to the canvas
132+
canvas.create_window(80, 145, window=word_label)
133+
# creating another ttk button with a speaker icon
134+
audio_button = ttk.Button(window, image=icon, style='TButton', state=DISABLED)
135+
# adding the entry to the canvas
136+
canvas.create_window(25, 190, window=audio_button)
137+
# creating the text field
138+
text_field = Text(window, height=15, width=60)
139+
# adding the text field to the canvas
140+
canvas.create_window(248, 340, window=text_field)
141+
# runs the window infinitely
142+
window.mainloop()
172 KB
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
PyDictionary
2+
pyttsx3
12.7 KB
Loading
2.98 KB
Loading

0 commit comments

Comments
 (0)