2016-12-03 8 views
-1

ボタンをクリックした後、ユーザが名前を尋ねられた後にプログラムを続けるプログラムを作りたいと思います。私はポップアップにポップアップで入力されたテキスト文字列を返すようにしています。最初は私のコードだと思っていましたが、名前を尋ねて印刷し、長さとタイプを印刷する第2のプログラムを作ることにしました。その2番目のプログラムでは、すべてが正常に動作します。最初の(より大きい)プログラムではなぜそうでないのかを理解するのは非常に苦労しています。私はすでに(Why is Tkinter Entry's get function returning nothing?)を読んでいて、私の機能が私の.mainloopの後に現れても、それはまだ動作しません。私が絶対に何も知っていることではないクラスを使用して提案する同じスレッドで。可能であれば、私の大きなプログラムで何が欠けているのか誰かが指摘できますか?Tkinterのエントリウィジェットは大きなプログラムでは空のままです(Python 2)


大きなプログラム


from Tkinter import * 

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

def getname(usertype): 
    getname = Tk() 
    getname.title("Get name popup") 
    def abort(): 
     getname.destroy() 
    name = StringVar() 
    c = LabelFrame(getname, text = "Your name:") 
    c.pack() 
    d = Entry(getname, textvariable=name) 
    d.pack(side="right") 
    d.bind("<Return>", lambda event: getname.destroy()) 
    e = Button(getname, text = "Cancel", command=lambda: abort()) 
    e.pack() 

    getname.mainloop() 
    name = (name.get()) 
    print "Print name, its length, its type" 
    print name 
    print len(name) 
    print type(name) 

top = Frame(root) 
top.pack(side="top") 
bottom = Frame(root) 
bottom.pack(side="bottom") 
def killit(): 
    root.destroy() 

cancel = Button (bottom, text = "Cancel", command=lambda: killit()) 
cancel.pack() 
askname = Button (top, text = "Enter your name", command=lambda: getname("testuser")) 
askname.pack() 
root.mainloop() 

小さなプログラム


from Tkinter import * 

def getname(usertype): 
    getname = Tk() 
    getname.title("Get name popup") 
    def abort(): 
     getname.destroy() 
    name = StringVar() 
    c = LabelFrame(getname, text = "Your name:") 
    c.pack() 
    d = Entry(getname, textvariable=name) 
    d.pack(side="right") 
    d.bind("<Return>", lambda event: getname.destroy()) 
    e = Button(getname, text = "Cancel", command=lambda: abort()) 
    e.pack() 

    getname.mainloop() 
    name = (name.get()) 
    print "Print name, its length, its type" 
    print name 
    print len(name) 
    print type(name) 


getname("testuser") 
+0

大きなプログラムは私のために動作しません - あなたが関数' getname'を定義し、あなたが持っていると思うので、あなたがウィジェットでそれを使用する 'のgetName = Tkの()'しかし、それはあります違います。 – furas

+0

ところで:メインウィンドウだけを作るのに 'Tk()'を使います。もしあなたがポップアップ/ダイアログウィンドウを必要とするなら、 'Toplevel()'を使用してください。 – furas

+0

BTW:おそらくあなたの大きなプログラムは間違ったインデントを持っていますが、プログラムは 'mainloop()'(そして 'Tk – furas

答えて

0

私はあなたの大きなプログラムを実行することができません - おそらく間違ってインデントがあります。そして、それはあなたの問題になる可能性があります -

  • プログラムは一つだけmainloop()を持っている必要があります。

    は、私は2つの問題を参照してください。

  • メインウィンドウの作成にはTk()を使用し、その他のウィンドウの作成にはToplevel()を使用します。

さらに、ファンクション名と第2のウィンドウインスタンスとして名前getnameを使用すると、非常に誤解を招きます。

名前を保持するためにグローバルvar_nameを作成し、後で機能内で使用します。

from Tkinter import * 

def get_name(usertype): 

    win = Toplevel() 
    win.title("Get name popup") 

    f = LabelFrame(win, text = "Your name:") 
    f.pack() 

    # use global `name` which was created outside function 
    e = Entry(win, textvariable=var_name) 
    e.pack(side="right") 
    e.bind("<Return>", lambda event: win.destroy()) 

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

# --- main -- 

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

# global variable 
var_name = StringVar() 

b = Button(root, text="Enter your name", command=lambda: get_name("testuser")) 
b.pack() 

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

root.mainloop() 

# --- after -- 
name = var_name.get() 
print "Print name, its length, its type" 
print name, len(name), type(name) 

EDIT:

には、あなたが引数を使用することができますポップアップウィンドウがより普遍的になり - 結果について表示されるテキストと変数を。

def get_value(text, variable): 

とし、異なるテキストと異なる変数で使用することができます。名前または住所のために。名前 `getname`と混乱するので

from Tkinter import * 

def get_value(text, variable): 

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

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

    e = Entry(win, textvariable=variable) 
    e.pack(side="right") 
    e.bind("<Return>", lambda event: win.destroy()) 

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

# --- 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 -- 

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

Furasさん、本当にありがとうございました。それを徹底的に理解するのにはしばらく時間がかかりましたが、今は私がやっていると思います! –

関連する問題