我做了一个小玩具命令窗口,TK,目前试图使它复制一些解释的行为。
我以前从来没有仔细检查的解释,但对何时打印值决定是有点神秘。
>>> 3 + 4 # implied print(...)
7
>>> 3 # implied print(...)
3
>>> a = 3 # no output, no implied print(...), bc result is None maybe?
>>> None # no output, no print(...) implied... doesn't like None?
>>> print(None) # but it doesn't just ban all Nones, allows explicit print()
None
>>> str(None) # unsurprising, the string 'None' is just a string, and echoed
'None'
我们的目标是模仿这种行为,打印一些诺内斯,不是别人(稍微复杂一些做,因为我不能完全确定规则是什么)。
所以,把我的计划,我有history_text和entry_text,这是上面的控制在tk窗口输入框的标签STRINGVAR()秒。 那么下面的事件被绑定到回车键,处理命令和更新其结果的历史。
def to_history(event):
print("command entered") # note to debugging window
last_history = history_text.get()
# hijack stdout
buffer = io.StringIO('')
sys.stdout = buffer
# run command, output to buffer
exec(entry_text.get())
# buffered output to a simple string
buffer.seek(0)
buffer_str = ''
for line in buffer.readlines():
# maybe some rule goes here to decide if an implied 'print(...)' is needed
buffer_str = buffer_str + line + '\n'
# append typed command for echo
new_history = entry_text.get() + '\n' + buffer_str
# cleanup (let stdout go home)
sys.stdout = sys.__stdout__
buffer.close()
history_text.set(last_history + "\n" + new_history)
entry_text.set('')
由于是,它不提供关于“3”或“无”或甚至“3 + 4”的一个简单的条目的任何输出。 添加一个隐含的print()语句中的所有的时间似乎过于频繁打印,我没有跳过“无”或“A = 3”类型的报表打印。
我发现sys.displayhook,这似乎支配翻译时将实际显示的结果一些文件,但我不知道如何在这里使用它。 我想我可能只是换sys.displayhook()在我的exec()调用,并让它做所有这些工作对我来说...却发现这并不意味着打印()像“3 + 4”或语句的表述'3'。
有什么建议么? 我在正确的轨道上sys.displayhook上?