Home > Mobile >  Validation python, Using GUI
Validation python, Using GUI

Time:12-03

I am attempting to validate the text box field so that the user can only insert integers, although i have used a while loop to attempt and cannot figure it out I keep getting errors. Please help.

from tkinter import *
import tkinter as tk
from tkinter.tix import *


# setup the UI 
root = Tk()

# Give the UI a title
root.title("Distance converter Miles to Kilometers")
# set window geometry
root.geometry("480x130")
# setup the buttons
valRadio = tk.IntVar()
myText=tk.StringVar()
e1 =tk.IntVar()

def calculate(*arg):
    while True:
        try:
            if valRadio.get() == 1:
# get the miles ( Calculation )
                res = round(float(e1.get()) / 1.6093,2) 
# set the result text
                myText.set( "Your input converts to "   str(res)   " Miles")
                break
            if valRadio.get() == 2:
# get the kilometeres
                res = round(float(e1.get()) * 1.6093,2)
# set the result text
                myText.set( "Your input converts to "   str(res)   " Kilometers")
                break
            if ValueError:
                myText.set ("Please check selections, only Integers are allowed")
                break
            else:
# print error message
                res = round(float(e1.get()) / 1.6093,2)
                myText.set ("Please check selections, a field cannot be empty")
                break
        except ValueError:
            myText.set ("Please check selections, a field cannot be empty")
            break
    
# Set the label for Instructions and how to use the calculator
instructions = Label(root, text="""Hover me:""")
instructions.grid(row=0, column=1)

# set the label to determine the distance field
conversion = tk.Label( text=" Value to be converted :" )
conversion.grid(row=1,column = 0,)

# set the entry box to enable the user to input their distance
tk.Entry(textvariable = e1).grid(row=1, column=1)

#set the label to determine the result of the program and output the users results below it
tk.Label(text = "Result:").grid(row=5,column = 0)
result = tk.Label(text="(result)", textvariable=myText)
result.grid(row=5,column=1)

# the radio button control for Miles
r1 = tk.Radiobutton(text="Miles",
      variable=valRadio, value=1).grid(row=3, column=0)

# the radio button control for Kilometers
r2 = tk.Radiobutton(text="Kilometers",
      variable=valRadio, value=2).grid(row=3, column=2)


# enable a calculate button and decide what it will do as well as wher on the grid it belongs
calculate_button = tk.Button(text="Calculate \n (Enter)", command=calculate)
calculate_button.grid(row=6, column=2)


# deploy the UI
root.mainloop()

I have attempted to use the While loop inside the code although I can only get it to where if the user inputs text and doesn't select a radio button the error will display but I would like to have it where the text box in general will not allow anything but integers and if it receives string print the error as it does if the radio buttons aren't selected.

CodePudding user response:

define validation type and validatecommand. validate = key makes with every key input it runs validatecommand. It only types if that function returns true which is 'validate' function in this case.

vcmd = (root.register(validate), '%P')
tk.Entry(textvariable = e1,validate="key", validatecommand=vcmd).grid(row=1, column=1)

this is the validation function

def validate(input):
    if not input:
        return True
    elif re.fullmatch(r'[0-9]*',input):
        return True
    myText.set("Please check selections, only Integers are allowed")
    return False

it return true only when its full of numbers([0-9]* is an regular expression which defines all numbers) or empty. If it contains any letter it return False any it denied this way.

Also do not forget to imports

import re
  • Related