Прежде всего, взгляните на мою предыдущую тему здесь: Tkinter понимает основной цикл
Следуя совету оттуда, в программировании с графическим интерфейсом следует любой ценой избегать бесконечных циклов, чтобы виджеты реагировали на ввод пользователя.
Вместо использования:
while 1:
ball.draw()
root.update()
time.sleep(0.01)
Мне удалось использовать self.canvas.after(1, self.draw)
внутри моей функции draw()
.
Итак, мой код теперь выглядит так:
# Testing skills in game programming
from Tkinter import *
root = Tk()
root.title("Python game testing")
root.resizable(0, 0)
root.wm_attributes("-topmost", 1)
canvas = Canvas(root, width=500, height=400, bd=0, highlightthickness=0)
canvas.pack()
root.update()
class Ball:
def __init__(self, canvas, color):
self.canvas = canvas
self.id = canvas.create_oval(10, 10, 25, 25, fill=color)
self.canvas.move(self.id, 245, 100)
self.canvas_height = canvas.winfo_height()
self.x = 0
self.y = -1
def draw(self):
self.canvas.move(self.id, self.x, self.y)
pos = self.canvas.coords(self.id)
if pos[1] <= 0:
self.y = 1
if pos[3] >= self.canvas_height:
self.y = -1
self.canvas.after(2, self.draw)
ball = Ball(canvas, "red")
ball.draw()
root.mainloop()
Однако время внутри self.canvas.after()
не работает должным образом... Если установлено в 1, оно очень быстрое! Если он установлен на 10, 5 или даже 2, это слишком медленно! У меня не было этой проблемы при использовании вышеуказанного цикла while в моем коде, поскольку time.sleep()
работало как надо!
ИЗМЕНИТЬ:
Теперь я могу сообщить, что время внутри функции after Tkinter не работает должным образом на моем планшете с Windows 8.1 и на моем ноутбуке с Windows 8.1, в то время как на том же ноутбуке при запуске Ubuntu через виртуальную машину оно работает работать как надо.
sleep
указано в секундах, а вafter
— в миллисекундах. Сafter(10,...)
вроде так же быстро, как и сsleep(0.01)
. В чем именно проблема? - person tobias_k   schedule 21.03.2015after(2,...)
илиafter(20,...)
. - person tobias_k   schedule 21.03.2015