2016-09-10 7 views
1

Я программирование в Python и у меня есть несколько вопросов, которые я не могу найти ответ на любое место (пожалуйста, прочитайте все вопросы, как они строят до моего последнего вопроса):Черепаха График Python, .mainloop()

1.Что делает .mainloop()? Я прочитал все ответы в Stack Overflow, я также проверил объяснение документации.

2.Does .mainloop() всегда должен быть в конце программы черепахи?

3.Я использовал .mainloop() раньше. Мой вопрос, если у меня есть код f.f.g:

import turtle 

screen = turtle.Screen() 
alex = turtle.Turtle() 
tess = turtle.Turtle() 

def yes(x, y): 
    alex.onclick(yes) 
    print("Hello World") 

tess.onclick(yes) 
turtle.mainloop() 

Почему Алекс получит событие действия, когда функция yes() запускается? Я знаю, что это происходит, потому что функция вызывается, но что на самом деле происходит? Я имею в виду, что оператор turtle.mainloop() запускается до тех пор, пока не будет нажата кнопка tess, и событие действия tess будет ожидаться в цикле событий, так как событие alex попадает в цикл событий, поскольку его оператор запускается после запуска turtle.mainloop()?

ответ

0

Так mainloop() представляет собой бесконечный цикл, который в основном блокирует выполнение вашего кода в определенной точке. Вы вызываете его один раз (и только один раз).

так что позволяют сказать:

while true: 
circle.draw() 
sumden.mainloop() 
print "circle is being drawn" 
time.sleep(0.1) 

Вы никогда не увидите ничего о выходе и печати, потому что нет никакого цикла.

+0

Возможно, код работает именно таким образом, но я не думаю, что так оно и должно было интерпретироваться. – Volcano

+0

Я знаю, что инструкция печати кода не будет работать, пока вы не закроете окно черепахи, но это не та информация, которую я ищу. – Volcano

+0

О, простите, это не помогло. Может быть, я не хорошо читаю ваш вопрос. Не могли бы вы объяснить, что вы ищете. – Neeks

2

1.Что делает .mainloop() действительно?

черепаха mainloop() звонков Tkinter-х mainloop(), который вызывает Tk-х Tk_MainLoop(), который удивительно прост:

void 
Tk_MainLoop(void) 
{ 
    while (Tk_GetNumMainWindows() > 0) { 
     Tcl_DoOneEvent(0); 
    } 
} 

Он обрабатывает события, по одному за раз, в бесконечном цикле, пока есть какие-либо основные открытые окна. Обработанные события включают ввод с клавиатуры, нажатия кнопок, изменения окон, ввод-вывод файлов, активность в сети, таймеры, обновления дисплея и любые другие зарегистрированные обратные вызовы.

Прекрасным, одна страница описания из основного цикла можно найти в предисловии к Глава 15. Анатомия MainLoop в книге O'Reily Mastering Perl/Tk Стивом Lidie и Нэнси Уолш , Хотя это книга Perl/Tk, информация о mainloop действительна и для Python. Вы можете найти этот материал в режиме онлайн, но я не буду включать ссылку здесь, поскольку я не знаю, какие, если таковые имеются, онлайн-копии, законно отправлены. Но у вас достаточно информации для его поиска.

2.Наконец .mainloop() всегда должен быть в конце программы черепахи?

№ Это должно быть частью хорошо спроектированной программы, но не требуется. Большинство автономных программ будут включать в себя (или что-то, что называет его .done() или .exitonclick()), когда графическое окно закрывается без его завершения. Но некоторые ситуации, например. Возможно, IDLE не нуждается в этом, чтобы сохранить графику видимой.Общей ошибкой, которую я нахожу в программах черепахи новичка, является создание бесконечного цикла активности черепах перед вызовом mainloop(), а затем интересно, почему различные события не срабатывают.

Если вы планируете использовать Tk для обработки клавиатуры, мыши и событий таймера для вас, то вызов .mainloop() - это то, как вы это запустили. В большинстве программ Python/Tk это последний оператор, но после него может быть другой код, который запускается, когда все окна Tk все закрыты.

Мы можем думать о программировании черепах как написании кода плагина для основного цикла Tk. После того, как мы установим, последующие действия будут выполняться с помощью функций обратного вызова, которые мы зарегистрировали через функции on*().

3. Я использовал mainloop() раньше. Мой вопрос, если у меня есть код FFG: ... Почему Алекс получить событие действия, когда функция да() запускается

Когда работает ваша программа, черепахи Алекс и Тессы сложены поверх друг друг в центре окна. Когда вы нажимаете на этот стежок черепахи, событие переходит к Tess, который находится сверху и имеет обработчик событий. В своем обработчике событий Тесс устанавливает обработчик событий на Alex. Акт установки обработчика событий на Alex заставляет Алекс двигаться перед Тесс, поднимаясь к вершине стека. С этого момента, когда вы нажимаете на стек черепахи, Алекс обрабатывает события, и они больше не доходят до Тесс. Мы можем видеть это ясно, если мы дадим им различные цвета и различные обработчики событий:

import turtle 

alex = turtle.Turtle(shape="turtle") 
alex.color("blue") 

tess = turtle.Turtle(shape="turtle") 
tess.color("pink") 

def tess_handler(x, y): 
    alex.onclick(alex_handler) 
    print("Tess clicked") 

def alex_handler(x, y): 
    print("Alex clicked") 

tess.onclick(tess_handler) 

turtle.mainloop() 

Нажатие на стек черепахи производит:

> python3 test.py 
Tess clicked 
Alex clicked 
Alex clicked 
Alex clicked 
Alex clicked 
Alex clicked 
Alex clicked 

Вы могли двигаться Алекс и Тесс в разных местах, в окне и затем нажмите на них, чтобы подтвердить, что Алекс не начинает получать события до тех пор, пока не будет нажата Tess.