Необходимо подтвердить ввод имени веса и роста записи - PullRequest
0 голосов
/ 04 апреля 2020

https://github.com/Rodneyst/lv100roxas-gmail.com/blob/master/finalproject

Полный код можно посмотреть здесь. Ссылка идет на полный код, я перетаскиваю все ответы одной кнопкой, используя stringvar. Пожалуйста, ответьте, у меня осталось 2 дня, и мне не повезло.

# Username widget
    self.prompt_label5 = tkinter.Label(self.top_frame,
                text='Enter your Name:' ,bg="red", fg="yellow", font="none 12 bold")            

    self.name_entry = tkinter.Entry(self.top_frame,
                                    width=10)
# weight widget
    self.prompt_label1 = tkinter.Label(self.top_frame,
                text='Enter your weight(lbs):' ,bg="red", fg="yellow", font="none 12 bold")            

    self.weight_entry = tkinter.Entry(self.top_frame,
                                    width=10)

def getworkout(self):

    weight = float(self.weight_entry.get())

    height = float(self.height_entry.get())

Как бы я проверил эти пользовательские данные? Пожалуйста, помогите - я не могу понять это. Я хочу, чтобы всплывающее окно показывалось, когда пользователь вводит целое число для name и когда он вводит строку для weight и height, ValueErrors. Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Код неопрятен, так что сделайте так, чтобы он выглядел лучше :) Но я думаю, что это так, о чем вы спрашивали. Я отредактировал это в спешке. Имя также принимает больше знаков, чем просто буквы (исключая целые числа) - это легко проверить, если это необходимо.

import tkinter
from tkinter import ttk
from tkinter import messagebox

import random


# GUI

class WorkoutGUI:
    def __init__(self):
        # Main window
        self.main_window = tkinter.Tk()
        self.main_window.title("Workout Generator")
        self.main_window.geometry('1200x600')

        # Frames
        self.top_frame = tkinter.Frame()
        self.mid_frame = tkinter.Frame()
        self.bottom_frame = tkinter.Frame()

        validation1 = self.top_frame.register(entry_validation_1)
        validation2 = self.top_frame.register(entry_validation_2)

        # TOP FRAME
        # username widget
        self.prompt_label1 = tkinter.Label(self.top_frame,
                                           text='Enter your Name:', bg="red", fg="yellow", font="none 12 bold")

        self.name_entry = tkinter.Entry(self.top_frame,
                                        width=10, validate='key', validatecommand=(validation1, '%S'))
        # weight widget
        self.prompt_label2 = tkinter.Label(self.top_frame,
                                           text='Enter your weight(lbs):', bg="red", fg="yellow", font="none 12 bold")

        self.weight_entry = tkinter.Entry(self.top_frame,
                                          width=10, validate='key', validatecommand=(validation2, '%S'))
        # height widget
        self.prompt_label3 = tkinter.Label(self.top_frame,
                                           text='Enter your height(in):', bg="red", fg="yellow",
                                           font="none 12 bold")

        self.height_entry = tkinter.Entry(self.top_frame,
                                          width=10, validate='key', validatecommand=(validation2, '%S'))
        # gender widget
        self.prompt_label4 = tkinter.Label(self.top_frame,
                                           text='Select your gender:', bg="red", fg="yellow",
                                           font="none 12 bold")

        self.gender_entry = tkinter.IntVar()

        self.gender_entry.set(1)

        # radio buttons for gender choice
        self.rb1 = tkinter.Radiobutton(self.top_frame,
                                       text='Male',
                                       variable=self.gender_entry,
                                       value=1)
        self.rb2 = tkinter.Radiobutton(self.top_frame,
                                       text='Female',
                                       variable=self.gender_entry,
                                       value=2)

        # goal widget
        self.prompt_label5 = tkinter.Label(self.top_frame,
                                           text='Select your goal:', bg="red", fg="yellow",
                                           font="none 12 bold")

        self.goal_entry = tkinter.IntVar()

        self.goal_entry.set(1)

        # radio buttons for goal choice
        self.rb3 = tkinter.Radiobutton(self.top_frame,
                                       text='Lose Weight',
                                       variable=self.goal_entry,
                                       value=1)
        self.rb4 = tkinter.Radiobutton(self.top_frame,
                                       text='Maintain',
                                       variable=self.goal_entry,
                                       value=2)
        self.rb5 = tkinter.Radiobutton(self.top_frame,
                                       text='Build Muscle Mass',
                                       variable=self.goal_entry,
                                       value=3)

        # packing widgets
        self.prompt_label1.pack(side='top')
        self.name_entry.pack(side='top')
        self.prompt_label2.pack(side='top')
        self.weight_entry.pack(side='top')
        self.prompt_label3.pack(side='top')
        self.height_entry.pack(side='top')
        self.prompt_label4.pack(side='top')
        self.rb1.pack(side='top')
        self.rb2.pack(side='top')
        self.prompt_label5.pack(side='left')
        self.rb3.pack(side='left')
        self.rb4.pack(side='left')
        self.rb5.pack(side='left')

        # MIDDLE FRAME

        self.descr_label = tkinter.Label(self.mid_frame,
                                         text='Workout for you:')

        self.value = tkinter.StringVar()

        self.workout_label = tkinter.Label(self.mid_frame,
                                           textvariable=self.value,
                                           width=250, height=20, bg="white")
        # packing widgets

        self.descr_label.pack(side='top')
        self.workout_label.pack(side='bottom')

        # BOTTOM FRAME
        # buttons
        self.display_button = tkinter.Button(self.bottom_frame,
                                             text='Get Workout!',
                                             command=self.getworkout)

        self.quit_button = tkinter.Button(self.bottom_frame,
                                          text='Quit',
                                          command=self.main_window.destroy)

        # pack the buttons
        self.display_button.pack(side='left')
        self.quit_button.pack(side='right')

        # packing frames
        self.top_frame.pack()
        self.mid_frame.pack()
        self.bottom_frame.pack()

    # fucnction to get outputs

    def getworkout(self):
        # Gather User information
        name = str(self.name_entry.get())
        gymSerial = random.randint(0, 10000)

        weight = float(self.weight_entry.get())

        height = float(self.height_entry.get())

        gender = (self.gender_entry.get())

        goal = (self.goal_entry.get())


