2017-02-21 10 views
-1

У меня есть значение, которое необходимо преобразовать в str(), а затем int() после ввода пользователем и нажмите enter. Он продолжает пытаться не конвертировать ничего, как пользовательский ввод еще не произошло:Как подождать пользователя нажать enter

from tkinter import * 
from tkinter import ttk 
root = Tk() 

month = StringVar() 
combobox = ttk.Combobox(root, textvariable = month) 
combobox.pack() 
combobox.config(values = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')) 
year = StringVar() 
Spinbox(root, from_ = 1990, to = 2014, textvariable = year).pack() 
yearstr = str(year) 
yearcheck = int(yearstr) 
if yearcheck >= 1990 and yearcheck < 2014: 
    tkMessageBox.SelectedDate("Date Selector", "The date you have selected is ", str(month), ", ", str(year)) 
else: 
    tkMessageBox.DateError("Date Selector", "Year must be 1990-2014") 

root.mainloop() 
+0

Ваш вопрос о 'tkinter' праве? иначе вы могли бы использовать 'input()', но в графическом интерфейсе, который был бы плохим. –

+1

tkinter 'mainloop()' обработанные нажатия клавиш. Вам нужно написать код обработки событий, который делает необходимые вам преобразования, и прикрепить этот код к связанным виджетам - обычно, добавив аргумент ключевого слова 'command = my_function' в конструктор виджета. – martineau

ответ

0

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) 

Примечание:

  1. Чтобы использовать значение StringVar вы должны вызвать get на экземпляре (например: year.get() ) rather than calling ул (год) `

  2. Вы не должны создавать виджет и звонить 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() 
+0

Спасибо всем. Очень полезно, я все еще изучаю tkinter и играл с добавлением регулярных команд с tkinter. Не знал, как он интегрируется с tkinter, но теперь я это делаю. :) –