0

Tkinterを使用してPython2.7.3でグラフ電卓を作成しています。ユーザーが「b」ボタンを押すと、コンソールに「b」が出力されるように設定しました。これを行うには、「key」という変数が渡される関数を作成し、それをラベルに追加します。ただし、プログラムを最初に起動すると、関数が自動的に呼び出され、コンソールに「b」が出力されます。ボタンをクリックしても何も起こりません。これが私のコードです:

from Tkinter import *

class Application(Frame):
    def addkey(self,key):
        print str(key)

    def removekey(self):
        if len(self.displaytext) > 0:
            self.displaytext = self.displaytext[0:-1]

    def createWidgets(self):
        self.maxlength = 20
        self.displaytext = ""

        self.frame1 = Frame(self)
        self.display = Label(self.frame1,textvariable=self.displaytext,width=self.maxlength+3,bg="black",fg="white",height=2)
        self.frame1.pack()
        self.display.pack()

        self.frame2 = Frame(self)
        self.bksp = Button(self.frame2,text="b",width=4,height=2,command=self.addkey("b"))
        self.frame2.pack()
        self.bksp.pack()


    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

app = Application()
app.mainloop()

try:
    root.destroy()
except:
    pass
4

2 に答える 2

2

command = ...関数が渡されることを期待しています(0 個の引数を受け入れます)。そのまま、関数の結果を渡しています (Noneこの場合)。

これを行う簡単な方法の 1 つは、無名関数を使用して関数をラップし、適切に呼び出すことです。

command=lambda: self.addkey("b")

または、より詳細に実行できます。

def button_func():
    return self.addkey("b")
self.bksp = Button(self.frame2,text="b",width=4,height=2,command=button_func)

しかし、15 個のボタンがあり、それぞれがわずかに異なる引数で同じ基になる関数を呼び出している場合、これはかなり冗長になり始めます。

于 2013-01-17T15:34:29.810 に答える
1

呼び出して、その結果を引数self.addkeyに代入しています。command代わりに、呼び出すことができる関数を渡す必要があります。

つまり、変更

command=self.addkey("b")

command=lambda: self.addkey("b")

self.addkey追加の引数が必要ない場合は、 を実行できますがcommand=self.addkey、そうではないため、 が必要ですlambda

于 2013-01-17T15:33:01.657 に答える