2016-12-07 19 views
1

フォーラムでは最近、@Clueless_captainによる質問が投稿されました。 @furasによって答えられました。私はstackoverflowに新しいので、私はその会話にコメントすることはできません。これはその会話のURLです(Tkinter Entry widget stays empty in larger programs (Python 2))。 furasによってポストされたコードは私がやろうとしているものではありませんが、自分でできないのは、EntryWidgetで与えられたInputを再利用する方法を見つけることだけです。私は、furasによって書かれたコードを修正しました。私の目標は、GUIが終了する前に入力が印刷されるということでした。そのためにReturnキーを新しいFunctionにバインドしました。このFunctionは、この新しいFunctionでTextstringを取得してさらに処理することになっていました。これは、ボタンをクリックして2回目の名前を取得したときにのみ行います。このコードの順序はオフですか?問題は10行目の文字列 'e.bind'と密接に関連していますが、私は問題を見つけることができません。TKinter:TopLevel()のEntry-Widgetからの入力を再利用する


よろしく、G_Lehmann

----------変更したコード:


from Tkinter import * 

def get_input(text, variable): 
    win = Toplevel() 
    win.title("Get value") 

    f = LabelFrame(win, text=text) 
    f.pack() 

    e = Entry(win, textvariable=variable) 
    e.bind("<Return>", do_more(text, variable, e)) 
    e.pack(side="right") 
    #I tried e.bind here, but This had no Effect. 

    b = Button(win, text = "Cancel", command=win.destroy) 
    b.pack() 
#do_more is the new Function I want to use to process the Variable 'data' further. 
def do_more(text, variable, e): 
    data = e.get() 
    print data 
    print len(data) 
    print type(data) 

def get_value(text, variable): 
    get_input(text, variable) 

# --- main -- 

root = Tk() 
root.title("Ask-name-SUB") 

# global variables 
var_name = StringVar() 
var_address = StringVar() 

b = Button(root, text="Enter your name", command=lambda: get_value("Your name:", var_name)) 
b.pack() 

b = Button(root, text="Enter your address", command=lambda: get_value("Your address:", var_address)) 
b.pack() 

b = Button(root, text="Cancel", command=root.destroy) 
b.pack() 

root.mainloop() 

# --- after -- (My Edit: I disabled this as I want to bind the Variables before my GUI gets terminated) 
""" 
name = var_name.get() 
print "Print name, its length, its type" 
print name, len(name), type(name) 

address = var_address.get() 
print "Print address, its length, its type" 
print address, len(address), type(address) 
""" 
+0

あなたの質問は少し不明です。あなたが解決しようとしている本当の問題は何ですか?ユーザーに文字列の入力を要求する関数を呼び出すことができ、その関数を構成可能にしたい(つまり、 "Your name"または "Your address"を渡す)必要がありますか?また、あなたの実際の目的は情報を印刷することだけですか、または説明の目的のために 'mainloop'の後の印刷ステートメントですか?ほとんどのGUIは 'mainloop'の後にコードを持つべきではありません。 –

+0

'bind'(' command = 'と似ています)は関数名を必要とします - それは'() 'と引数なしであることを意味します。あなたは 'lambda'を使って引数' e.bind( ""、lambda:do_more(text、variable、e))を割り当てできます。 – furas

+0

BTW:2番目のボタンを作成できます。 '' OK '' - このボタンに関数を割り当て、ウィンドウを閉じる前に何かをします。 – furas

答えて

0

bindは(command=のように)関数名を想定していますので、関数を引数で割り当てるには、lambdaを使用しなければなりません。引数eventでbind execute関数のほかに、それを受け取る必要があります。

e.bind("<Return>", lambda event:do_more(variable)) 

あなたはボタンあまりに

b = Button(win, text="OK", command=lambda:do_more(variable)) 

do_moreを割り当てることができますし、Returnとし、Buttonと同じことを行う - とウィンドウを閉じるには、後の変数で何かを。

ウィンドウを閉じた後でもget_valueでも同じことができますが、通常はtkinterがウィンドウを作成し、閉じるまで待たないので、win.wait_window()を使用する必要があります。

だから、価値のある何かをする可能性があります。do_moreまたはget_valueで選択してください。どちらの方法も変更可能です。クラスを使用して独自のダイアログウィンドウを作成することができます。

from Tkinter import * 

# --- --- 

# global variable to use in different functions 
win = None 

def get_input(text, variable): 
    global win # inform function to use global variable `win` to assign value 

    win = Toplevel() 
    win.title("Get value") 

    f = LabelFrame(win, text=text) 
    f.pack() 

    # use `f` instead of `win` to put inside LabelFrame 
    e = Entry(f, textvariable=variable) 
    e.pack()#side="right") 

    e.bind("<Return>", lambda event:do_more(variable)) 

    b = Button(win, text="OK", command=lambda:do_more(variable)) 
    b.pack() 

def do_more(variable): 
    data = variable.get() 
    print 'do_more:', data, len(data), type(data) 
    win.destroy() 

# --- --- 

def get_value(text, variable): 
    # create window 
    get_input(text, variable) 

    # this code is executed directly after creating window, not after closing window 
    # so code has to wait till window is closed 
    win.wait_window() 

    data = variable.get() 
    print 'get_value:', data, len(data), type(data) 

# --- main -- 

root = Tk() 
root.title("Ask-name-SUB") 

# global variables 
var_name = StringVar() 
var_address = StringVar() 

b = Button(root, text="Enter your name", command=lambda:get_value("Your name:", var_name)) 
b.pack() 

b = Button(root, text="Enter your address", command=lambda:get_value("Your address:", var_address)) 
b.pack() 

b = Button(root, text="Cancel", command=root.destroy) 
b.pack() 

root.mainloop() 
+0

私が使ったprintステートメントはイラストレーションのためのものでした。実際のプログラムは、おそらくAnnagramsについての9yearoldsのTextgameになります(The Kidsはまだクラスプロジェクトを考えています)。これは簡単なパートです。私は既にPythonを学んでいます。私はInterfaceを作ったことがないし、もっと時間がかかることを期待しています...私はあなたのコードを試しました。あなたの時間と説明をありがとう。最高のG_Lehmannに感謝します。 –

関連する問題