为什么 destroy() 在此代码中不起作用



这是我正在尝试编写的一个简单的测试脚本,它将帮助我自学tkinter...

from tkinter import *
def hello():
   print("U pressed it lol")
global window1, window2
window2 = None
window1 = None
def setWindow(windowEnter):
   global window
   window = windowEnter
   window = Tk()
   window.attributes("-fullscreen", True)
def newScreen(newScreen, screenToDelete):
   setWindow(newScreen)
   print("New Window Created")
   screenToDelete.destroy()
   print("He ded lol")
setWindow(window1)
def setStuff():
   button = Button(window1, text="hey", command=hello)
   label = Label(window1, text="YoYoYo My dude")
   button2 = Button(window1, text="Next Page", command = lambda: newScreen(window2, window1))
   button.pack()
   label.pack()
   button2.pack()
setStuff()

当我运行此代码时,它会返回错误?

File "C:Users26341Desktoptest.py", line 19, in newScreen
screenToDelete.destroy()
AttributeError: 'NoneType' object has no attribute 'destroy'

为什么这不起作用以及我该如何解决它?

提前致谢:)(顺便说一句,我正在使用python 3.6(

你设置

window2 = None
window1 = None

作为全局变量,然后定义命令函数,button2

lambda: newScreen(window2, window1)

它调用newScreen的值 window2 和 window1 都是None的,因此错误。这里的根本问题是您的setWindow函数:

def setWindow(windowEnter):
    global window
    window = windowEnter
    window = Tk()
    window.attributes("-fullscreen", True)

这不符合您使用它的方式。当你调用setWindow(window1)时,你传递了window1的值,函数对变量的作用在全局范围内是看不到的。一个简单的例子是这样的:

def increment(a):
    a +=1
x = 1
print(x)
increment(x)
print(x)

这将打印 1 两次。

为了实现你想要的,我建议你使用字典来跟踪你的窗口。

from tkinter import *
def hello():
   print("U pressed it lol")
global window1, window2
windows = {}

def setWindow(window_name):
   windows[window_name] = Tk()
   windows[window_name].attributes("-fullscreen", True)
def newScreen(newScreen_name, screenToDelete_name):
   setWindow(newScreen_name)
   print("New Window Created")
   windows[screenToDelete_name].destroy()
   del windows[screenToDelete_name] #delete invalid entry from dict
   print("He ded lol")
setWindow("window1")
def setStuff():
   button = Button(windows["window1"], text="hey", command=hello)
   label = Label(windows["window1"], text="YoYoYo My dude")
   button2 = Button(windows["window1"], text="Next Page", command = lambda: newScreen("window2", "window1"))
   button.pack()
   label.pack()
   button2.pack()
setStuff()

注意:以前你的函数是def newScreen(newScreen, screenToDelete)的,这是非常混乱/糟糕的风格,因为函数和它的第一个参数共享相同的名称。无论如何,我还是更改了它以强调它现在将字符串作为参数,但请记住它。

我现在

无法测试它,但我发现了一个错误来源:

lambda: newScreen(window2, window1)

这将创建一个不接受任何参数的lambda函数,因此window2和window1将是None,而None没有destroy((方法,因此错误。相反,请尝试:

lambda window2, window1: newScreen(window2, window1)

相关内容

最新更新