精华内容
下载资源
问答
  • 如何处理Tkinter中的窗口关闭事件

    千次阅读 2020-12-24 23:26:12
    另一种是使关闭按钮最小化窗口。您可以通过将iconify方法作为协议方法的第二个参数来重现此行为。这是一个在Windows 7上测试的工作示例:#Python3importtkinterimporttkinter.scrolledtextasscrolledtextclassGUI...

    qq_遁去的一_1

    Matt展示了关闭按钮的一个经典修改。另一种是使关闭按钮最小化窗口。您可以通过将iconify方法作为协议方法的第二个参数来重现此行为。这是一个在Windows 7上测试的工作示例:# Python 3import tkinterimport tkinter.scrolledtext as scrolledtextclass GUI(object):

        def __init__(self):

            root = self.root = tkinter.Tk()

            root.title('Test')

        # make the top right close button minimize (iconify) the main window

            root.protocol("WM_DELETE_WINDOW", root.iconify)

        # make Esc exit the program

            root.bind('', lambda e: root.destroy())

        # create a menu bar with an Exit command

            menubar = tkinter.Menu(root)

            filemenu = tkinter.Menu(menubar, tearoff=0)

            filemenu.add_command(label="Exit", command=root.destroy)

            menubar.add_cascade(label="File", menu=filemenu)

            root.config(menu=menubar)

        # create a Text widget with a Scrollbar attached

            txt = scrolledtext.ScrolledText(root, undo=True)

            txt['font'] = ('consolas', '12')

            txt.pack(expand=True, fill='both')gui = GUI()gui.root.mainloop()在此示例中,我们为用户提供了两个新的退出选项:经典文件菜单 - >退出,以及Esc按钮。

    展开全文
  • 另一种是使关闭按钮最小化窗口。您可以通过iconify方法重现此行为是协议方法的第二个参数。这是一个在Windows 7上测试的工作示例:# Python 3import tkinterimport tkinter.scrolledtext as scrolledtextclass GUI...

    Matt展示了关闭按钮的一个经典修改。

    另一种是使关闭按钮最小化窗口。

    您可以通过iconify方法重现此行为

    是协议方法的第二个参数。

    这是一个在Windows 7上测试的工作示例:

    # Python 3

    import tkinter

    import tkinter.scrolledtext as scrolledtext

    class GUI(object):

    def __init__(self):

    root = self.root = tkinter.Tk()

    root.title('Test')

    # make the top right close button minimize (iconify) the main window

    root.protocol("WM_DELETE_WINDOW", root.iconify)

    # make Esc exit the program

    root.bind('', lambda e: root.destroy())

    # create a menu bar with an Exit command

    menubar = tkinter.Menu(root)

    filemenu = tkinter.Menu(menubar, tearoff=0)

    filemenu.add_command(label="Exit", command=root.destroy)

    menubar.add_cascade(label="File", menu=filemenu)

    root.config(menu=menubar)

    # create a Text widget with a Scrollbar attached

    txt = scrolledtext.ScrolledText(root, undo=True)

    txt['font'] = ('consolas', '12')

    txt.pack(expand=True, fill='both')

    gui = GUI()

    gui.root.mainloop()

    在此示例中,我们为用户提供了两个新的退出选项:

    经典文件菜单 - > 退出,还有Esc按钮。

    展开全文
  • 今天小编就为大家分享一篇Python实现定时自动关闭tkinter窗口方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 如何在Python Tkinter程序中处理窗口关闭事件(用户单击" X"按钮)?Tkinter支持一种称为协议处理程序的机制。在这里,术语协议是指应用程序和窗口管理器之间的交互。最常用的协议称为WM_DELETE_WINDOW,用于定义当...

    如何在Python Tkinter程序中处理窗口关闭事件(用户单击" X"按钮)?

    Tkinter支持一种称为协议处理程序的机制。在这里,术语协议是指应用程序和窗口管理器之间的交互。最常用的协议称为WM_DELETE_WINDOW,用于定义当用户使用窗口管理器显式关闭窗口时发生的情况。

    您可以使用protocol方法为此协议安装处理程序(小部件必须是Tk或Toplevel小部件):

    这里有一个具体的例子:

    import tkinter as tk

    from tkinter import messagebox

    root = tk.Tk()

    def on_closing():

    if messagebox.askokcancel("Quit","Do you want to quit?"):

    root.destroy()

    root.protocol("WM_DELETE_WINDOW", on_closing)

    root.mainloop()

    我使用了类似的代码,但root.destroy()

    如果您使用的是像Twisted这样的东西来独立维护事件循环或Tkinter(例如:twists反应堆对象),请确保外部主循环已停止,并且为此目的提供了任何专门的技术(例如:twisted.reactor.stop())

    在Windows上的Python 2.7上,Tkinter没有子模块消息框。 我使用了import tkMessageBox as messagebox

    我认为您应该知道是您从其他人/其他地方复制了此答案和代码。

    我不知道,那不是我最初发布的代码。

    不为我工作。 硬关闭窗口时(例如使用Alt + F4),它不会改变经典的Python对图形中断的混乱反应。

    @MitchMcMabers:另一方面,很长一段时间以来,tkinter几乎没有任何重大变化。

    马特展示了关闭按钮的一种经典修改。

    另一种是使关闭按钮最小化窗口。

    您可以通过使用iconify方法来重现此行为

    是协议方法的第二个参数。

    这是一个在Windows 7上测试过的有效示例:

    # Python 3

    import tkinter

    import tkinter.scrolledtext as scrolledtext

    class GUI(object):

    def __init__(self):

    root = self.root = tkinter.Tk()

    root.title('Test')

    # make the top right close button minimize (iconify) the main window

    root.protocol("WM_DELETE_WINDOW", root.iconify)

    # make Esc exit the program

    root.bind('', lambda e: root.destroy())

    # create a menu bar with an Exit command

    menubar = tkinter.Menu(root)

    filemenu = tkinter.Menu(menubar, tearoff=0)

    filemenu.add_command(label="Exit", command=root.destroy)

    menubar.add_cascade(label="File", menu=filemenu)

    root.config(menu=menubar)

    # create a Text widget with a Scrollbar attached

    txt = scrolledtext.ScrolledText(root, undo=True)

    txt['font'] = ('consolas', '12')

    txt.pack(expand=True, fill='both')

    gui = GUI()

    gui.root.mainloop()

    在此示例中,我们为用户提供了两个新的退出选项:

    经典文件菜单->退出,还有Esc按钮。

    取决于Tkinter活动,尤其是在使用Tkinter.after时,使用destroy()停止此活动-即使使用protocol(),按钮等-也会干扰此活动("执行时出错"),而不是只是终止它。在几乎每种情况下,最好的解决方案是使用标志。这是一个简单,愚蠢的用法示例(尽管我敢肯定,你们大多数人都不需要它!

    from Tkinter import *

    def close_window():

    global running

    running = False

    print"Window closed"

    root = Tk()

    root.protocol("WM_DELETE_WINDOW", close_window)

    cv = Canvas(root, width=200, height=200)

    cv.pack()

    running = True;

    # This is an endless loop stopped only by setting 'running' to 'False'

    while running:

    for i in range(200):

    if not running:

    break

    cv.create_oval(i, i, i+1, i+1)

    root.update()

    这样可以很好地终止图形活动。您只需要在正确的位置检查running。

    尝试简单版本:

    import tkinter

    window = Tk()

    closebutton = Button(window, text='X', command=window.destroy)

    closebutton.pack()

    window.mainloop()

    或者,如果您想添加更多命令:

    import tkinter

    window = Tk()

    def close():

    window.destroy()

    #More Functions

    closebutton = Button(window, text='X', command=close)

    closebutton.pack()

    window.mainloop()

    我要感谢Apostolos的回答,这一点引起了我的注意。这是2019年Python 3的更加详细的示例,带有更清晰的描述和示例代码。

    注意以下事实:destroy()(或根本没有自定义窗口关闭处理程序)会在用户关闭窗口时立即破坏该窗口及其所有正在运行的回调。

    这可能对您不利,这取决于您当前的Tkinter活动,尤其是在使用tkinter.after(定期回调)时。您可能正在使用处理一些数据并将其写入磁盘的回调...在这种情况下,您显然希望数据写入完成而不会被突然终止。

    最好的解决方案是使用标志。因此,当用户请求关闭窗口时,可以将其标记为一个标志,然后对其进行响应。

    (注意:我通常将GUI设计为封装良好的类和单独的工作线程,并且我绝对不使用"全局"(我使用类实例变量),但这只是一个简单的示例,用于演示当用户关闭窗口时,Tk如何突然终止您的定期回调...)

    from tkinter import *

    import time

    # Try setting this to False and look at the printed numbers (1 to 10)

    # during the work-loop, if you close the window while the periodic_call

    # worker is busy working (printing). It will abruptly end the numbers,

    # and kill the periodic callback! That's why you should design most

    # applications with a safe closing callback as described in this demo.

    safe_closing = True

    # ---------

    busy_processing = False

    close_requested = False

    def close_window():

    global close_requested

    close_requested = True

    print("User requested close at:", time.time(),"Was busy processing:", busy_processing)

    root = Tk()

    if safe_closing:

    root.protocol("WM_DELETE_WINDOW", close_window)

    lbl = Label(root)

    lbl.pack()

    def periodic_call():

    global busy_processing

    if not close_requested:

    busy_processing = True

    for i in range(10):

    print((i+1),"of 10")

    time.sleep(0.2)

    lbl["text"] = str(time.time()) # Will error if force-closed.

    root.update() # Force redrawing since we change label multiple times in a row.

    busy_processing = False

    root.after(500, periodic_call)

    else:

    print("Destroying GUI at:", time.time())

    try: #"destroy()" can throw, so you should wrap it like this.

    root.destroy()

    except:

    # NOTE: In most code, you'll wanna force a close here via

    #"exit" if the window failed to destroy. Just ensure that

    # you have no code after your `mainloop()` call (at the

    # bottom of this file), since the exit call will cause the

    # process to terminate immediately without running any more

    # code. Of course, you should NEVER have code after your

    # `mainloop()` call in well-designed code anyway...

    # exit(0)

    pass

    root.after_idle(periodic_call)

    root.mainloop()

    该代码将向您显示WM_DELETE_WINDOW处理程序即使在我们的自定义periodic_call()忙于工作/循环的过程中仍在运行!

    我们使用一些非常夸张的.after()值:500毫秒。这只是为了使您很容易看到定期呼叫忙时关闭与否之间的区别...如果在数字更新时关闭,您将看到WM_DELETE_WINDOW在定期呼叫时发生呼叫"正在处理:True"。如果您在数字暂停时关闭(这意味着此时不处理定期回调),则会看到关闭发生在"不忙"期间。

    在实际使用中,您的.after()将使用30到100毫秒之类的时间来具有响应GUI。这只是一个演示,可以帮助您了解如何保护自己免受Tk的默认"关闭时立即中断所有工作"的行为。

    总结:使WM_DELETE_WINDOW处理程序设置一个标志,然后在安全的情况下(当您的应用程序完成所有工作时)定期并手动检查该标志.destroy()窗口。

    PS:您也可以使用WM_DELETE_WINDOW询问用户是否真的要关闭窗口;如果他们回答"否",则无需设置标志。非常简单您只需在WM_DELETE_WINDOW中显示一个消息框,然后根据用户的答案设置标志即可。

    使用closeEvent

    def closeEvent(self, event):

    # code to be executed

    这个答案需要更多细节。 这条线放在哪里? 在我这边摆弄一点似乎无法使它正常工作。

    展开全文
  • 如果我们点击tkinter窗口程序的关闭按钮(X,一般在右上角),窗口会被关闭,这个过程实际上调用了窗口的destroy函数,本文介绍如何响应这个窗口关闭事件,不让tkinter系统自动调用destroy函数,而是调用一个自定义...

    如果我们点击tkinter窗口程序的关闭按钮(X,一般在右上角),窗口会被关闭,这个过程实际上调用了窗口的destroy函数,本文介绍如何响应这个窗口关闭事件,不让tkinter系统自动调用destroy函数,而是调用一个自定义的函数,或者先运行一段自定义的代码,最后自己再调用destroy。

    先上代码:

    >>> import tkinter as tk
    >>> root = tk.Tk()
    >>> root.protocol('WM_DELETE_WINDOW', root.iconify)
    ''
    >>> root.protocol('WM_DELETE_WINDOW', root.destroy)
    ''
    >>> root.protocol('WM_DELETE_WINDOW', customized_function)
    

    使用protocol函数,绑定关闭事件到一个指定的函数入口。如果绑定root.iconify,点击关闭(X),就是最小化窗口,而不是关闭。

    您也可以自己写一个函数,先执行一段自己的代码,最后调用destroy函数。protocol函数肯定还可以绑定其它事件,我暂时还不会,以后再慢慢学习和分享。了解了这个基本逻辑,学习其它事件也很容易了 。

    在程序中可以写在相应的mainloop().之前,我试了,可以实现

    展开全文
  • 主要介绍了Python TKinter如何自动关闭窗口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 如何关闭Tkinter窗口

    千次阅读 2020-12-04 01:23:21
    您应该destroy()用来关闭tkinter窗口。from Tkinter import *root = Tk()Button(root, text="Quit", command=root.destroy).pack()root.mainloop()说明:root.quit()上面的行只是绕过了root.mainloop()ie root....
  • 在调试过程中,发现当gui界面的窗口关闭后,后台程序还在运行,并没有终止程序。 二:解决方法 让每一个子线程在开启之前设置一个守护线程,这样就可以在主线程结束之后,同时也能停止子线程。 Button(myWindow,...
  • 转:...from tkinter import * import tkinter.messagebox as messagebox class Application(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.pack() self.cr
  • 单击“否”时,新窗口关闭。单击“是”时,两个窗口都将关闭。在我让我的代码工作,但我很确定有一个更好或更聪明的方法。在为了让它成功,我不得不写下根目录。销毁()“在“关闭窗口”方法中,但我很确定有一种更...
  • 如何按下按钮关闭Tkinter窗口

    千次阅读 2021-01-13 17:57:05
    您可以创建一个扩展TkinterButton类的类,该类将通过将destroy方法与其command属性关联来专门关闭窗口:from tkinter import *class quitButton(Button):def __init__(self, parent):Button.__init__(self, parent)...
  • I'm trying to close the previous window when I click the button to go to the next window. I'm not being able to do it....from tkinter import *def newwindow2():newwindow.destroy()newwindow2 ...
  • 下面是一个在Windows 7上测试的工作示例:# Python 3import tkinterimport tkinter.scrolledtext as scrolledtextclass GUI(object):def __init__(self):root = self.root = tkinter.Tk()root.title('Test')# make ...
  • 展开全部采用的是main函数对主窗口运行程序完毕自动关闭的命令:from tkinter import *def main():root = Tk()b = Button(root, text='退出', command=root.quit)b.pack()mainloop()if __name__ == '__main__':main...
  • How do I handle the window close event (user clicking the 'X' button) in a Python Tkinter program?解决方案Tkinter supports a mechanism called protocol handlers. Here, the term protocol refers to the ...
  • Tkinter 定时退出问题 查询了很多资料,大多数都是多线程使用延时调用 destroy 来实现的,这个是可以实现,但是如果你后面还需要重新创建窗口,就会出现问题,比如报错 如: 主线程不在主循环 无法调用image 命令,...
  • 我想您要说的是,从对话框中选择文件后,您创建的用于按住按钮的Tkinter窗口没有关闭.要做到这一点,您需要重新调整程序.首先,您需要显式创建一个Tk窗口来按住按钮:root = Tk()然后,您应该将此窗口列为按钮的父级:...
  • 处理通常需要30-60秒,在此期间,我希望:向用户提供活动和进度的文本更新阻止用户关闭应用程序,直到它完成所做的操作我开始的路线是让文本更新出现在配置为trainsient的子窗口中,并使用wait_window暂停主循环,...
  • tkinter模块的root窗口和Toplevel窗口,都有destroy函数,调用此函数可以起到销毁窗口关闭程序的效果。不过,关闭root窗口的代码不能够在其它线程中执行,这样可以关闭窗口,但是程序无法正常退出。比如下面这段代码...
  • 【python3】 tkinter解决子窗口关闭以及重复打开的问题1.背景2.解决办法3.代码 1.背景 python内置GUI模块tkinter,实现界面的时候,可能会遇到: 1.主窗体关闭子窗体还存在; 2.多次点击主窗体的按钮,子窗体会...
  • from tkinter import * windows = Tk() windows.geometry("200x200") def b(): windows.destroy() #关掉老窗口 root = Tk() Label(root,text="这是新的窗口").pack() root.focus_force() #新窗口获得焦点 ...
  • 新的窗口中需要点击选择并返回选择内容,选择遇到一个问题,点击右上角关闭按钮x的时候会报错,有什么帮忙屏蔽按钮或者处理这个报错,新窗口代码: ``` import tkinter as tk from tkinter import * around_wifi...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,111
精华内容 1,644
关键字:

tkinter窗口关闭事件