如何等待用户按下输入
我有一个值需要转换为str(),然后int()在用户输入并按回车后。它不停地尝试没有转换的用户输入尚未发生:如何等待用户按下输入
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()
root.mainloop()
是不会等待的代码,你不应该添加一个明确的等待。
GUI程序的工作方式是您设置绑定将用户操作链接到函数。例如,如果您想在用户按下回车键时执行某些操作,则可以为用户按下Enter键时调用函数<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
STR(年) `。你不应该同时在一行上创建这个小部件并且调用
pack
。不需要保持对小部件的引用(如在您的原始代码中),如果您需要保留引用,它将不起作用。原因是在Python中,x=y().z()
给出的值为z()
到x
,因此spinbox = Spinbox(...).pack()
将spinbox
的值设置为pack()
的结果,其总是None
。
这是一个完整的工作示例,虽然我已经修改了它稍微坚持最佳实践(分组到pack
通话在一起,不是做通配符进口,固定信息框的不正确使用):
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,并且随着tkinter添加常规命令而玩弄。不知道它如何与tkinter整合,但现在我知道了。 :) –
你的问题是关于'tkinter'吧?否则你可以做'input()',但是在GUI上下文中会很糟糕。 –
tkinter的'mainloop()'处理了按键。您需要编写事件处理代码来完成您需要的转换,并将该代码附加到所涉及的窗口小部件 - 通常通过向窗口小部件的构造函数添加一个'command = my_function'关键字参数。 – martineau