2013-10-25 3 views
2

Я написал этот код, который создает овал в tkinter. При нажатии мыши овал создает новые координаты для себя, а затем начинает пульсировать.Python: как остановить циклическую функцию внутри функции?

Это выглядит следующим образом: 1.the овала создается по умолчанию 2.А мыши, функция «нажми» называются 3. Функции нажмите генерирует новые координаты, рисует овал, а затем начинает пульсирующее зацикливание эффект. 4. Теперь я должен быть в состоянии и могу снова щелкнуть на пульсирующем овале, переместить овал в новое место, а затем снова опустить новый овал (пульсировать).

def click(event): 
     pick = 2 
     counter = 0 
     esimene_x1 = randint(0, w-100) 
     esimene_y1 = randint(0, h-100) 
     teine_x1 = esimene_x1 
     teine_y1 = esimene_y1 
     canvas.coords(circle1, esimene_x1, esimene_y1, teine_x1, teine_y1) 
     pulsate(esimene_x1, esimene_y1, teine_x1, teine_y1, pick, counter) 

    def pulsate(esimene_x1, esimene_y1, teine_x1, teine_y1, pick, counter): 
     if pick % 2 == 0: 
      esimene_x1 -= 1 
      esimene_y1 -= 1 
      teine_x1 += 1 
      teine_y1 += 1 
      counter += 1 
      if counter == 40: 
       pick += 1 
     elif pick % 2 != 0: 
      esimene_x1 += 1 
      esimene_y1 += 1 
      teine_x1 -= 1 
      teine_y1 -= 1 
      counter -=1 
      if counter == 0: 
       pick += 1 
     s = esimene_x1, esimene_y1, teine_x1, teine_y1, pick, counter 
     canvas.coords(circle1, esimene_x1,esimene_y1, teine_x1,teine_y1) 
     raam.after(50, pulsate, *s) 

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

Вот файл, который вы можете запустить и посмотреть именно то, что, кажется, происходит:

https://mega.co.nz/#!e5pj0brC!QW6R4X9WTshOCh3FTybLrQu_oI0OOU6wL5QI61punUE

Кроме того, если вы видите что-нибудь еще, что, кажется, быть причиной этой ошибки, тогда дайте мне знать, пожалуйста. Я еще не получил знания о потоковом и классе в python, но если это единственное решение, сообщите мне об этом! Else был бы признателен, если бы его можно было управлять с помощью более простых методов!

спасибо!

ответ

1

Это не ошибка. Ваш метод click запускает метод pulsate, который затем снова запускается. Если вы снова вызываете click, он снова вызывает pulsate, но это другой «экземпляр» pulsate (при отсутствии лучшего термина) без ссылки на другой, работающий одновременно.

Вместо этого вы должны использовать переменную global для хранения овальных координат. Ваш метод click затем устанавливает эти координаты, например global oval; oval = esimene_x1, esimene_y1, teine_x1, teine_y1, но не вызывает pulsate. Вместо этого pulsate вызывается один раз, когда приложение запускается, а затем снова запускается снова, как в вашем коде. Овальные координаты не передаются в pulsate в качестве параметров, а считываются из глобальной переменной.

+0

Эй, чувак, спасибо большое: D! Работает как шарм <3 :) – user2919805

0

Я согласен с @tobias_k на его оценке того, что происходит не так. Вы определенно нуждаетесь в том, чтобы ваши координаты были глобальными, поэтому каждый щелчок может их установить. Но вам не обязательно сразу начинать пульсировать. Вы можете в первом щелчке установить координаты, а затем проверить, установлена ​​ли глобальная переменная «active» на true. Если это НЕ, тогда начните пульсировать. В противном случае просто вернитесь.

Смежные вопросы