2017-02-21 11 views
-1

ユーザーが入力してEnterキーを押した後に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

あなたの質問は 'tkinter'権利についてですか?そうでなければ 'input()'を実行することができますが、GUIコンテキストではそれは悪いでしょう。 –

+1

tkinterの 'mainloop()'がkeypressesを処理しました。ウィジェットのコンストラクタに 'command = my_function'キーワード引数を追加することで、必要な変換を行うイベント処理コードを記述し、そのコードをウィジェットにアタッチする必要があります。 – martineau

答えて

0

root.mainloop()は、明示的な待機を待機追加してはならないんコードです。

GUIプログラムの動作方法は、ユーザー操作を機能にリンクするバインドバインディングを設定することです。たとえば、ユーザーがEnterキーを押したときに何かしたい場合は、<Return>のバインディングを設定します。このバインディングは、ユーザーがenterキーを押したときに関数を呼び出します。例えば

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. はあなたが例えば(インスタンス上でgetを呼び出す必要がありますStringVarの値を使用するには:年(year.get()) rather than calling STR) `。

  2. あなたはウィジェットを作成して、1行にpackを呼び出すべきではありません。 (元のコードのように)ウィジェットへの参照を保持する必要がないため、参照を保持する必要がある場合は機能しません。その理由は、Pythonではx=y().z()z()の値にxを与えるため、の値はspinboxの値をのpack()の結果に設定するからです。私はベストプラクティス(メッセージボックスの間違った使い方を固定し、ワイルドカードのインポートを行っていない、一緒に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とどのように統合されたのか分かりませんでしたが、今私はそうしています。 :) –

関連する問題