2

学校の課題として簡単なゲームをやっていますが、キャンバスの更新に問題があります。いくつかのループとスリープ コマンドを試しましたが、うまくいかないようです。これで、キャンバスを更新するコードができましたが、キャンバスを updateCanvas 関数に渡す方法がわかりません。

基本的に私は2つの機能を持っています:

def canvas(self):
    canvas = Canvas(self)
    button = Button(self, text="test", command=self.updateCanvas)
    button.place(x=240, y=5)

次に、キャンバスを更新するメソッドがあります

def updateCanvas(self):
    canvas.create_oval(ovalx, ovaly, ovalx2, ovaly2, fill="black")

ボタンを押すとキャンバスが更新されますが、キャンバスはグローバルではないと表示されます。それは理にかなっている。私は以前にJavaプログラミングを行ったことがあります。何らかの理由でキャンバスを次のように変更します。

def canvas(self):
    global canvas = Canvas(self)

これにより、「構文エラー:無効な構文」が表示されます

私は何をすべきか?ループを使用しますか?クラス内にグローバル変数を作成できませんか? ゲームをチェッカーまたはチェスのように考えてください。チェッカーまたは駒が移動したときに画面を更新する必要があります。

4

1 に答える 1

3

初め:

global canvas = Canvas(self)

これがあなたに与える理由SyntaxErrorは、それが有効な Python ではないからです。

このglobalステートメントは、1 つ以上の名前だけを取ります。名前に何かを割り当てたい場合は、別の割り当てステートメントが必要です。

global canvas
canvas = Canvas(self)

(なぜ Python がこのように設計されているのか疑問に思っているなら、説明するのはそれほど難しいことではありません… しかし、Python の使い方を知りたいだけで、独自の言語を設計する方法が知りたいのであれば、ここでは関係ありません。)

ただし、そもそもここでグローバルを使用したくない場合があります。クラスの重要な点は、それらのインスタンスが何かに関する関連する状態を結び付ける属性を持つことができるということです。代わりに、ほぼ確実にこれが必要です。

self.canvas = Canvas(self)

そして、他の方法では、次のようなことを行います。

self.canvas.create_oval(ovalx, ovaly, ovalx2, ovaly2, fill="black")

Java では、クラスでインスタンス メンバーを宣言し、canvas魔法のように と同じことを意味するため、混乱する可能性がありますthis.canvas。Python はそのようには機能しません。変数はどこにも宣言されておらず、オンザフライで作成されているだけで、インスタンス変数 (およびメソッドも) には常に明示的なself..

于 2014-09-30T21:27:11.780 に答える