LINUX.ORG.RU

[python] Emacs и python-mode

 


0

0

Вот такой пример:
============================================
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
root = Tk()
Button(root, text = u'Завершение работы', command = root.quit).pack()
root.protocol('WM_DELETE_WINDOW', lambda: 0) # перехват закрытия окна
root.mainloop()
============================================
При запуске скрипта из консоли - всё, как задумано:
закрыть окно можно только по кнопке, по крестику нельзя.
При запуске С-с С-с из-под Emacs (22.2.1) закрыть окно нельзя никак: кнопочка не работает.
В буфере *Python* - пусто, никаких ошибок.

Почему так?

Исходя из описания команды C-c C-c - "Send the current buffer to the inferior Python process", код выполняется в уже запущенном интерпретаторе, который не завершается после выполнения этого кода. root.quit() завершает mainloop, но не удаляет окна с экрана, это происходит при завершении процесса питона. Понятненько?

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

Спасибо, понятненько :)) Однако, не совсем понятненько, как сделать так, чтобы скрипты было удобно отлаживать под emacs. Получается, что python-mode со всеми его припендосами в этом случае не годится вообще, так?

The_gray_Cardinal
() автор топика
Ответ на: комментарий от Laz

И в чём фикус такого поведения, чем это удобно? Если я напишу в скрипте "sys.exit()", запущенный интерпретатор завершится. В другом скрипте не напишу - не завершится. И что мне весь этот балаган даёт?

The_gray_Cardinal
() автор топика
Ответ на: комментарий от Davidov

Достаточно просто написать "destroy" вместо "quit". Но мне это кажется неправильным.

В том смысле, что скрипты, запускаемые из-под emacs и запускаемые "просто", работают по-разному. Это напрягает.

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

Ещё один пример:
=============================================
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *

def die(event):
    root.destroy()

root = Tk()
button = Button(root)
button["text"] = u"Завершение работы"
button.bind("<Button-1>", die)
button.pack()
root.mainloop()
=============================================
При запуске из-под emacs получаем:
=============================================
>>> invalid command name ".3082336396L"
    while executing
"$w cget -state"
    (procedure "tk::ButtonDown" line 12)
    invoked from within
"tk::ButtonDown .3082336396L"
    (command bound to event)
=============================================
При "простом" запуске - всё нормально, никаких проблем.

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