Emacs: Python-оболочка в нижнем режиме выглядит «отставшей» - PullRequest
6 голосов
/ 19 мая 2010

Я новичок в Python (3.1.2) / emacs (23.2), обучающий себя tkinter с помощью учебника по pythonware, найденного здесь . Соответствующий код вставлен ниже вопроса.

Вопрос: когда я нажимаю кнопку Hello (которая должна вызывать функцию say_hi), почему нижняя оболочка python (т. Е. Та, которую я запустил с помощью Cc Cc) ожидает выполнения функции печати say_hi, пока я не а) нажму Кнопка выхода или б) закрыть корневой виджет вниз? Когда я пытаюсь сделать то же самое в IDLE, каждое нажатие кнопки Hello приводит к немедленной печати в оболочке Python IDLE, даже до того, как я нажимаю Quit или закрываю корневой виджет.

Есть ли какая-то особенность в том, что emacs запускает оболочку Python (против IDLE), которая вызывает такое "запаздывающее" поведение? Я заметил аналогичные лаги в emacs и IDLE, когда работал над проблемами Project Euler, но это самый яркий пример, который я видел.

К вашему сведению: я использую python.el и у меня относительно чистый init.el ...

(setq python-python-команда "d: / bin / python31 / python")

единственная строка в моем init.el.

Спасибо

Mike

=== Начать код ===

from tkinter import *

class App:

    def __init__(self,master):

        frame = Frame(master)
        frame.pack()

        self.button = Button(frame, text="QUIT", fg="red", command=frame.quit)
        self.button.pack(side=LEFT)

        self.hi_there = Button(frame, text="Hello", command=self.say_hi)
        self.hi_there.pack(side=LEFT)

    def say_hi(self):
        print("hi there, everyone!")

root = Tk()

app = App(root)

root.mainloop()

1 Ответ

4 голосов
/ 19 мая 2010

Я предполагаю, что не будучи подключенным к tty, интерпретатор Python (через C stdio) переключается на буферизованный блок из буферизованной строки и не сбрасывает stdout, пока не закроется. Выполнение os.isatty(1) в буфере "Inferior Python: run Shell Compile" возвращает false, что добавляет вес этому предположению.

def say_hi(self):
    print("hi there, everyone!")
    sys.stdout.flush()

Может иметь значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...