From 691b167725167f5ae081567ab9743104bc574aa1 Mon Sep 17 00:00:00 2001 From: LocoAgent Date: Wed, 5 Aug 2026 17:03:05 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20UnboundLocalError=20?= =?UTF-8?q?=D0=B2=20=D0=BE=D0=BA=D0=BD=D0=B5=20=D0=B0=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B0=D1=81=D1=87=D1=91=D1=82=D0=B0=20=D0=9F=D0=9F-127?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Причина: внутри _calc() в ветках стояли импорты 'from .variables import CRITERION_QUANT_THRESHOLDS...' — Python считает эти имена локальными для всей функции, а условие 'if (num in CRITERION_QUANT_THRESHOLDS ...)' в начале _calc обращалось к ним до присваивания → UnboundLocalError при любом расчёте. Исправление: все импорты из .variables вынесены на уровень _open_calc_dialog (начало функции); внутренние импорты из _calc() и дубликаты в теле окна убраны. --- dokogen/ui.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/dokogen/ui.py b/dokogen/ui.py index 5c8302c..b7b6c7d 100644 --- a/dokogen/ui.py +++ b/dokogen/ui.py @@ -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):