【问题标题】:Tkinter window to be shut and control flow to be returned automatically关闭 Tkinter 窗口并自动返回控制流
【发布时间】:2013-10-25 12:01:20
【问题描述】:

我有一个调用此类的 drawWorld() 函数的外部脚本。 我希望绘图显示 1-2 秒,然后关闭并且控件返回到主脚本。 我可以设法让窗口随着线条消失

root.after(1000, lambda: root.destroy())

但我无法将流程返回到主脚本。 我试过了

root.after(1000, lambda: root.quit())

但它不起作用。

这是我的 Tkinter 类代码:

from Tkinter import Tk, Canvas, Frame, BOTH

class World(Frame):

def __init__(self, parent):
    Frame.__init__(self, parent)   
    self.parent = parent              
    self.parent.title("CliffWorld")        
    self.pack(fill=BOTH, expand=1)

    canvas = Canvas(self)        

    canvas.create_rectangle(4, 4, 31, 31, 
        outline="#f11", fill="#1f1", width=1)
    canvas.pack(fill=BOTH, expand=1)


def drawWorld():
    root = Tk()
    ex = World(root)
    root.geometry("330x220+300+300")
    root.after(1000, lambda: root.destroy())
    root.after(1000, lambda: root.quit())
    root.mainloop() 

【问题讨论】:

  • 什么是“我无法将流程返回到主脚本”和“但它不起作用。”意思是?它会崩溃吗?程序是否挂起?您收到错误消息吗?您能否提供一个说明完整问题的最小脚本 - 调用此函数然后在函数退出时尝试继续的过程代码?
  • 主脚本调用 drawWorld() 函数,因此控制流转移到这部分代码。我使用 root.destroy() 删除窗口并且它可以工作,而应该退出 tk 环境(并让脚本的其余部分运行)的 root.quit() 没有。我很抱歉没有具体说明,但我的意思是不工作=不退出。基本上它保持打开状态,直到我手动退出它(Ctrl-C)。我的外部代码很简单:import tkWorld tkWorld.drawWorld(); print "end" 我无法到达打印行。我希望tk窗口弹出并在1s后死亡。
  • 您的示例中的缩进不正确。

标签: python window tkinter destroy quit


【解决方案1】:

在对您的问题的评论中,您写道您的主程序就是这样:

import tkWorld
tkWorld.drawWorld()
print "end"

当我在程序中使用它并使用您的示例代码(修复缩进后)时,它工作正常。我看到窗口出现了一秒钟,然后消失了,然后我发送打印在控制台上的“结束”。

无论 lambda 调用 root.quit() 还是 root.destroy(),它都有效。

from Tkinter import Tk, Canvas, Frame, BOTH

class World(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)   
        self.parent = parent              
        self.parent.title("CliffWorld")        
        self.pack(fill=BOTH, expand=1)

        canvas = Canvas(self)        

        canvas.create_rectangle(4, 4, 31, 31, 
            outline="#f11", fill="#1f1", width=1)
        canvas.pack(fill=BOTH, expand=1)


def drawWorld():
    root = Tk()
    ex = World(root)
    root.geometry("330x220+300+300")
    root.after(1000, lambda: root.destroy())
    root.after(1000, lambda: root.quit())
    root.mainloop() 

if __name__ == "__main__":
    import tkWorld
    tkWorld.drawWorld()
    print "end"

【讨论】:

  • 谢谢 Bryan,我在另一台机器上试过了,它可以工作。我现在有点担心我的问题可能是什么。还是谢谢你!!
猜你喜欢
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
相关资源
最近更新 更多