我是一个Python(3.1.2)/ emacs(23.2)新手教我自己tkinter使用pythonware教程here。相关代码粘贴在问题下方。
问题:当我点击Hello按钮(它应该调用say_hi函数)时,为什么劣质python shell(即我用Cc Cc启动的那个)等待执行say_hi打印功能,直到我a)点击退出按钮或b)关闭根小部件?当我在IDLE中尝试相同时,每次单击Hello按钮都会在IDLE python shell中立即打印,甚至在我单击Quit或关闭根小部件之前。
emacs运行Python shell(相对于IDLE)会导致这种“滞后”行为吗?我已经注意到类似的emacs滞后与IDLE,因为我已经解决了Project Euler问题,但这是我见过的最明显的例子。
仅供参考:我使用python.el并且有一个相对干净的init.el ......
(setq python-python-command“d:/ bin / python31 / python”)
是我的init.el中的唯一一行。
谢谢,
麦克
===开始代码===
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 :(得分:4)
我猜想没有附加到tty,Python解释器(通过C stdio)切换到缓冲行缓冲的块,并且在关闭之前不会刷新stdout。在“Inferior Python:运行Shell Compile”缓冲区中运行os.isatty(1)
会返回false,从而增加了此猜测的权重。
def say_hi(self):
print("hi there, everyone!")
sys.stdout.flush()
可能会有所作为。