Как использовать мою проверку в среде tkinter? - PullRequest
0 голосов
/ 09 января 2019
from tkinter import *
window = Tk()
window.title("Registration")
window.configure(background="blue")enter code here

Label (window, text= "Firstname: ", bg="blue", fg="white", font="verdana 12 bold") .grid(row=0, sticky=E)
firstname = Entry(window, width=100, bg="white")
firstname.grid(row=0, column=1, sticky=W)
firstname = firstname.get()
firstname = firstname.strip()
firstname = firstname.lower()

Label (window, bg = "blue") .grid(row=2)

Label (window, text= "Surname: ", bg="blue", fg="white", font="verdana 12 bold") .grid(row=3, sticky=E)
surname = Entry(window, width=100, bg="white")
surname.grid(row=3, column=1, sticky=W)
surname = surname.get()
surname = surname.lower()
surname = surname.strip()

Label (window, bg = "blue") .grid(row=4)

Label (window, text = "Pick a number between 0 and 10: ", bg="blue", fg="white", font = "verdana 12 bold") .grid(row=5, sticky=E)
number = Entry(window, width=100, bg="white")
number.grid(row=5, column=1)
while True:
        try:
            number = number.get()
            if (number > 10) or (number < 0): 1/0
        except:
            print("Sorry, your response must be a number between 0 and 10")
            continue
        break

window.mainloop()

Пока это мой код. Я пытаюсь создать систему регистрации для викторины, которую я делаю, однако теперь, когда я имею дело с GUI, я не знаю, как использовать мой код проверки в способе / среде GUI. например, просто «print (« извините, ваш ответ должен быть числом от 0 до 10 »)» не будет и не работает с моей программой. Мой вопрос: как вывести сообщение в текстовое поле, например, сообщение об ошибке, и как мне внедрить код проверки? Кроме того, я сделал свой проверочный код один раз назад, когда я был новичком в python, и использовал фрагмент кода переполнения стека, чтобы помочь применить его к моей программе. В любом случае, может кто-нибудь помочь объяснить, как на самом деле работает этот код. Кажется, я не понимаю этого сейчас, и мой учитель изо всех сил пытался объяснить это понятным способом. Конкретно: 1/0 бит. Я не привык использовать try и кроме, я знаю только, как использовать циклы for и while. Большое спасибо

1 Ответ

0 голосов
/ 09 января 2019

Отображение сообщений в tkinter (1-й вопрос)

Чтобы показать пользователю основные виды массажа и получить базовые параметры (показать ошибку, спросить OK / Отмена или да / нет ...), вы можете использовать tkinter.messagebox. Он обеспечивает функции show*() и ask*(). В вашем случае showerror() или showwarning(), вероятно, лучше.

Чтобы получить базовый ввод, можно использовать tkinter.simpledialog. Он предоставляет функции askinteger, askfloat и askstring, которые запрашивают у пользователя соответствующий тип данных.

Чтобы получить ввод файла (пути), используйте tkinter.filadialog.

Для более сложных ситуаций лучше всего использовать виджет tkinter.Toplevel.

2-й вопрос

Ваш код

Я собираюсь сыграть переводчика и просмотреть ваш код. Если вы просто хотите решения ( не рекомендуется), перейдите ниже.

firstname = Entry(...)  => create an Entry widget and assign it to firstname  
firstname.grid(...) => put the widget in/on the window
firstname = firstname.get() => get the text currently in the widget and assign it to firstname.

ОК, вы хотите получить текст. Просто окно еще даже не видно. Эти инструкции будут работать в оболочке IDLE, потому что особых причин , и вы ждете, чтобы позвонить .get(), пока не введете свое имя. В «реальном» исполнении интерпретатор не будет ждать, и ваш пользователь не сможет набрать (потому что нет окна), прежде чем вы вызовете .mainloop(). Одним из решений, если вы читаете выше, является использование simpledialog. Но также он должен запускаться после запуска графического интерфейса, то есть после вызова .mainloop(). Я вернусь к этой части позже.

- то же самое для фамилии -

Ваша проверка

Переводчик:

number = Entry(...) => create a new Entry widget and assign it to number
number.grid(...) => show it
# while True here
# try here
number = number.get() => call number.get() and assign the value (a str) to number -- keep that in mind
# if condidtion below
number > 10 => check if a str is larger/greater than an int; can't do that, raise a TypeError
# error -> go to the except
print("I asked how to do this on SO") => show this (in the console); in future hopefully via messagebox
continue => go to the beginning of the loop
# in try
number = number.get() => call the .get() method of the str number; can't find it, raise an AttributeError
# error -> go to the except
print(...) => as before
continue => as before

Вы попали в бесконечный цикл исключений, который не остановится, даже если пользователь введет правильный номер (что в любом случае не может произойти, у нас пока нет окна). Это очень веская причина, чтобы избегать голых except - вы также поймаете много вещей, которые вам не нужны.

Почему метод, который вы пытаетесь использовать, wooooould работает (вы сказали, что нашли его здесь - у вас все еще есть ссылка или помните название?):

Код (этот пример в консоли для простоты):

while True:
    try:
        value = int(input())
        if not 0<value<10:
            1/0
    except ZeroDivisionError:  # let ValueError through (you willl want to catch it separately)
        print('by executing 1/0, I raised a ZeroDivisionError. This code therefore will execute.')
    else:
        print('Everything did fine. I will exit the loop to continue.')
        break

Переводчик:

# loop
# in try
value = int(input()) => read input and try to convert to an int; we assume this doesn't fail.
# if condition
not 0<value<10 => is value not between 0 and 10? (we assume it isn't)
# if block
1/0 => what?!? I can't do that, I'll raise a ZeroDivisionError
# except block
print(...) => show the text
# loop again
# in try
value = int(input()) => as above
# if condition
not 0<value<10 => we assume value is between 0 and 10 (evaluetes to False)
# else part of the try...except...else
print(...) => show text
break => exit the loop

Вы намеренно выполняете 1/0, что поднимает ZeroDivisionError и действуете в соответствии с except. Поскольку вы сказали, что обычно не делаете этого, я рекомендую вам попытаться понять, что он делает.

Как это сделать лучше

  1. Сделайте так, чтобы окно появилось до , ожидая пользовательский ввод: поместите весь код, который должен выполняться при запуске приложения, в функцию и либо задержите его с помощью tkinter.Tk.after (window.after), либо добавьте приятное «Пуск! " Кнопка.
  2. Не используйте (ab) исключения, когда будет делать простой if (если вы действительно хотите (выпендриваться), определите свое собственное class MyFancyException(Exception): pass)
  3. Найдите концепции, которые вы не понимаете , прежде чем используйте их, и вставьте комментарии, чтобы напомнить вам, если что-то настолько сложно, что вы боитесь, что не вспомните позже.

.

import tkinter as tk
from tkinter.simpledialog import askstring, askinteger
from tkinter.messagebox import showwarning


def do_stuff(first_name, surname, number):
    ...


def start():
    # if you want to use Entry, add a "Submit" Button
    first_name = askstring('Title', 'first name:')
    surname = askstring('Title', 'last name:')

    while True:        # ask* return None when cancel is pressed
        number = askinteger('Title', 'insert a number between 0 and 10:')
        if number is not None and 0<number<10:  # what we want
            break
    do_stuff(first_name, surname, number)


# GUI preparation code
window = tk.Tk()
button_start = tk.Button(window, text='Start!', command=start)
button_start.pack()  # for use with other widgets (that use grid), you must .grid() here
window.mainloop()  # the GUI appears at this moment
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...