Reputation: 429
Writing a little programm on Python 3. There is a rectangle and it has to bounce from walls(borders of a window)
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()
I guessed,that everything is Ok,but when I run this programm nothing happens.Tkinter window is not appearing. What's wrong with it,where i have a mistake?
Upvotes: 0
Views: 79
Reputation: 15163
To display something, you have to enter the eventloop
The last line
root.mainloop()
does that. Until you call this line, nothing is drawn.
You do everything in a loop.
Use async programming. Schedule the next paint with some timer.
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()
Some other notes: don't create a new canvas every time. Currently you create N canvas with the first frame, the next one is the second, and display them all below the previous one.
After you finish the while loop (never).
Upvotes: 1