脚本执行完成后关闭tkinter窗口

时间:2018-03-24 15:39:00

标签: python python-3.x tkinter process

我正在使用一个工具,我通过Tkinter GUI界面获取初始用户凭据和唯一标识符。在经过大量数据提取和处理后发布,我会使用xlsxwriter包在Excel工作表中进行报告。

我通常在点击按钮时使用destroy()方法退出/关闭tkinter窗口。在这里,我想在Tkinter messagebox中向用户显示报告创建的状态,然后关闭主窗口。

注意:我正在使用.pyw扩展名,因此使用该工具的最终用户不应该看到控制台。因此,一旦用户点击提交按钮,我将在窗口的页脚显示一个标签"Processing ..."

示例代码:

from tkinter import *
#Some other libraries are imported

mScrn = Tk()
mScrn.title("Report Generation Tool v1.0")
mScrn.geometry("200x180")
mScrn.resizable(False, False)

tk_uid_lbl = Label(mScrn, text="MVS1 Username")
tk_uid_lbl.pack()
tk_uid_lbl.place(x=20,y=20)

uid = StringVar()
tk_uid = Entry(mScrn, bd=3, textvariable=uid)
tk_uid.pack()
tk_uid.place(x=150, y=20)

tk_pwd_lbl = Label(mScrn, text="MVS1 Password")
tk_pwd_lbl.pack()
tk_pwd_lbl.place(x=20,y=60)

pwd = StringVar()
tk_pwd = Entry(mScrn, bd=3, show='*', textvariable=pwd)
tk_pwd.pack()
tk_pwd.place(x=150, y=60)

tk_ver_lbl = Label(mScrn, text="Version #")
tk_ver_lbl.pack()
tk_ver_lbl.place(x=20,y=100)

ver = StringVar()
tk_ver=Entry(mScrn, bd=3, textvariable=ver)
tk_ver.pack()
tk_ver.place(x=150, y=100)

tk_sub_button = Button(text='Submit', command = show_footer)
tk_sub_button.pack()
tk_sub_button.place(x=150, y=150)

mScrn.mainloop()

#The data provided in the GUI is used for access and a lot of process goes on

#Close the Tkinter window post the process is done

先谢谢。我正在使用Python3

2 个答案:

答案 0 :(得分:0)

我很难理解你的问题。我的理解是使用destroy()正是您正在寻找的。完成后使用destroy()。你基本上已经回答了自己的问题。

如果你能更彻底地解释你的问题,我会觉得很有帮助。我同意Goyo但我无法发表评论。

答案 1 :(得分:0)

  

在关闭mainloop()之前,我不知道如何获取数据。在   一旦关闭,我就无法在GUI上显示标签   然后在用户同意的情况下关闭(即在点击消息框中的“确定”后)

我不知道你的问题在哪里,你可以用很多方式,列表,模块,对象,文件等来保存你的数据。

import tkinter as tk
import random
import threading
import time

# Simulate a process
def get_data(callback):
    while True:
        if len(data) == 10:
            break
        time.sleep(.5)
        data.append(random.randint(1, 200))
    callback()


def wait_end(label, tk_var_end, num=0):
    label["text"] = "Processing " + " ." * num
    num += 1
    if num == 4:
        num = 0
    if not tk_var_end.get():
        mScrn.after(500, wait_end, label, tk_var_end, num)


def execute():
    for entry in (tk_uid, tk_pwd, tk_ver):
        entry['state'] = tk.DISABLED
    tk_sub_button.destroy()
    tk_process_lbl = tk.Label(mScrn)
    tk_process_lbl.pack()
    tk_process_lbl.place(x=150,y=150)

    tk_var_end = tk.BooleanVar(False)
    wait_end(tk_process_lbl, tk_var_end)
    process = threading.Thread(
        target=get_data,
        kwargs=(dict(callback=lambda: tk_var_end.set(True)))
    )
    process.start()

    mScrn.wait_variable(tk_var_end)
    mScrn.after(500, tk_process_lbl.config, dict(text='Process completed'))
    mScrn.after(1500, mScrn.quit)


mScrn = tk.Tk()

data = []

mScrn.title("Report Generation Tool v1.0")
mScrn.geometry("400x180")
mScrn.resizable(False, False)

tk_uid_lbl = tk.Label(mScrn, text="MVS1 Username")
tk_uid_lbl.pack()
tk_uid_lbl.place(x=20,y=20)

uid = tk.StringVar()
tk_uid = tk.Entry(mScrn, bd=3, textvariable=uid)
tk_uid.pack()
tk_uid.place(x=150, y=20)

tk_pwd_lbl = tk.Label(mScrn, text="MVS1 Password")
tk_pwd_lbl.pack()
tk_pwd_lbl.place(x=20,y=60)

pwd = tk.StringVar()
tk_pwd = tk.Entry(mScrn, bd=3, show='*', textvariable=pwd)
tk_pwd.pack()
tk_pwd.place(x=150, y=60)

tk_ver_lbl = tk.Label(mScrn, text="Version #")
tk_ver_lbl.pack()
tk_ver_lbl.place(x=20,y=100)

ver = tk.StringVar()
tk_ver= tk.Entry(mScrn, bd=3, textvariable=ver)
tk_ver.pack()
tk_ver.place(x=150, y=100)

tk_sub_button = tk.Button(text='Submit', command = execute)
tk_sub_button.pack()
tk_sub_button.place(x=150, y=150)

mScrn.mainloop()

print(data)

但是,你也可以创建自己的继承Tk的类,在这个类中你可以覆盖Tk的quit或destroy方法。