Przy minimalnym do edycji kodu (nie wiem, czy oni prowadził zajęcia lub nie w trakcie), zmień:
def close_window(root):
root.destroy()
do
def close_window():
window.destroy()
i powinno działać .
Objaśnienie:
Twoja wersja close_window
definiuje się spodziewać jeden argument, a mianowicie root
. Następnie wszelkie wywołania twojej wersji close_window
muszą mieć ten argument, lub Python da ci błąd czasu wykonania.
Po utworzeniu Button
po kliknięciu przycisku wyświetlił się komunikat o uruchomieniu close_window
. Jednak kod źródłowy widget przycisk jest coś takiego:
# 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.
#...
W moich stanów kodowych, klasa Button
wezwie swoją funkcję bez argumentów. Jednak twoja funkcja oczekuje sporu. W ten sposób wystąpił błąd. Tak więc, jeśli weźmiemy się ten argument, tak aby wywołanie funkcji wykona wewnątrz klasy Buttona, jesteśmy w lewo z:
def close_window():
root.destroy()
To nie jest w porządku, chociaż, albo, ponieważ root
nie jest przypisana wartość.To byłoby jak pisanie w print(x)
, kiedy jeszcze nie zdefiniowałeś x
.
Patrząc na kod, pomyślałem chciał zadzwonić destroy
na window
, więc zmieniłem root
do window
.
Hej Matt. Dziękuję za jasne pytanie i czysty i prosty przykład kodu, który należy dołączyć. Czy mógłbyś również uwzględnić traceback (awarię) w przyszłości, gdy twój kod "nie działa"? Pomoże to również ludziom niemal natychmiast zorientować się, która część twojego kodu jest zepsuta. Oczywiście w tym przypadku przykład kodu jest tak mały, że łatwo go zidentyfikować, ale może naprawdę pomóc w uzyskaniu odpowiedzi w przyszłości w trudniejszych sytuacjach. – jdi
Dla każdego, kto nie od razu zauważył problem, błąd jest następujący: "TypeError: close_window() brakuje 1 wymaganego argumentu pozycyjnego:" root''. Oznacza to, że nie było żadnego argumentu przekazywanego do wywołania zwrotnego 'close_window', ponieważ nigdy nie ma funkcji' command = '. Odebrane wywołania zwrotne zdarzenia otrzymują argument - obiekt zdarzenia. –