Với chỉnh sửa tối thiểu để mã của bạn (Không chắc chắn nếu họ đã dạy các lớp hay không trong khóa học của bạn), sự thay đổi:
def close_window(root):
root.destroy()
để
def close_window():
window.destroy()
và nó cũng làm việc .
Giải thích:
Phiên bản của bạn close_window
được định nghĩa để mong đợi một đối số duy nhất, cụ thể là root
. Sau đó, mọi cuộc gọi đến phiên bản close_window
của bạn cần phải có đối số đó hoặc Python sẽ cung cấp cho bạn lỗi thời gian chạy .
Khi bạn tạo một Button
, bạn đã yêu cầu nút chạy close_window
khi được nhấp. Tuy nhiên, mã nguồn cho tiện ích Nút là một cái gì đó như:
# 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.
#...
Khi mã của tôi nêu rõ, lớp Button
sẽ gọi hàm của bạn mà không có đối số. Tuy nhiên chức năng của bạn đang mong đợi một đối số. Vì vậy, bạn đã có một lỗi. Vì vậy, nếu chúng ta đưa ra lập luận rằng, do đó gọi hàm sẽ thực hiện bên trong lớp Button, chúng tôi đang trái với:
def close_window():
root.destroy()
Đó là không đúng, tuy nhiên, một trong hai, vì root
không bao giờ được gán một giá trị.Nó sẽ giống như nhập vào print(x)
khi bạn chưa xác định x
.
Nhìn vào mã của bạn, tôi đã tìm bạn muốn gọi destroy
trên window
, vì vậy tôi đã thay đổi root
thành window
.
Hey Matt. Cảm ơn bạn đã có một câu hỏi rõ ràng, và một ví dụ mã đơn giản và sạch sẽ để đi cùng. Bạn cũng có thể đảm bảo bao gồm truy nguyên (sự cố) trong tương lai khi mã của bạn "không hoạt động"? Điều đó cũng sẽ giúp mọi người gần như ngay lập tức tìm ra phần nào của mã của bạn bị hỏng. Rõ ràng trong trường hợp này, mẫu mã của bạn quá nhỏ nên dễ nhận biết, nhưng nó thực sự có thể giúp bạn nhận được câu trả lời trong tương lai về những tình huống khó khăn hơn. – jdi
Đối với bất kỳ ai không thấy ngay vấn đề, lỗi là 'TypeError: close_window() thiếu 1 đối số vị trí bắt buộc: 'root''. Điều này có nghĩa là không có đối số nào được chuyển tới hàm gọi lại 'close_window', vì không bao giờ có các hàm' command = '. Ràng buộc gọi lại sự kiện không nhận được một đối số - đối tượng sự kiện. –