Tkinter Entryウィジェットは、より大きなプログラムでは空のままです(Python 2)

Clueless_captain

ボタンをクリックした後、ユーザーに名前を尋ねられた後、プログラムが続行されるプログラムを作成したいと思います。ポップアップに入力されたテキスト文字列をポップアップに返させることに固執しています。最初は自分のコードだと思っていましたが、名前を尋ねて印刷し、長さとタイプを印刷する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つの問題があります。

  • プログラムには1つだけが必要です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]

編集
0

コメントを追加

0

関連記事

分類Dev

tkinter:self.master.destroy()は2つのウィジェットを削除します

分類Dev

2つのOptionMenuウィジェットをtkinterにネストできますか?

分類Dev

2つの.pyファイルがあります。あるプログラムの複数行の出力を別のプログラムのGUIのtkinterテキストに取り込むにはどうすればよいですか?

分類Dev

ggplot2での大きな行列のヒストグラムのプロットは、基本hist()よりも20倍遅くなります。

分類Dev

クラス1で、クラス2(Tkinter)のウィジェット(ラベル)のプロパティを変更するにはどうすればよいですか?

分類Dev

Tkinterは2つのウィンドウを開きます

分類Dev

Python tkinterは、矢印キーを使用して2つのTEXTウィジェットを同時にスクロールします

分類Dev

Tkinterで同じ列の2つのウィジェットの幅を変えるにはどうすればよいですか?

分類Dev

tkinter〜pythonでグリッドに配置された2つのウィジェットの間にスペースを追加するにはどうすればよいですか?

分類Dev

2つのtkinterウィジェットを同時に非同期に移動するにはどうすればよいですか?

分類Dev

tkinter で 2 つの異なるメインループ ウィンドウを破棄するとプログラムがフリーズするのはなぜですか?

分類Dev

Jenkinsエージェントはプログラム「docker」を実行できません:エラー= 2、そのようなファイルまたはディレクトリはありません

分類Dev

2 つの Tkinter ウィンドウを同時に開くことはできますか?

分類Dev

tkinterで3列のグリッドに表示される2つのウィジェット間の間隔を等しくするにはどうすればよいですか?

分類Dev

TkInter:オブジェクトを最初のウィンドウではなく2番目のウィンドウに表示するにはどうすればよいですか?

分類Dev

tkinter:ComboboxウィジェットとEntryウィジェットがdelete( "all")によって削除されないのはなぜですか?

分類Dev

プログラム「mvn」を実行できませんerror = 2、そのようなファイルまたはディレクトリはありません

分類Dev

プログラム "..."を実行できませんerror = 2、そのようなファイルまたはディレクトリはありません(java)

分類Dev

tkinterで2つのペインのリストボックスを表示するウィジェット

分類Dev

ttkウィジェットが使用されている場合、tkinter関数は2回繰り返されます

分類Dev

tkinterの3x1グリッドに表示される2つのウィジェット間の間隔を修正するにはどうすればよいですか?

分類Dev

Python tkinterでウィジェットを再スケーリングするときに、ウィジェットの残りの部分でテキストをスケーリングするにはどうすればよいですか?

分類Dev

再帰的に呼び出されるtkinterウィジェットは2回しか表示されません

分類Dev

マッピングトランスデューサの結果に2より大きいアリティが含まれるのはなぜですか?

分類Dev

2つのTkinterウィジェット間でキーボードエントリを分割する

分類Dev

Tkinter:上げられたフレームの後ろのウィジェットにタブで移動しない方法はありますか?

分類Dev

最後のウィジェットでスタックすることなく、tkinterウィジェットのグループでフォーカスを継続的に切り替えることができるようにするにはどうすればよいですか?

分類Dev

Python: 親クラス メソッドを呼び出してウィンドウの確認を解除 (Tkinter) すると、ウィンドウに 2 セットのウィジェットが表示されます。

分類Dev

Tkinterウィジェットの色は変わりません

Related 関連記事

  1. 1

    tkinter:self.master.destroy()は2つのウィジェットを削除します

  2. 2

    2つのOptionMenuウィジェットをtkinterにネストできますか?

  3. 3

    2つの.pyファイルがあります。あるプログラムの複数行の出力を別のプログラムのGUIのtkinterテキストに取り込むにはどうすればよいですか?

  4. 4

    ggplot2での大きな行列のヒストグラムのプロットは、基本hist()よりも20倍遅くなります。

  5. 5

    クラス1で、クラス2(Tkinter)のウィジェット(ラベル)のプロパティを変更するにはどうすればよいですか?

  6. 6

    Tkinterは2つのウィンドウを開きます

  7. 7

    Python tkinterは、矢印キーを使用して2つのTEXTウィジェットを同時にスクロールします

  8. 8

    Tkinterで同じ列の2つのウィジェットの幅を変えるにはどうすればよいですか?

  9. 9

    tkinter〜pythonでグリッドに配置された2つのウィジェットの間にスペースを追加するにはどうすればよいですか?

  10. 10

    2つのtkinterウィジェットを同時に非同期に移動するにはどうすればよいですか?

  11. 11

    tkinter で 2 つの異なるメインループ ウィンドウを破棄するとプログラムがフリーズするのはなぜですか?

  12. 12

    Jenkinsエージェントはプログラム「docker」を実行できません:エラー= 2、そのようなファイルまたはディレクトリはありません

  13. 13

    2 つの Tkinter ウィンドウを同時に開くことはできますか?

  14. 14

    tkinterで3列のグリッドに表示される2つのウィジェット間の間隔を等しくするにはどうすればよいですか?

  15. 15

    TkInter:オブジェクトを最初のウィンドウではなく2番目のウィンドウに表示するにはどうすればよいですか?

  16. 16

    tkinter:ComboboxウィジェットとEntryウィジェットがdelete( "all")によって削除されないのはなぜですか?

  17. 17

    プログラム「mvn」を実行できませんerror = 2、そのようなファイルまたはディレクトリはありません

  18. 18

    プログラム "..."を実行できませんerror = 2、そのようなファイルまたはディレクトリはありません(java)

  19. 19

    tkinterで2つのペインのリストボックスを表示するウィジェット

  20. 20

    ttkウィジェットが使用されている場合、tkinter関数は2回繰り返されます

  21. 21

    tkinterの3x1グリッドに表示される2つのウィジェット間の間隔を修正するにはどうすればよいですか?

  22. 22

    Python tkinterでウィジェットを再スケーリングするときに、ウィジェットの残りの部分でテキストをスケーリングするにはどうすればよいですか?

  23. 23

    再帰的に呼び出されるtkinterウィジェットは2回しか表示されません

  24. 24

    マッピングトランスデューサの結果に2より大きいアリティが含まれるのはなぜですか?

  25. 25

    2つのTkinterウィジェット間でキーボードエントリを分割する

  26. 26

    Tkinter:上げられたフレームの後ろのウィジェットにタブで移動しない方法はありますか?

  27. 27

    最後のウィジェットでスタックすることなく、tkinterウィジェットのグループでフォーカスを継続的に切り替えることができるようにするにはどうすればよいですか?

  28. 28

    Python: 親クラス メソッドを呼び出してウィンドウの確認を解除 (Tkinter) すると、ウィンドウに 2 セットのウィジェットが表示されます。

  29. 29

    Tkinterウィジェットの色は変わりません

ホットタグ

アーカイブ