2016-07-12 2 views
0

Я ищу, чтобы уснуть в цикле while, в холсте tkinter. В Python2 Цель состоит в том, чтобы иметь случайную движущуюся точку, обновленную каждые X секунд (тогда я смогу сделать более крупный скрипт, чтобы точно то, что я хочу) без ввода внешнего пользователя.Сон в tkinter (python2)

В настоящем время, я сделал это:

import Tkinter, time 

x1, y1, x2, y2 = 10, 10, 10, 10 
def affichage(): 
    global x1, y1, x2, y2 
    can1.create_rectangle(x1, y1, x2, y2, fill="blue", outline="blue") 
def affichage2(): 
    global x1, y1, x2, y2 
    can1.delete("all") 
    can1.create_rectangle(x1, y1, x2, y2, fill="blue", outline="blue") 

fen1 = Tkinter.Tk() 
can1 = Tkinter.Canvas(fen1, height=200, width=200) 
affichage() 
can1.pack() 
temps = 3000 

while True: 
    can1.after(temps, affichage2) 
    x1 += 10 
    y1 += 10 
    x2 += 10 
    y2 += 10 
    temps += 1000 
fen1.mainloop() 

fen1.destroy() 

(извините за французские имена переменных: °) Итак, я попытался с помощью функции .Посль, но я не могу увеличить его, как я хочу. Я думаю, что это возможно при многопоточности, но должно быть более простое решение.

У вас есть идея?

+1

'time.sleep (т)' 'где измеренное T' находится в секундах –

+0

' fen1.mainloop() 'является частью при запуске приложения, если это не выполняется, потому что это ниже' в то время как True' без 'break', тогда окно никогда не появится вообще. –

+0

другие указали на проблему с 'sleep'. Также существует проблема с удалением и воссозданием прямоугольника. Холст имеет возможность перемещать существующий объект; что будет более эффективным, чем уничтожение и воссоздание объекта. –

ответ

1

sleep не очень хорошо сочетается с Tkinter, поскольку он блокирует остановку события, что, в свою очередь, блокирует окно и не реагирует на ввод пользователя. Обычный способ сделать что-то произойдет каждые X секунд, чтобы поместить вызов after внутри самой функции, которую вы передаете, до after. Попробуйте:

import Tkinter, time 

x1, y1, x2, y2 = 10, 10, 10, 10 
def affichage(): 
    global x1, y1, x2, y2 
    can1.create_rectangle(x1, y1, x2, y2, fill="blue", outline="blue") 
def affichage2(): 
    global x1, y1, x2, y2 
    can1.delete("all") 
    can1.create_rectangle(x1, y1, x2, y2, fill="blue", outline="blue") 
    x1 += 10 
    y1 += 10 
    x2 += 10 
    y2 += 10 
    can1.after(1000, affichage2) 

fen1 = Tkinter.Tk() 
can1 = Tkinter.Canvas(fen1, height=200, width=200) 
affichage() 
can1.pack() 
temps = 3000 

can1.after(1000, affichage2) 
fen1.mainloop() 

fen1.destroy()