root.mainloop()
код, который делает ожидание, вы не должны добавить явное ожидание.
Способ работы GUI-программ заключается в том, что вы устанавливаете привязки , которые связывают действия пользователя с функциями. Например, если вы хотите что-то сделать, когда пользователь нажимает клавишу ввода, вы устанавливаете привязку для <Return>
, которая вызывается функцией, когда пользователь нажимает клавишу ввода.
Например:
def handle_enter(event):
<do your validation here>
spinbox = Spinbox(root, from_ = 1990, to = 2014, textvariable = year)
spinbox.pack()
spinbox.bind("<Return>", handle_enter)
Примечание:
Чтобы использовать значение StringVar
вы должны вызвать get
на экземпляре (например: year.get() ) rather than calling
ул (год) `
Вы не должны создавать виджет и звонить pack
на одной строке. Хотя это безопасно, когда вы Не нужно сохранять ссылку на виджет (как в вашем исходном коде), это не сработает, если вам нужно сохранить ссылку. Причина в том, что в python x=y().z()
дает значение z()
по x
, поэтому spinbox = Spinbox(...).pack()
устанавливает значение spinbox
на результат pack()
, который всегда будет None
.
Вот полный рабочий пример, хотя я изменил его немного придерживаться лучших практик (группировка звонков на pack
вместе, не делая импорт подстановочные, фиксируя неправильное использование MessageBox):
import tkinter as tk
from tkinter import messagebox
from tkinter import ttk
def handle_enter(event):
yearstr = year.get()
monthstr = month.get()
yearcheck = int(yearstr)
if yearcheck >= 1990 and yearcheck < 2014:
tk.messagebox.showwarning("Date Selector",
"The date you have selected is %s, %s" % (monthstr, yearstr))
else:
tk.messagebox.showwarning("Date Selector", "Year must be 1990-2014")
root = tk.Tk()
month = tk.StringVar()
year = tk.StringVar()
combobox = ttk.Combobox(root, textvariable = month)
combobox.config(values = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
spinbox = tk.Spinbox(root, from_ = 1990, to = 2014, textvariable = year)
combobox.pack()
spinbox.pack()
spinbox.bind("<Return>", handle_enter)
root.mainloop()
Ваш вопрос о 'tkinter' праве? иначе вы могли бы использовать 'input()', но в графическом интерфейсе, который был бы плохим. –
tkinter 'mainloop()' обработанные нажатия клавиш. Вам нужно написать код обработки событий, который делает необходимые вам преобразования, и прикрепить этот код к связанным виджетам - обычно, добавив аргумент ключевого слова 'command = my_function' в конструктор виджета. – martineau