2010-05-18 6 views
6

Ich bin ein Python (3.1.2)/emacs (23.2) Neuling lehrt mich tkinter mit dem Python-Tutorial gefunden here. Relevanter Code wird unterhalb der Frage eingefügt.Emacs: Inferior-Modus Python-Shell erscheint "lagged"

Frage: wenn ich auf die Hello-Schaltfläche klicke (was die say_hi-Funktion aufrufen sollte), wartet die inferiore Python-Shell (dh diejenige, die ich mit Cc Cc gestartet habe) auf die say_hi-Druckfunktion, bis ich entweder a) klicke die Schaltfläche Beenden oder b) das Root-Widget schließen? Wenn ich dasselbe in IDLE versuche, erzeugt jeder Klick auf die Schaltfläche Hello einen sofortigen Ausdruck in der IDLE-Python-Shell, noch bevor ich auf Quit klicke oder das Root-Widget schließe.

Gibt es irgendeine Eigenart in der Art, wie Emacs die Python-Shell (vs. IDLE) ausführt, die dieses "verzögerte" Verhalten verursacht? Ich habe ähnliche Emacs-Verzögerungen im Vergleich zu IDLE bemerkt, da ich Probleme mit dem Projekt Euler bearbeitet habe, aber dies ist das klarste Beispiel, das ich bisher gesehen habe.

FYI: Ich benutze python.el und haben eine relativ saubere init.el ...

(setq Python-Python-Befehl "d:/bin/python31/Python")

ist die nur Zeile in meinem init.el.

Danke,

Mike

===-Code Start ===

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

probiere 'print ('abc', file = sys.stderr)' es könnte Probleme mit der Pufferung geben (die Ausgabe an die Konsole könnte liniengepuffert sein, aber die Ausgabe an pipe/file könnte einen festen Puffer haben). – jfs

+0

Hat nicht funktioniert. sys.stdout.flush() [msws Antwort unten] hat funktioniert. Danke für den Kommentar! – MikeRand

Antwort

4

Ich würde vermuten, dass nicht auf eine tty befestigt ist, der Python-Interpreter (via C stdio) wechselt von der gepufferten Zeile zum gepufferten Block und sperrt stdout nicht bis zum Schließen. Das Ausführen von os.isatty(1) in einem Puffer "Inferior Python: Run Shell Compile" gibt false zurück, wodurch dieser Schätzung Gewicht hinzugefügt wird.

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

Kann einen Unterschied machen.

+0

Das hat beim Druckproblem funktioniert. Aus irgendeinem seltsamen Grund hängt der inferiore Puffer beim Beenden/Schließen. Ein anderes Thema, aber ... vielen Dank für Ihre Hilfe. – MikeRand

+0

Die Ereignisschleife in Tkinter hat einige seltsame Eigenschaften, die ich noch nie gründlich erforscht habe. Ich weiß, dass Tkinter unter IDLE sich merkwürdig verhält, vermute ich wegen duellierender Eventloops. – msw

+0

Gute Perspektive ... etwas, wenn es mir viel besser geht. Danke noch einmal. – MikeRand