如何等待用户按Enter键

时间:2017-02-21 21:33:47

标签: python tkinter

我有一个值,需要在用户输入后转换为str()然后转换为int()并按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()

1 个答案:

答案 0 :(得分:0)

root.mainloop()是等待的代码,您不应该添加明确的等待。

GUI程序的工作方式是设置 bindings ,将用户操作链接到函数。例如,如果您想在用户按下回车键时执行某些操作,则为<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 str(year)`。

  2. 您不应该创建窗口小部件并在一行上调用pack。虽然当您不需要保留对小部件的引用(如在原始代码中)时它是无害的,但如果您需要保留引用,它将无法工作。原因是在python中,x=y().z()z()的值赋给x,因此spinbox = Spinbox(...).pack()spinbox的值设置为{{1}的结果}}始终为pack()

  3. 这是一个完整的工作示例,虽然我已稍微修改它以遵守最佳做法(将调用分组到None,而不是进行通配符导入,修复错误使用的消息框):

    pack