1

Python 2.7 で Tkinter アプリを作成していますが、これまで経験したことのない問題に直面しています。私が知る限り、Tkinter モジュールは__init__クラス内の関数に対してインポートされているようですが、他の関数に対してはインポートされていないようです。これが私が持っているものの簡略化されたバージョンです:

from Tkinter import *

class App:
    def __init__(self):
        self.master = Tk()
        self.window = Frame(self.master)
        self.window.grid()

        self.BuildFrames()
        self.master.mainloop()

    def BuildFrames(self):
        frames = []
        frames.append(Frame(self.window,borderwidth=2,padx=10,pady=10))
        # more code follows...

        for Frame in frames:
            Frame.grid()


App()

これを実行すると、次のエラーが表示されます。

Traceback (most recent call last):
  File "myApp.py", line 131, in <module>
    App()
  File "myApp.py", line 12, in __init__
    self.BuildFrames()
  File "myApp.py", line 26, in BuildFrames
    frame1 = Frame(self.window,borderwidth=2,padx=10,pady=10)
UnboundLocalError: local variable 'Frame' referenced before assignment

私が知る限り、Frame関数は関数内の Tkinter メソッドとして認識されていませんBuildFrames()。一体どうやってそれを認識できたのに、内部では認識でき__init__なかったのですBuildFramesか???

インポートを次のように変更することで問題を解決できます。

import Tkinter as Tk

そして、Tk.すべての Tkinter メソッドの前に a を追加しますが、むしろそれを避けたいと思います (とにかくこれを行う必要はありません!)

インポートが機能する方法について何か大きなことを見逃しているに違いありませんが、これと同じタイプのコードが以前に機能していたことを断言できます。誰かがこれで私を助けることができますか?

4

3 に答える 3

1

コードのどこかにFrame = ...存在する可能性があります。その変数の名前を 以外に変更しFrameます。

次のコードのようなことをしています:

>>> def f():
...     a + 1
...     a = 0
... 
>>> f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in f
UnboundLocalError: local variable 'a' referenced before assignment

変数に値があるのに UnboundLocalError が発生するのはなぜですか?

編集

BuildFrames を次のように変更します。

def BuildFrames(self):
    frames = []
    frames.append(Frame(self.window,borderwidth=2,padx=10,pady=10))
    # more code follows...

    for frame in frames:
        frame.grid()
于 2013-07-08T06:24:40.340 に答える
0

問題の根本は、グローバル インポートを行っていることです。したがって、フレーム ウィジェットは としてインポートされFrameます。

を行うと、同じ名前の 2 つのものを持つことはできないため、という名前のローカル変数で Frame クラスfor Frame in frames上書きされます。Frame

Python の設計方法により、関数内のコードが実行される前に、「Frame」という名前のローカル変数を作成していることを認識します。したがって、このコードを実行すると、次のようになります。

frames.append(Frame(self.window,borderwidth=2,padx=10,pady=10))

...Frameローカル変数に置き換えられたため、クラスは存在しなくなりました。また、ローカル変数「Frame」に値をまだ割り当てていないため、エラーが発生します。

修正は非常に簡単です。「Frame」という名前のローカル変数を作成しないか、グローバル インポートを行わないでください。

于 2013-07-08T11:09:17.027 に答える
0

Frameその関数のどこかに割り当てています

    frame1 = Frame(self.window,borderwidth=2,padx=10,pady=10)
UnboundLocalError: local variable 'Frame' referenced before assignment

それに割り当てているので、Python はそれがローカル変数でなければならないことを知っているので、グローバル変数を見ていません。

この問題の簡単な例を次に示します

a = 1
def f():
    b = a + 1
    a = b + 1  # If this wasn't here, the above line would use the global `a`
f()

それでも不明な場合は、次のコード (関数の残りの部分) を含めてください。指摘させていただきます。

于 2013-07-08T06:25:48.130 に答える