Как закрыть окно Tkinter нажатием кнопки? - PullRequest
21 голосов
/ 03 апреля 2012

Напишите приложение с графическим интерфейсом с кнопкой с надписью "Good-bye".При нажатии Button окно закрывается.

Это мой код, но он не работает.Кто-нибудь может мне помочь с моим кодом?

from Tkinter import *

window = Tk()

def close_window (root): 
    root.destroy()

frame = Frame(window)
frame.pack()
button = Button (frame, text = "Good-bye.", command = close_window)
button.pack()

window.mainloop()

Ответы [ 6 ]

29 голосов
/ 03 апреля 2012

С минимальным редактированием вашего кода (Не уверен, что они учили классы или нет в вашем курсе), измените:

def close_window(root): 
    root.destroy()

на

def close_window(): 
    window.destroy()

, и это должно работать,


Объяснение:

Ваша версия close_window определена для ожидания одного аргумента, а именно root.Впоследствии любые вызовы вашей версии close_window должны иметь этот аргумент, или Python выдаст вам ошибку во время выполнения .

Когда вы создали Button, вы сказаликнопка для запуска close_window при нажатии.Однако исходный код для виджета Button выглядит примерно так:

# class constructor
def __init__(self, some_args, command, more_args):
    #...
    self.command = command
    #...

# this method is called when the user clicks the button
def clicked(self):
    #...
    self.command() # Button calls your function with no arguments.
    #...

Как говорится в моем коде, класс Button будет вызывать вашу функцию без аргументов.Однако ваша функция ожидает аргумент.Таким образом, у вас была ошибка.Итак, если мы уберем этот аргумент, чтобы вызов функции выполнялся внутри класса Button, у нас останется:

def close_window(): 
    root.destroy()

Хотя это не так, потому что root никогда не бываетприсвоено значение.Это было бы похоже на ввод print(x), когда вы еще не определили x.

Глядя на ваш код, я решил, что вы хотите позвонить destroy на window, поэтому я изменил root на window.

10 голосов
/ 03 апреля 2012

Вы можете создать класс, расширяющий класс Tkinter Button, который будет специализирован для закрытия вашего окна, связав метод destroy с его атрибутом command:

from tkinter import *

class quitButton(Button):
    def __init__(self, parent):
        Button.__init__(self, parent)
        self['text'] = 'Good Bye'
        # Command to close the window (the destory method)
        self['command'] = parent.destroy
        self.pack(side=BOTTOM)

root = Tk()
quitButton(root)
mainloop()

Это вывод:

enter image description here


И причина, по которой ваш код не работал раньше:

def close_window (): 
    # root.destroy()
    window.destroy()

У меня небольшое ощущение, что вы могли бы получить рут из другого места, поскольку вы сделали window = tk().

Когда вы вызываете команду разрушения на window в Tkinter, это означает уничтожение всего приложения, поскольку ваше window (корневое окно) является основным окном для приложения. ИМХО, я думаю, тебе стоит сменить window на root.

from tkinter import *

def close_window():
    root.destroy()  # destroying the main window

root = Tk()
frame = Frame(root)
frame.pack()

button = Button(frame)
button['text'] ="Good-bye."
button['command'] = close_window
button.pack()

mainloop()
6 голосов
/ 31 января 2015

Вы можете напрямую связать функциональный объект window.destroy с атрибутом command вашего button:

button = Button (frame, text="Good-bye.", command=window.destroy)

Таким образом, вам не понадобится функция close_window, чтобы закрыть окно для вас.

2 голосов
/ 16 августа 2018
from tkinter import *

window = tk()
window.geometry("300x300")

def close_window (): 

    window.destroy()

button = Button ( text = "Good-bye", command = close_window)
button.pack()

window.mainloop()
2 голосов
/ 28 сентября 2014

Вы можете использовать lambda для передачи ссылки на объект window в качестве аргумента функции close_window:

button = Button (frame, text="Good-bye.", command = lambda: close_window(window))

Это работает, потому что атрибут command ожидает вызываемого или вызываемого объекта. lambda является вызываемым, но в данном случае это, по сути, результат вызова данной функции с заданными параметрами.

По сути, вы вызываете лямбда-оболочку функции, у которой нет аргументов, а не самой функции.

0 голосов
/ 01 сентября 2016
from tkinter import *

def close_window():
    import sys
    sys.exit()

root = Tk()

frame = Frame (root)
frame.pack()

button = Button (frame, text="Good-bye", command=close_window)
button.pack()

mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...