0

Python 3 で小さなプログラムを作成します。長方形があり、壁 (ウィンドウの境界) から跳ね返る必要があります。

check=False

from tkinter import*
rect_x=50#x0 of rect
rect_y=50#y0 of rect
rect_x1=rect_x+rect_x#x1 of rect
rect_y1=rect_y+rect_y#y1 of rect
rect_change_x=5#change X speed
rect_change_y=3#change Y speed
root=Tk()

while check==False:

    if rect_y > 450 or rect_y < 0:
        rect_change_y = rect_change_y * -1
    if rect_x > 650 or rect_x < 0:
        rect_change_x = rect_change_x * -1


    rect_x+=rect_change_x#changing x
    rect_y+=rect_change_y#changing y
    rect_x1+=rect_change_x#changing x1
    rect_y1+=rect_change_y#changing y1



    c=Canvas(root,bg='yellow',width=700,height=500)
    c.pack()
    rect=c.create_rectangle(rect_x,rect_y,rect_x1,rect_y1,fill='black')



root.mainloop()

すべて問題ないと思いましたが、このプログラムを実行しても何も起こりません。Tkinter ウィンドウが表示されません。どこが間違っているのですか?

4

1 に答える 1

1

何かを表示するには、イベントループに入る必要があります

最後の行

root.mainloop()

それをします。この行を呼び出すまで、何も描画されません。
すべてをループで行います。

非同期プログラミングを使用します。いくつかのタイマーで次のペイントをスケジュールします。

check=False

from tkinter import*
rect_x=50#x0 of rect
rect_y=50#y0 of rect
rect_x1=rect_x+rect_x#x1 of rect
rect_y1=rect_y+rect_y#y1 of rect
rect_change_x=5#change X speed
rect_change_y=3#change Y speed
root=Tk()

def paintloop():
    global check,rect_x,rect_y,rect_x1,rect_y1,rect_change_x,rect_change_y
    root.after(100, paintloop)
    if rect_y > 450 or rect_y < 0:
        rect_change_y = rect_change_y * -1
    if rect_x > 650 or rect_x < 0:
        rect_change_x = rect_change_x * -1
     ...


root.after(0,paintloop)
root.mainloop()

その他の注意事項: 毎回新しいキャンバスを作成しないでください。現在、最初のフレームで N キャンバスを作成し、次のフレームは 2 番目のフレームで、すべて前のフレームの下に表示します。
while ループを終了した後 (決して)。

于 2013-10-11T06:40:59.523 に答える