2010-05-18 26 views
6

Tôi là một người mới sử dụng Python (3.1.2)/emacs (23.2) tự học tkinter bằng cách sử dụng hướng dẫn pythonware được tìm thấy here. Mã có liên quan được dán bên dưới câu hỏi.Emacs: python-shell chế độ kém xuất hiện "lagged"

Câu hỏi: khi tôi nhấp vào nút Xin chào (nên gọi hàm say_hi) tại sao vỏ python kém hơn (tức là cái tôi khởi động với Cc Cc) đợi để thực hiện hàm in say_hi cho đến khi tôi nhấp vào) nút Quit hoặc b) đóng tiện ích gốc xuống? Khi tôi cố gắng tương tự trong IDLE, mỗi nhấp chuột của nút Hello tạo ra một bản in ngay lập tức trong vỏ python IDLE, ngay cả trước khi tôi bấm Bỏ hoặc đóng tiện ích gốc.

Có một số điều không minh bạch trong cách các emacs chạy vỏ Python (so với IDLE) gây ra hành vi "chậm trễ" này không? Tôi đã nhận thấy emacs tương tự lags so với IDLE như tôi đã làm việc thông qua các vấn đề Project Euler, nhưng đây là ví dụ rõ ràng nhất mà tôi đã nhìn thấy được nêu ra.

FYI: Tôi sử dụng python.el và có một init.el tương đối sạch sẽ ...

(setq python-python-lệnh "d:/bin/python31/python")

là chỉ dòng trong init.el.

Cảm ơn,

Mike

=== Begin Mã ===

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

thử 'print ('abc', file = sys.stderr)' nó có thể là vấn đề đệm (đầu ra cho bàn điều khiển có thể được đệm theo đường nhưng đầu ra cho đường ống/tệp có thể có bộ đệm cố định). – jfs

+0

Không hoạt động. sys.stdout.flush() [câu trả lời của msw bên dưới] đã hoạt động. Cảm ơn cho bình luận, mặc dù! – MikeRand

Trả lời

4

Tôi đoán rằng không được gắn liền với một tty, trình thông dịch Python (qua C stdio) chuyển đổi để chặn đệm từ dòng đệm và không tuôn ra stdout cho đến khi nó đóng cửa. Chạy os.isatty(1) trong bộ đệm "Inferior Python: run Shell Compile" trả về false, do đó thêm trọng số cho dự đoán này.

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

Có thể tạo sự khác biệt.

+0

Đã khắc phục sự cố in. Đối với một số lý do kỳ lạ, bộ đệm kém hơn treo trên bỏ/đóng. Một vấn đề khác, mặc dù ... cảm ơn nhiều vì sự giúp đỡ của bạn. – MikeRand

+0

Vòng lặp sự kiện trong Tkinter có một số thuộc tính kỳ lạ mà tôi chưa từng khám phá sâu. Tôi biết rằng Tkinter dưới IDLE cư xử kỳ quặc, tôi đoán là vì các vòng đấu sự kiện. – msw

+0

Quan điểm tốt ... một cái gì đó cho khi tôi nhận được tốt hơn lúc này. Cảm ơn một lần nữa. – MikeRand

Các vấn đề liên quan