Почему функция не распознает глобальную переменную, если она была объявлена как глобальная?

У меня возникла проблема с программой: на 33-й строке происходит ошибка <br/> <blockquote>NameError: name 'priceshop' is not defined</blockquote>. Я объявил переменную ниже и определил её как глобальную в функции, но при этом переменную bar в функции def auto_bar() программа не рассматривает как ошибку. Я предполагаю, что причина может заключаться в том, что переменная создаётся внутри функции shop() и поэтому может считаться "локальной". <br/> <br/> <pre><code class="python">#библиотеки
from tkinter import *
from tkinter.ttk import Progressbar

#переменные
cnt = 0
cnt = int(cnt)
bar_cnt = 0
bar_cnt = int(bar_cnt)
pricePB_int = 10
pricePB_int = int(pricePB_int)
pricePB_str = pricePB_int
pricePB_str = str(pricePB_str)

#вызов функции клика
def clicked():
	global cnt
	cnt += 1
	wtext.configure(text = "Печенье: " + str(cnt))

def auto_price():
	global pricePB_int
	global pricePB_str
	global fgPS
	global priceshop

	if cnt < pricePB_int:
		fgPS = '#FF0000'
	else:
		fgPS = "#000000"
	priceshop.configure(text = "Цена: " + str(pricePB_str))

# вызов функции прогресс бара
def auto_bar():
	global bar_cnt
	global cnt
	print('Progressbar')
	if bar_cnt >= 100:
		bar_cnt = 0
		bar_cnt += 5
		cnt += 1
		print(">100")
	else:
		bar_cnt += 5
		print("<100")
	bar.configure(value = bar_cnt)
	wtext.configure(text = "Печенье: " + str(cnt))
	auto_price()
	window.after(1000, auto_bar)

def buying():
	print('buy')

#вызов магазина
def shop():
	global pricePB_int
	global pricePB_str
	wshop = Toplevel()
	wshop.resizable(False, False)
	wshop.title("Магазин")
	shopx = window.winfo_x() + ((window.winfo_width() / 2) - 320)
	shopy = window.winfo_y() + ((window.winfo_height() / 2) - 240)
	wshop.geometry('%dx%d+%d+%d' % (240, 144, shopx, shopy))
	wshop.iconbitmap('</code></pre>
  • 9 марта 2025 г. 7:34
Ответы на вопрос 2
Да, проблема, с которой вы сталкиваетесь, заключена в порядке использования и определения переменной. Когда вы объявляете переменную `priceshop`, но при этом обращаетесь к ней в функции `auto_price` до её инициализации, Python выдает ошибку `NameError`.

Переменные, объявленные внутри функции, являются локальными для этой функции и не доступны за её пределами, если вы не объявите их как глобальные. Однако в вашем случае, `priceshop` не инициализирована, когда вы пытаетесь обратиться к ней в `auto_price`, поэтому Python не может её распознать, даже если вы написали `global priceshop`.

Чтобы решить эту проблему, убедитесь, что вы инициализируете `priceshop` до того, как вы начнёте её использовать. Например:

1. Объявите переменную `priceshop` в глобальной области видимости перед использованием в функции.
2. Инициализируйте её после создания виджета `Label`.

Вот как это может выглядеть:

```python
# Создаем основное окно
window = Tk()

# Переменная для хранения виджета текста цены
priceshop = None

# Вызов магазина
def shop():
    global pricePB_int
    global pricePB_str
    global priceshop

    wshop = Toplevel()
    wshop.resizable(False, False)
    wshop.title("Магазин")
    shopx = window.winfo_x() + ((window.winfo_width() / 2) - 320)
    shopy = window.winfo_y() + ((window.winfo_height() / 2) - 240)
    wshop.geometry('%dx%d+%d+%d' % (240, 144, shopx, shopy))
    wshop.iconbitmap('icon.ico')  # Убедитесь, что у вас есть этот файл

    # Создаем Label для цены и сохраняем в priceshop
    priceshop = Label(wshop, text="Цена: " + str(pricePB_str))
    priceshop.pack()  # Убедитесь, что виджет отображается в окне

# Остальная часть вашего кода...
```

Теперь, когда вы вызовете `auto_price()`, `priceshop` будет уже инициализирован. Это должно устранить ошибку `NameError`. 

Обратите внимание, что структура кода должна быть последовательной, и любые глобальные переменные должны инициализироваться до их использования в функциях.
global - это инструкция не о том, где создать переменную, а где искать.
Похожие вопросы