def entry_validation_1(x):
    if x.isdecimal():
        messagebox.showwarning("Wrong input!", "Name must be a string - not integer.")
        return False
    else:
        return True


def entry_validation_2(y):
    if y.isdecimal():
        return True
    else:
        messagebox.showwarning("Wrong input!", "Weight and height must be a numerical value - not string")
        return False


def main():

    root = tkinter.Tk()
    ex = WorkoutGUI()
    root.mainloop()



if __name__ == '__main__':
    main()
0 голосов
/ 04 апреля 2020

Ссылка не работает, но я написал собственный код в качестве примера. Я думаю, что это очень близко к тому, что вам нужно. Этот метод называется проверкой записи, и вы можете найти дополнительную информацию здесь:

https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/entry-validation.html

Не стесняйтесь спрашивать, если у вас есть какие-либо вопросы:)

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox

# tkinter main window
root = tk.Tk()
root.title('Validation')
root.geometry('300x300')


def entry_validation_1(x):
    if x.isdecimal():
        messagebox.showwarning("Wrong input!", "Name must be a string - not integer.")
        return False
    else:
        return True


def entry_validation_2(y):
    if y.isdecimal():
        return True
    else:
        messagebox.showwarning("Wrong input!", "Weight and height must be a numerical value - not string")
        return False


validation1 = root.register(entry_validation_1)
validation2 = root.register(entry_validation_2)

name = tk.Entry(root, width='9', justify='center', validate='key', validatecommand=(validation1, '%S'))
weight_or_height = tk.Entry(root, width='9', justify='center', validate='key', validatecommand=(validation2, '%S'))
label_name = tk.Label(root, text='name - INTEGER NOT ACCEPTED')
label_weight_or_height = tk.Label(root, text='weight or height - STRING NOT ACCEPTED')


name.grid(row=0, column=0, padx=0, pady=0)
label_name.grid(row=0, column=1, padx=0, pady=0)
weight_or_height.grid(row=1, column=0, padx=0, pady=0)
label_weight_or_height.grid(row=1, column=1, padx=0, pady=0)

tk.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...