LINUX.ORG.RU

Почему у меня в tkinter-е события обрабатываются без mainloop(), а у другого чувака - нет?

 


0

1

Сразу скажу, что у чувака винда, а у меня гента, и мы работаем в стандартном питоновском интерактивном шелле. Питон третий, хотя во втором у меня такой же результат.

Возьмём, к примеру, такой код:

>>> from tkinter import *
>>> w=Tk()
>>> btn=Button(w,text="penis")
>>> def penis(v):
...   print("Penis!")
... 
>>> btn.bind("<Button-1>",penis)
'140268791533128penis'
>>> btn.pack()

После этого я переключаюсь на окошко, клацаю на кнопку с неприличной надписью, и у меня в консоли появляются такие же неприличные надписи. У чувака с виндой кнопка даже не появляется, пока он mainloop() не вызовет.

Читал stackoverflow, но там чешут репы и то соглашаются и говорят, что у них так же, то говорят, что так бывает только в некоем IDLE, которого у меня нету и никогда не стояло.

Почему так происходит? Можно списать на разницу в какой-нибудь оконной библиотеке, лежащей под ткинтером и разнящейся на винде и лине, или это у кого-то из нас кривые руки?


Ответ на: комментарий от anonymous

3.6.5 и 3.5.5, причём 3.5.5 у меня. Не думаю.

tsmx
() автор топика

запусти не в шелле а просто в терминале. Если поведение такое же - глюк версии питона какой то. Если не запустит окно - глюк в идле

saibogo ★★★★
()
Ответ на: комментарий от saibogo

В том-то и прикол, что происходит это только в шелле. Меня интересует, почему мой шелл отличается от виндового.

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

Это какая-то фича?

tsmx
() автор топика

мммм... А попробуйте то-же самое только чтобы mainloop() был вызван на винде в другом процессе. Вообще не относящемся к вашим действиям, а может и к пользователю.. И после этого перепроверьте.

chenger ★★
()

По вашему как логичнее c окнами работать, c mainloop() или без? А переносимость и кроссплатформенность вам важна?

anonymous
()
Ответ на: комментарий от tsmx

попробовал Ваш код. После ввода второй строчки окно становится активным. Это неправильно. Но шелл работает не совсем так, как чистый питон. Он больше для наглядной отладки. Попробуйте обернуть в класс и запустить прогу по новой

saibogo ★★★★
()
Ответ на: комментарий от anonymous

Разумеется, с mainloop(). Я сам немного в осадок выпал, когда у меня внезапно всё заработало без него.

tsmx
() автор топика

Венда не совсем нормальная и питон в ней не совсем питон. Такое объяснение тебя устроит? Делай как правильно, чтобы работало всегда у всех, и всё.

anonymous
()

tkinter уг кстати

anonymous
()

Чтобы не нарваться на путешествие, описываю три совета. Tkinter не нужен, это раз. Два, делайте правильно, а не "..и так сойдёт". Три, если вы всё же женского пола, то, пожалуйста, фотку себя и листочка с надписью привет исден!Просто, как раз-два-три.

anonymous
()
Ответ на: комментарий от tsmx

он не магической силой обладает. Он просто нахрен не нужен. Избыточная сущность

saibogo ★★★★
()

В некоторых шеллах, например в ipython, неблокирующая работа tkinter сделана специально как фича. Возможно в твоем IDLE она тоже присутствует.

Aswed ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.