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