Виджет Canvas не определен при попытке настроить его в функции - PullRequest
0 голосов
/ 10 марта 2019

Так что у меня возникает проблема: всякий раз, когда я открываю окно магазина, нажимаю кнопку Attack Up 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")

1 Ответ

1 голос
/ 10 марта 2019

Этот код не запускается, а это значит, что мне придется угадывать, чего не хватает, и добавить его, чтобы можно было отлаживать. Так что мои комментарии могут быть неактуальными ...

Я бы не рекомендовал создавать корневое окно внутри функции.

Переменная attackUp1 создается внутри функции shop(), которая делает ее локальной. Когда функция завершается, она собирается мусором.

Переменная attackUp1 имеет тип int. Это природа объектов холста. Если вы хотите изменить текст кнопки, вам нужно сохранить ссылку на кнопку.

Обновление Когда я снова смотрю на этот код, размышляя о том, почему вы создаете экземпляр Tk() внутри функции, мне кажется, что вы, возможно, открываете новое окно. Если это так, вы должны использовать Toplevel(). Не рекомендуется иметь более одного корневого окна: Почему не рекомендуется использовать несколько экземпляров Tk?

Что касается передачи ссылки на кнопку, это может работать:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...