2017-02-21 117 views
-1

我有一个值需要转换为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() 
+0

你的问题是关于'tkinter'吧?否则你可以做'input()',但是在GUI上下文中会很糟糕。 –

+1

tkinter的'mainloop()'处理了按键。您需要编写事件处理代码来完成您需要的转换,并将该代码附加到所涉及的窗口小部件 - 通常通过向窗口小部件的构造函数添加一个'command = my_function'关键字参数。 – martineau

回答

0

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) 

注:

  1. 要使用StringVar的价值,你必须调用get的实例(如:year.get()) rather than calling STR(年) `。

  2. 你不应该同时在一行上创建这个小部件并且调用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() 
+0

谢谢大家。非常有帮助,我仍然在学习tkinter,并且随着tkinter添加常规命令而玩弄。不知道它如何与tkinter整合,但现在我知道了。 :) –