ボタンをクリックした後、ユーザーに名前を尋ねられた後、プログラムが続行されるプログラムを作成したいと思います。ポップアップに入力されたテキスト文字列をポップアップに返させることに固執しています。最初は自分のコードだと思っていましたが、名前を尋ねて印刷し、長さとタイプを印刷する2番目のプログラムを作成することにしました。その2番目のプログラムでは、すべてが正常に機能します。私はそれが最初の(より大きな)プログラムにない理由を理解するのに非常に苦労しています。私はすでに読んでいます(Tkinter Entryのget関数が何も返さないのはなぜですか?)そして、私の.get()
関数は私の後に発生しますが.mainloop
、それでも機能しません。同じスレッドで、彼らはクラスの使用を提案しています。これは私がまったく知らないことです。可能であれば、私の大きなプログラムに欠けているものを誰かが指摘できますか?
大規模プログラム
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")
私はあなたの大きなプログラムを実行することができません-おそらくあなたは間違ったインデントを持っています。
2つの問題があります。
mainloop()
-そしてそれはあなたの問題になる可能性があります。Tk()
メインウィンドウのToplevel()
作成と他のウィンドウの作成に使用します。さらに、名前getname
を関数名および2番目のウィンドウインスタンスとして使用するため、非常に誤解を招く恐れがあります。
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)
編集:
ポップアップウィンドウをより普遍的にするために、引数(表示されるテキストと結果の変数)を使用できます。
def get_value(text, variable):
そして、異なるテキストと異なる変数でそれを使用することができます-すなわち。名前または住所。
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)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加