2017-02-21 108 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整合,但現在我知道了。 :) –