2010-05-18 17 views
6

Soy un Python (3.1.2)/emacs (23.2) novato me enseño a mí mismo tkinter usando el tutorial de pythonware encontrado here. El código relevante se pega debajo de la pregunta.Emacs: shell-python de modo inferior aparece "rezagado"

Pregunta: cuando hago clic en el botón Hello (que debe llamar a la función say_hi), ¿por qué el shell python inferior (es decir, el que inicié con Cc Cc) espera para ejecutar la función de impresión say_hi hasta que a) el botón Salir o b) cerrar el widget raíz? Cuando intento lo mismo en IDLE, cada clic del botón Hello produce una impresión inmediata en el shell IDLE de pitón, incluso antes de hacer clic en Salir o cerrar el widget raíz.

¿Hay alguna peculiaridad en la forma en emacs corre el terminal de Python (frente a IDLE) que provoca este comportamiento "lag"? He notado retrasos de emacs similares frente a IDLE, ya que he trabajado en los problemas de Project Euler, pero este es el ejemplo más claro que he visto hasta ahora.

FYI: utilizar python.el y tienen un init.el relativamente limpio ...

(setq pitón-python-comando "d:/bin/Python31/pitón")

es el única línea en mi init.el.

Gracias,

Mike

=== === Comenzar Código

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() 
+0

intento 'print ('abc', file = sys.stderr)' podría ser buffering problemas (salida a la consola podría ser un búffer de líneas, pero la producción de tubería/archivo podría haber fijado buffer). – jfs

+0

No funcionó. sys.stdout.flush() [la respuesta de msw a continuación] funcionó. ¡Gracias por el comentario, sin embargo! – MikeRand

Respuesta

4

supongo que no está unido a un TTY, el intérprete de Python (vía C stdio) cambia a bloque tamponado de la línea amortiguada y no vacía hasta que se cierra. Al ejecutar os.isatty(1) en un buffer "Inferior Python: ejecutar Shell Compile" se devuelve falso, lo que agrega peso a esta suposición.

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

Puede hacer una diferencia.

+0

Eso funcionó en el problema de impresión. Por alguna extraña razón, el buffer inferior se cuelga al cerrar/cerrar. Un problema diferente, sin embargo ... muchas gracias por su ayuda. – MikeRand

+0

El ciclo de eventos en Tkinter tiene algunas propiedades extrañas que nunca exploré en profundidad. Sé que Tkinter bajo IDLE se comporta de manera extraña, supongo que debido a los duelos de eventos en bucle. – msw

+0

Buena perspectiva ... algo para cuando sea mucho mejor en esto. Gracias de nuevo. – MikeRand