【发布时间】:2019-02-11 03:45:51
【问题描述】:
我正在尝试为我的 tkinter GUI 的用户打印一些熊猫数据框行。但是,在这个测试中,tk 窗口是显示的,但是当关闭时,代码会停止运行。
import pandas as pd
import numpy as np
import sys
from tkinter import *
dates = pd.date_range('20160101', periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
root = Tk()
t1 = Text(root)
t1.pack()
class PrintToT1(object):
def write(self, s):
t1.insert(END, s)
sys.stdout = PrintToT1()
print ('Hello, world!')
print (df)
mainloop()
root.destroy()
print(2)
我在 Spyder 中运行脚本,当我关闭窗口时,ipython 控制台继续处理某些内容,但它从未到达最后一行打印数字 2,我必须手动重新启动控制台。
我希望它关闭 tk 窗口并继续执行脚本,因为在 GUI 中,关闭 tk 窗口后,代码将不得不为用户做一些计算。我怎么能这样做?
【问题讨论】:
-
我不知道这是否与它有关,但
mainloop通常在根窗口被破坏之前不会返回。事后调用destroy应该会引发错误。也许该错误导致 ipython 控制台出现问题。 -
如果你在控制台中执行你的脚本,你会得到异常。尝试一一修复异常:1)在
PrintToT1类中添加一个虚拟的flush()函数; 2)在分配给PrintToT1()之前保存sys.stdout; 3) 删除root.destroy(); 4)在print(2)之前恢复sys.stdout。