【问题标题】:How to close a tkinter dialog box after running another function?运行另一个函数后如何关闭 tkinter 对话框?
【发布时间】:2021-08-13 19:04:29
【问题描述】:

我正在使用 python tkinter 并弹出一个对话框窗口。我在框中有两个按钮:

from tksheet import Sheet
from tkinter import *
import os 
import sys
import mapMaker2


root=Tk()
root.title('Map Tool')
root.geometry("750x750")


sheetframe = Frame(root)
sheetframe.grid(row = 0, column = 0,)


buttonEditlabel = Button(sheetframe, text='Edit Labels', width=12, command=lambda: [openEditWindow()], bg='#cacccf',fg='black')
buttonEditlabel.grid(row = 0, sticky=W, column = 0, pady = (25,5), padx = (50,0))


def openEditWindow():

    top = Toplevel(root)
    top.geometry("260x195")
    top.title('Edit Axes Labels')
    frm = Frame(top, borderwidth=0, relief='ridge')
    frm.grid(row = 0, column = 0, pady = (20,0),padx=(20,0))


    b_cancel = Button(frm, text='Close', width=10)
    b_cancel['command'] = top.destroy
    b_cancel.grid(column = 0, row = 6, pady = (15,0),padx=(0,0))

    b_save = Button(frm, text='Save', width=10)
    b_save['command'] = lambda: editLabels()
    b_save.grid(column = 1, row = 6, sticky = E, pady = (15,0),padx=(0,0))


    def editLabels():
        pass


mainloop()

Cancel 按钮使用top.destroy 命令关闭窗口。我希望 Save 按钮在首先运行 editLabels() 函数后也关闭窗口。我试过了:

b_save['command'] = [lambda: editLabels(), top.destroy]

但这不起作用。

【问题讨论】:

  • 您能否提供一个更完整的minimal reproducible example (MRE),至少包括对话框的构造?
  • 只要写一个函数,传函数名即可。 b_save['command'] = editLabels。现在你可以让editLabels 打电话给top.destroy()
  • 我添加了一个 MRE,添加 top.destroy 到 editLabels 函数对我不起作用,它不执行 top.destroy

标签: python tkinter tk


【解决方案1】:

这是您可以做到的一种方法。创建一个函数来销毁顶部窗口。

def kill_main():
    top.destroy()
    top.update()

然后在任何你想要的地方调用函数。您不必将 kill_main() 添加到按钮本身。只需将它放在您正在打开的下一个函数中,这样它就会首先关闭顶部窗口,然后运行 ​​editlabels() 函数的其余部分。希望这对您有意义。

def editLabels():
    kill_main()
    pass

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 2015-05-24
    • 2016-09-23
    • 2011-06-30
    • 1970-01-01
    • 2012-11-10
    相关资源
    最近更新 更多