【问题标题】:Tkinter Text closes but ipython console keeps running indefinetlyTkinter Text 关闭但 ipython 控制台继续无限期运行
【发布时间】: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

标签: python pandas tkinter


【解决方案1】:

picture

我是新来的(页面),但错误是主循环本身就是一个循环如果关闭窗口,程序就会关闭。

root_window.mainloop()
#destroy()use in ithems or daughters windows

测试添加: def date_name(self):

    t3 = Toplevel(root)
    t3.geometry('240x100+20+20')
    t3.title("...")
    t3.destroy()#use valid

该窗口中的数据样本和函数destroy()。

如果您想从同一个窗口请求数据,但文本和按钮的字段属于 cambas,请了解如何使用 Canvas 和 Frame ......好吧,我在 tkinter 中就是这样工作的。

canvas_menu = Canvas(root, width=200, height=200)
canvas_menu.destroy()#this use valid 

root.destroy 无效 Tk() 是一个函数。

测试:

from tkinter import *
from tkinter import ttk
root=Tk()
def new_window():
    t3 = Toplevel(root)
    t3.geometry('240x100+20+20')
    t3.title("...")
    Label(t3,text="I hope to help you").pack()
    Button(t3,text="destroy() in t3 ",command=t3.destroy).pack()
canvas_c=Canvas(root, width=400, height=400)
canvas_c.pack()
canvas_c.config(bg="blue")
Label(canvas_c,text="info").place(x=100,y=250)

ba=Button(root,text="new_window",command=new_window).pack()
bb=Button(root,text="destroy() in canvas",command=canvas_c.destroy).pack()
root.mainloop()

然后运行run.jpg

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 2016-07-07
    • 2013-09-11
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多