カメボタンを使ったPython
-
21-12-2019 - |
質問
私はSimonを実装するための宿題の割り当てを試みて、Pythonで言う。私はTurtle Library(要件)を使ってそれをやろうとしています。
しかし、私は画面を登録することができますが、[現在X、Y座標を印刷するだけ)クリックイベントを表示することはできません。
特に計画していることは、画面上の領域を持っているのが、その場所をクリックしたときにボタンをクリックしたかと見なされます。スクリーンクリアとゲームは何でもします。
しかし、それが行うことをすべて働くことを試みることの実験ではそれを設定するのでx、y座標を印刷しますが、プログラムの残りの部分は終了します。ユーザーが何でもクリックするのを待っていませんでした。ブロッキング方法を試してみました...
while clicked == False:
pass
.
または
while clicked == False:
time.sleep(1)
.
しかし、どちらのメソッドも手動で割り込むまでプログラムをハングアップしてからクリックすると印刷されます。
どこかのオプションがありませんか?
解決 2
それで豊富な検索の後、タートルを使用していくらかのクリックイベントを待つためにPythonのコードの実行を必ずしも一時停止することはありません。たぶんTKで私はそれをすることができましたが、タートルではありませんでした。
しかし、それを回避する方法があります。例として。メソッドは画面上の偽のボタンを設定し、クリックイベントを設定して終了します。クリックしたときのクリックイベントは、実行に必要な次のメソッドを呼び出します。そのため、ボタンがクリックされるまで、実際のコードは何もしていないが、メモリ内に残っていない。
とても具体的に。 1.「ボタン」を作成します。 2.クリックイベントを待つ必要があるまで、プログラムを正常に動作させてください。 3. [ボタン]をクリックすると、コードの次の部分が実行されたときに、オンスクリーンクリック(またはカメ)を設定します。
特集問題のコードは、コード内の後でクリックイベントの待機に依存することは依存しません。代わりに、Clickはコードの実行の次の部分を引き起こします。
他のヒント
カメにはボタンがないが、クリック用のコールバックがあります。
さらに、onclick
のScreen
を使用して、onclick
用のGeneral Clicksとturtle
を検出して、カメのクリックを検出する必要があります。たとえば、ダイナミックな形状を使用して異なる色の4つの大きなカメを作ることができます。
また、TURTLEはTKに基づいているので、mainloop()
次のプログラムはPython 2.7.5のヒントをいくつか与えます。
import turtle as t
from random import randint
class MyTurtle(t.Turtle) :
def __init__(self,**args) :
t.Turtle.__init__(self,**args)
def mygoto(self,x,y) :
t1.goto(x,y)
print x,y
def randonics(self,x,y) :
self.left(randint(90,270))
def minegoto(x,y) :
print x,y
t1.goto(x,y)
wt=t.Screen()
t1=MyTurtle()
wt.register_shape("big",((0,0),(30,0),(30,30),(0,30)))
t1.shape("big")
wt.onclick(t1.mygoto,btn=1)
wt.onclick(minegoto,btn=2)
t1.onclick(t1.randonics,btn=3)
t1.goto(100,100)
t.mainloop()
. onclick()に登録されている関数をx、y位置にテストすることができます。それがあなたがしなければならないすべての地域の中にあるならば。
あなたがやりたいこととこのコードの変化はほんの一例であるのとの間の違いはほんの一例です、あなたはclickがonclick()によってキャプチャされたときに何でもすることができます、さらにスレッドを起動するあなたが本当にそれを必要とするなら( python の登録)
import turtle as t
from random import randint
from threading import Thread
from time import sleep
def threaded_function(arg,t1):
for i in range(arg):
print "running",i
sleep(1)
t1.forward(i*10)
def minegoto(x,y) :
print x,y
t1.goto(x,y)
thread = Thread(target = threaded_function, args = (10,t1 ))
thread.start()
thread.join()
print "thread finished...exiting"
wt=t.Screen()
t1=t.Turtle()
wt.register_shape("big",((0,0),(30,0),(30,30),(0,30)))
t1.shape("big")
wt.onclick(minegoto,btn=1)
t1.goto(100,100)
t.mainloop()
.