我有一个值,需要在用户输入后转换为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()
答案 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)
注意:
要使用StringVar
的值,您必须在实例上调用get
(例如:year.get()) rather than calling
str(year)`。
您不应该创建窗口小部件并在一行上调用pack
。虽然当您不需要保留对小部件的引用(如在原始代码中)时它是无害的,但如果您需要保留引用,它将无法工作。原因是在python中,x=y().z()
将z()
的值赋给x
,因此spinbox = Spinbox(...).pack()
将spinbox
的值设置为{{1}的结果}}始终为pack()
。
这是一个完整的工作示例,虽然我已稍微修改它以遵守最佳做法(将调用分组到None
,而不是进行通配符导入,修复错误使用的消息框):
pack