为什么destroy()在这段代码中不起作用?

2024-09-29 17:14:18 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个简单的测试脚本,我试图写这将有助于我教自己关于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:\Users\026341\Desktop\test.py", line 19, in newScreen
screenToDelete.destroy()
AttributeError: 'NoneType' object has no attribute 'destroy'

为什么不起作用&我该如何修复它?你知道吗

提前感谢:) (顺便说一句,我使用的是python3.6)


Tags: texthellotkinterdefwindowglobalpackprint
2条回答

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

lambda: newScreen(window2, window1)

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

lambda window2, window1: newScreen(window2, window1)

你准备好了吗

window2 = None
window1 = None

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

lambda: newScreen(window2, window1)

它使用值window2和window1调用newScreen,这两个值都是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),这是非常混乱/糟糕的样式,因为函数和它的第一个参数都使用相同的名称。无论如何,我还是修改了它,以强调它现在将字符串作为参数,但请记住这一点,以备将来使用。你知道吗

相关问题 更多 >

    热门问题