Tkinter按钮动作

时间:2017-12-20 21:04:27

标签: python python-2.7 tkinter

我从更大的脚本中获得了以下python 2.7代码段。

Constraint

所以我的整个代码会产生一个包含图像,文本和按钮的tkinter窗口。 现在按钮应该触发命令关闭Tkinter窗口,然后重新运行整个脚本,它就可以了。当我再次单击刷新按钮时,会发生奇怪的事情。窗口不再关闭,但脚本仍然启动,但是出现此错误。

def RefreshAction():
    execfile("SatTracker.py")

def CloseWindow():
    window.destroy()

button = tk.Frame(window)
button = tk.Button(text='Refresh Data', width=25,command=lambda:[CloseWindow(),RefreshAction()])
button.pack()
window.mainloop()

有效地阻止一切。 现在我不一定需要它来关闭旧的tkinter窗口,只要我单击按钮,脚本再次运行并开始使用新的更新数据更新当前窗口。

所以无论哪种方法来解决这个问题都很好。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

不要破坏您的应用程序根窗口。如果销毁窗口,则无法再使用其子窗口小部件。使用Tk()创建一个根窗口,然后使用该窗口调用.mainloop()。然后创建一个你需要Toplevel的窗口。您可以关闭那个并随时重新创建它。

另外,我不明白为什么要再次运行整个脚本。您只想调用重新创建Toplevel的代码(可能是因为您没有Toplevel ...)

答案 1 :(得分:1)

基于this answer & comments,以下脚本在按下按钮时重新启动脚本:

import os
import sys

import tkinter as tk

window = tk.Tk()

def restart():
    #CloseWindow()
    RefreshAction()

def RefreshAction():
    os.execl(sys.executable, *([sys.executable]+sys.argv))

def CloseWindow():
    window.destroy()
    #quit()

button = tk.Frame(window)
button = tk.Button(text='Refresh Data', width=25,command=restart)
button.pack()
window.mainloop()

虽然在我的结尾有错误,因为我的用户名中有空格。总而言之,你应该像下面的代码一样,除非你有全局变量或其他东西:

import tkinter as tk

def restart(root):
    CloseWindow(root)
    RefreshAction()

def RefreshAction():
    main()

def CloseWindow(root):
    root.destroy()

def main():
    window = tk.Tk()
    button = tk.Frame(window)
    button = tk.Button(text='Refresh Data', width=25,
                        command= lambda arg=window: restart(arg))
    button.pack()
    window.mainloop()

main()

另外,您可能希望看到有关如何构建tkinter程序的this question & answers。我使用的模板与Bryan的模板非常相似。