Reputation: 31
I'm creating a program that allows the user to select a category and enter a value to calculate a charge. I would like to validate the text entry using my own validation file. However, when I run the program and enter nothing in the text entry, the error window keeps popping up over and over again. In addition, when I run the program and enter a valid number in the entry field, the charge comes out to 0.0, even though I have defined the calculation for the total charge.
Here is the program:
import tkinter
import tkinter.messagebox
import ValidationFile
validationObject = ValidationFile.ValidationClass ()
class MyGUI:
def __init__ (self):
self.main_window = tkinter.Tk ()
self.top_frame = tkinter.Frame (self.main_window)
self.middle_frame = tkinter.Frame (self.main_window)
self.bottom_frame = tkinter.Frame (self.main_window)
self.phone_var = tkinter.IntVar ()
self.phone_var.set (1)
self.pb1 = tkinter.Radiobutton (self.top_frame, \
text = 'Daytime (6:00 AM - 5:59 PM)', variable = self.phone_var, \
value = 0.12)
self.pb2 = tkinter.Radiobutton (self.top_frame, \
text = 'Evening (6:00 PM - 11:59 PM)', variable = self.phone_var, \
value = 0.07)
self.pb3 = tkinter.Radiobutton (self.top_frame, \
text = 'Off-Peak (Midnight - 5:50 AM)', variable = self.phone_var, \
value = 0.05)
#pack phone buttons
self.pb1.pack ()
self.pb2.pack ()
self.pb3.pack ()
#create input and output buttons
self.txtInput = tkinter.Entry (self.middle_frame, \
width = 10)
self.value = tkinter.StringVar ()
self.lblOutput = tkinter.Label (self.middle_frame, \
width = 10, textvariable = self.value)
self.txtInput.pack()
self.lblOutput.pack ()
#create OK buton and QUIT button
self.ok_button = tkinter.Button (self.bottom_frame, \
text = 'OK', command = self.show_choice)
self.quit_button = tkinter.Button (self.bottom_frame, \
text = 'QUIT', command = self.main_window.destroy)
#pack the buttons
self.ok_button.pack (side = 'left')
self.quit_button.pack (side = 'left')
#pack the frames
self.top_frame.pack ()
self.middle_frame.pack ()
self.bottom_frame.pack ()
#start the mainloop
tkinter.mainloop ()
def show_choice (self):
choice = self.phone_var.get ()
value = -1
while value == -1:
valueEntry = self.txtInput.get()
if valueEntry == '':
value = -1
tkinter.messagebox.showinfo (title = 'ERROR', \
message = 'Please enter a valid number.')
else:
value = validationObject.checkFloat (valueEntry)
total = choice * value
self.value.set (total)
#create instance of MyGUI class
my_GUI = MyGUI ()
Here is the validation file:
#create validation class
class ValidationClass:
def checkFloat (self, inputString):
try:
result = float (inputString)
except Exception:
return -1
if result < 0:
return -1
else:
return result
def checkInteger (self, inputString):
try:
result = int (inputString)
except Exception:
return -1
if result < 0:
return -1
else:
return result
Upvotes: 0
Views: 850
Reputation: 13729
You made an infinite loop with while value == -1:
. Nowhere in that loop do you pause to allow the user to try again. You don't need the loop at all:
def show_choice (self):
valueEntry = self.txtInput.get()
value = validationObject.checkFloat(valueEntry)
if value == -1:
tkinter.messagebox.showinfo (title = 'ERROR', \
message = 'Please enter a valid number.')
else:
choice = self.phone_var.get()
total = choice * value
self.value.set (total)
Once you fix that you will have another problem: you use float values in your options but the variable is an IntVar, which can only handle integers. So "choice" will always be 0. You need to use DoubleVar instead.
Upvotes: 1