0

tkinter を使用して別のスクリプトで定義された Python 関数を呼び出すと、いくつかの問題が発生します。必要に応じて GUI が使用する関数用の別のスクリプトを用意したいと思います。現時点では、私はこのようにしています。

ttk.Button(mainframe, text="1", command=one).grid(column=1, row=1, sticky=NW)

def one():
    code_entry.insert(END,"1")

上記は、ボタンのクリックでコマンド 1 を呼び出し、GUI の入力フィールドに文字 1 を出力します。関数を保持する別のスクリプトを作成して、次のように呼び出すことができると思いました。

ttk.Button(mainframe, text="1", command=functions.one()).grid(column=1, row=1, sticky=NW)

次に、以下のように、GUI の上部に import ステートメントを追加するだけです。

import functions

これは機能せず、これにアプローチする方法についてアドバイスを求めています。

4

1 に答える 1

1

エラーメッセージは指定していませんが、ボタンが作成される前にfuctions.one()実際にそのモジュールの one() 関数を呼び出している可能性が最も高いです。() 部分を削除するだけで修正されます。() なしで関数を指定すると、関数オブジェクトの参照が渡されます。

また、変数のスコープにも注意してcode_entryください。以前にモジュール レベル グローバルとして使用していた場合 (またはone()、呼び出しと同じ関数内にある場合は関数ローカルttk.Button)、新しい変数に移動すると使用できなくなります。なしの名前空間code_entry

これを解決するには、最初に呼び出さcode_entryにパラメーターとしてコールバックに渡す必要があります。これに対する通常のアプローチは、ラムダを作成することです。基本的に、元の と同じスコープで機能する関数を作成し、 のような変数にアクセスできますが、別のモジュールで関数を呼び出すこともできます。one()one()code_entry

ttk.Button(mainframe, text="1", command=lambda: functions.one(code_entry))

これは基本的に次のものと同じであることに注意してください。

def some_anonymous_function():
    functions.one(code_entry)
ttk.Button(mainframe, text="1", command=some_anonymous_function)

どちらの例も関数オブジェクトを作成し、そのオブジェクトを参照として渡します。ラムダのfunctions.one()呼び出しは、実際にはラムダ関数の本体内にあり、後で tkinter によって呼び出されます。

もちろん、この新しいパラメーターを受け入れるには、one() を再定義する必要もあります。

def one(code_entry):
    code_entry.insert(END,"1")
于 2013-03-23T17:07:22.570 に答える