0

私はPythonでtkinterを使用することを学び始めたばかりで、入力ボックスに入力されたものを印刷する単純なスクリプトでのこの試みが機能しないことは直感に反しているようです:

class App:
    def __init__(self, master):

        frame  = Frame(master)
        frame.pack()

        text_write = Entry(frame)
        text_write.pack()

        self.button = Button(frame, text="quit", fg="red", command=frame.quit)
        self.button.pack(side=LEFT)

        self.hi_there = Button(frame, text='hello', fg='black', command=self.say_hi(text_write.get()))
        self.hi_there.pack(side=RIGHT)

    def say_hi(self, text):
        print(text)

root = Tk()

app = App(root)

root.mainloop()

これは何もせず、エラーも出力しませんが、これを次のように変更すると:

class App:
    def __init__(self, master):

        frame  = Frame(master)
        frame.pack()

        self.text_write = Entry(frame)
        self.text_write.pack()

        self.button = Button(frame, text="quit", fg="red", command=frame.quit)
        self.button.pack(side=LEFT)

        self.hi_there = Button(frame, text='hello', fg='black', command=self.say_hi)
        self.hi_there.pack(side=RIGHT)

    def say_hi(self):
        print(self.text_write.get())

次に、関数を呼び出して値を出力します。そこで「自己」を宣言する必要があるのはなぜですか? また、(最初の例のように) text_write の値を引数として say_hi に渡して、それを表示できないのはなぜでしょうか? それとも、あなたと私が間違っているだけですか?

4

1 に答える 1

0

これを行う場合:

self.button = Button(..., command=func())

次に python が を呼び出しfunc()、その結果が command 属性に割り当てられます。関数は何も返さないため、コマンドは None になります。そのため、ボタンを押しても何も起こりません。

2番目のバージョンは問題ないようです。self必要な理由は、それがないとtext_write、init 関数にしか見えないローカル変数だからです。を使用selfすると、オブジェクトの属性になり、オブジェクトのすべてのメソッドからアクセスできるようになります。

最初の試行と同様に引数を渡す方法を知りたい場合は、このサイトで と の使用を検索してlambdaくださいfunctools.partial。この種の質問は、何度か尋ねられ、回答されています。

于 2013-01-17T12:27:22.423 に答える