1

Tkinter で非グラフィック ゲームを作成しようとしていますが、エントリ ウィジェットに問題があります。"<Return>"何かを印刷する前に、押されるのを待つにはどうすればよいですか?

    from Tkinter import *

    class App:
        def __init__(self, master):

            frame = Frame(master)
            frame.pack()
            f = Frame(master, width=500, height=300)
            f.pack(fill=X, expand=True)

            mt = StringVar()


            menubar = Menu(master)
            menubar.add_command(label="New Game", command=self.new_game)
            menubar.add_command(label="Continue Game", command=self.continue_game)
            master.config(menu=menubar)

            maintext = Label(master, fg="blue", textvariable=mt)
            maintext.pack(side=BOTTOM)
            mt.set("")

            self.e1 = Entry(master)
            self.e1.pack()
            self.e1.bind("<Return>")
            self.e1.lower()


            global mt


        def new_game(self):
            mt.set("What do you want your username to be?")
            self.e1.lift()
            #wait for <Return> to be pressed
                mt.set("Welcome " + self.e1.get())
        def continue_game(self):
            mt.set("Type your username in.")



    root = Tk()

    app = App(root)

    root.mainloop()

トップメニューバーの「New Game」をクリックすると、入力ボックスが表示され、何かを入力するのを待ってから、Enterをクリックします。次に、「Welcome」+(ユーザーが入力した内容) を出力します。実際に New game をクリックすると、すぐに "Welcome" と表示されます。

印刷とは、「mt.set」によって参照される、下部のラベルを別のものに関連付けることを意味します。

4

1 に答える 1

0

GUI プログラムでは、何かが起こるのを待たず*、イベントに応答します。したがって、ユーザーがリターンを押したときに関数を呼び出すには、次のようにします。

    self.e1.bind("<Return>", self._on_return)

上記は_on_return、ユーザーがリターンキーを押したときに関数を呼び出します。

特定のコードでは、実際には StringVar は必要ありません。たとえば、次のようにします。

def __init__(self, master):
    ...
    self.maintext = Label(master, fg="blue")
    ...

def _on_return(self, event):
    self.maintext.configure(text="Welcome, %s" % self.e1.get())

* 厳密に言えば、待つことはできますが、ダイアログが閉じられるのを待つなどの特定の状況を除いて、GUI プログラムを記述する正しい方法ではありません。

于 2012-04-22T17:43:42.627 に答える