Фикс UnboundLocalError в окне авторасчёта ПП-127

Причина: внутри _calc() в ветках стояли импорты
'from .variables import CRITERION_QUANT_THRESHOLDS...' — Python считает
эти имена локальными для всей функции, а условие
'if (num in CRITERION_QUANT_THRESHOLDS ...)' в начале _calc обращалось
к ним до присваивания → UnboundLocalError при любом расчёте.

Исправление: все импорты из .variables вынесены на уровень
_open_calc_dialog (начало функции); внутренние импорты из _calc()
и дубликаты в теле окна убраны.
This commit is contained in:
LocoAgent
2026-08-05 17:03:05 +04:00
parent a7878804e4
commit 691b167725
+2 -8
View File
@@ -2205,7 +2205,8 @@ class DokoGenApp:
и предлагает категорию как рекомендацию."""
import re as _re2
from .variables import (CRITERION_QUANT_THRESHOLDS, CRITERION_CHOICE_INDICATORS,
CRITERION_QUANT_UNITS)
CRITERION_QUANT_UNITS, _calc_criterion_other,
_calc_criterion_13_opk, _criterion_10_cat)
# Сфера ОПК — для показателей 8/13а/13б используются формулы ПП РФ № 796
_sphere_opk = False
@@ -2304,8 +2305,6 @@ class DokoGenApp:
elif (num in CRITERION_QUANT_THRESHOLDS or num in CRITERION_CHOICE_INDICATORS):
# Остальные показатели (1–7, 11–14): количественные — ввод значения,
# качественные — выбор варианта (III/II/I) из справочника ПП-127
from .variables import (CRITERION_QUANT_THRESHOLDS, CRITERION_CHOICE_INDICATORS,
CRITERION_QUANT_UNITS)
is_choice = num in CRITERION_CHOICE_INDICATORS
ttk.Label(frm, text=f"Показатель {num} — по порогам ПП-127",
font=('Arial', 10, 'bold')).pack(anchor=tk.W)
@@ -2567,7 +2566,6 @@ class DokoGenApp:
def _calc():
lines = []
if num in ('13а', '13б') and _sphere_opk:
from .variables import _calc_criterion_13_opk
# Сохраняем введённые составляющие формулы в criterion_input (для шаблона)
if isys:
_ci = dict(getattr(isys, 'criterion_input', None) or {})
@@ -2590,8 +2588,6 @@ class DokoGenApp:
else:
lines.append("Категория значимости: — (значение ниже порога III)")
elif (num in CRITERION_QUANT_THRESHOLDS or num in CRITERION_CHOICE_INDICATORS):
from .variables import (CRITERION_QUANT_THRESHOLDS, CRITERION_CHOICE_INDICATORS,
CRITERION_QUANT_UNITS, _calc_criterion_other)
is_choice = num in CRITERION_CHOICE_INDICATORS
if is_choice:
choice = e_choice.get().strip()
@@ -2613,7 +2609,6 @@ class DokoGenApp:
else:
lines.append("Категория значимости: — (значение ниже порога III)")
elif num == '10' or str(num).startswith('10.'):
from .variables import _criterion_10_cat
if str(num) == '10':
ops = _num(e_ops.get())
days = _num(e_days.get())
@@ -2841,7 +2836,6 @@ class DokoGenApp:
# Кнопка «🧮» — авторасчёт показателя:
# 8/9/10 — экономические формулы; остальные (1–7, 11–14) — по порогам ПП-127
from .variables import (CRITERION_QUANT_THRESHOLDS, CRITERION_CHOICE_INDICATORS)
if (grp_num in ('8', '9', '10')
or num in CRITERION_QUANT_THRESHOLDS
or num in CRITERION_CHOICE_INDICATORS):