0

2つの入力ボックスを設定しました。目標は、ボタンを押して、スコープ外の関数を使用して、入力された数値にある種の数学を適用することです。(問題に関連しているとは思わないので、パッキングとフレーミングのコードを省略しました。)

class class1:
    def __init__(self):
        self.entry1= tkinter.Entry(self.uframe, width=10)
        self.entry2= tkinter.Entry(self.uframe, width=10)

        self.calcButton = tkinter.Button(self.frame, text="Submit", command = self.doMathFunction)

def doMathFunction():
    #what do I put here that allows me to either run a .get on self.entry1 and 2

エントリをグローバルなスコープにすることを考えましたが、それではgetを実行できなくなりますか?ktinkerのドキュメントに「詳細な説明が必要」と記載されているため、エンドユーザーが入力ボックスに数値を入力したときにイベントをgetで実行する方法があると思います。これを行うための最良の方法が何であるかはよくわかりません。私の研究は相反する答えで戻ってきます。

ありがとう!

4

2 に答える 2

2

ボタンでクラスのメソッドを呼び出しdoMathFUnction、そのメソッドで値を渡して呼び出します。このようにすることは、doMathFunc関数がGUIの内部動作について何も知る必要がないことを意味します。

class class1:
    def __init__(self):
        ...
        self.calcButton = tkinter.Button(..., command=self.doCalc)

    def doCalc(self):
        a = self.entry1.get()
        b = self.entty2.get()
        doMathFunction(a,b)
于 2012-12-14T13:37:30.790 に答える
0

doMathFunctionスコープ外にする必要がある場合は、ラムダステートメントを使用して、doMathFunctionに変数を追加できます。

class class1:
    def __init__(self):
        self.entry1= tkinter.Entry(self.uframe, width=10)
        self.entry2= tkinter.Entry(self.uframe, width=10)

        self.calcButton = tkinter.Button(self.frame, text="Submit", command = \
             lambda e1 = self.entry1.get(), e2 = self.entry2.get(): doMathFunction(e1,e2))

def doMathFunction(e1, e2):
    print(e1*e2) # Or whatever you were going to do

通常、コマンドステートメントで関数を使用すると、変数宣言のように機能し、関数が実行され、returnステートメントが変数に割り当てられます。ただし、ラムダでは、その背後にある関数はオンコールでのみ実行されます。

したがって、calcButtonがプッシュされてそのコマンドステートメントを呼び出すと、ラムダ「関数」(e1およびe2を含む)が実行されます。これは、呼び出しを処理する仲介関数を作成するようなものです。

class class1:
    def __init__(self):
        self.entry1= tkinter.Entry(self.uframe, width=10)
        self.entry2= tkinter.Entry(self.uframe, width=10)

        self.calcButton = tkinter.Button(..., command = self.middleman)

    def middleman(self):
        e1 = self.entry1.get()
        e2 = self.entry2.get()
        doMathFunction(e1, e2)

def doMathFunction(e1, e2):
    print(e1*e2) # Or whatever you were going to do
于 2012-12-15T20:56:19.117 に答える