尝试在函数中配置时未定义画布小部件

2024-04-20 04:22:21 发布

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

所以我遇到了一个问题,每当我打开商店窗口,单击attackup 1按钮,当附加到它的命令运行时,它说attackUp1变量没有定义,即使它被设置为小部件。在我的代码处有一个峰值:

#opens shop canvas where you buy upgrades
def shop():
    global shop
    root = Tk()
    root.title("Shop")
    shop = Canvas (root, width = 150, height = 400, bg = "blue")
    shop.pack()
    attackUp1 = shop.create_window(77, 50, window = Button(shop, text = "Attack Up 1\n20 coins", font = ("calibri" , 20), command = attackIncreaser1))
    #attackUp2 = shop.create_window(77, 100, window = Button(shop, text = "Attack Up 2\n60 coins", font = ("calibri" , 20), command = shoot))

#runs when someone buys the attackUp1 upgrade and changes their stats or says that they don't have enough coins
def attackIncreaser1():
    global attack
    global attackPower
    global coins
    global shop
    global attackUp1

    if coins < attackUp1Price:
        attackUp1.config(text="Not enough coins")
    elif coins >= attackUp1Price:            
        attackPower = attackPower + 1
        attackUp1.config(text="")
        time.sleep(0.5)
        attackUp1.config(text="Attack Up 1\n20 coins")

Tags: textconfigdefcreatebuttonrootshopwindow
1条回答
网友
1楼 · 发布于 2024-04-20 04:22:21

这段代码没有运行,这意味着我必须猜测缺少什么,然后添加它才能进行调试。所以我的评论可能无关紧要。。。你知道吗

我不建议在函数中创建根窗口。你知道吗

变量attackUp1是在函数shop()中创建的,函数使它成为局部变量。当函数退出时,它将被垃圾收集。你知道吗

变量attackUp1的类型是int。这就是画布对象的本质。如果要更改按钮文本,则需要保存对按钮的引用。你知道吗

更新 当我再次查看这段代码时,我想知道为什么要在函数中创建一个Tk()实例,在我看来,您可能正在打开一个新窗口。如果是这种情况,您应该改用Toplevel()。拥有多个根窗口不是一个好主意:Why are multiple instances of Tk discouraged?

对于传递按钮引用,这可能起作用:

from tkinter import *

root = Tk()
root.title("Shop")

def shop():
    global attackButton
    shop = Canvas (root, width = 150, height = 100, bg = "blue")
    shop.pack()
    attackButton = Button(shop, text="Attack Up 1\n20 coins",
                          command=attackIncreaser1)
    attackUp1 = shop.create_window(77, 50, window=attackButton)

def attackIncreaser1():
    attackButton.config(text="Not enough coins")

shop()

root.mainloop()

相关问题 更多 >