@s591962
Изучаю Питон

Проблемы с локальной переменной в питоне?

При выполнении программы
from tkinter import *
import tkinter as tk
from tkinter import ttk
import time, sys
import datetime
from threading import Thread
from time import sleep
sl = {}#словарь - ведомость за день 
skan = '0'#переменная для ввода номера плазмы или лотка
sp = []#список номеров плазм
spt = []#список времен укладки и забора плазмы  
n = 0
m = 0
time_string = ''
time_string1 = ''
ff_lotok = 'a'

def add_labe1():
    lb1 = tk.Label(root, text = '''В окно справа ведите
или отсканируйте
номер плазмы!''', relief = tk.RAISED, bd = 1,
               width = 18, height = 2) # создаем текстовую метку, тройные ковычки
                                        # и перенос текста на новую строку - создание
                                        #многострочного текста 
    lb1.grid(row=1, column=1, stick = 'ns')    # размещаем метку в окне
    #def name_entry_delete():#ф очистки окна
        #name_entry.delete(0, last= END)


    def check(*args):
        str_t = ''
        global n
        global m
        global ff_lotok
        global time_string
        global time_string1   
        ff = name.get()
        if  ff_lotok == ff and m == 1:
            print('процес закончился')
            named_tuple = time.localtime() # получить struct_time
            time_string1 = time.strftime("%m/%d/%Y, %H:%M:%S", named_tuple)
            #spt.append(time_string)
            for i in sp:
                sl[i] = spt
                str_o = i + ' / ' + time_string + ' / ' + time_string1 + '\n'
                file = open('E:\\fleshka\\tkinter\\1.txt','a')
                file.write(str_o)
            name_entry.delete(0, last= END)
            sys.exit(0)

        if int(ff[0]) == 4 and len(ff) == 10  and m == 0:
            ff_lotok = ff
            print('процес начался') 
            named_tuple = time.localtime() # получить struct_time
            time_string = time.strftime("%m/%d/%Y, %H:%M:%S", named_tuple)
            #spt.append(time_string)
            name_entry.delete(0, last= END)
            result = f'Уложите плазму в шокерную'
            time.sleep(10)
            ff_lotok = ff
            print('введите значения ключа повторно')
            result = f'Достанте плазму'

        if len(ff) == 16 and m == 0:
            sp.append(ff)
            print('введите значения повторно')
            print('len(sp)',len(sp) )
            n = int(len(sp)) 
            print('n=',n)
            result.ser(f'Отсканировано {n} пакетов плазмы.')
            name_entry.delete(0, last= END)

    
    name = StringVar()
    name_entry = ttk.Entry(textvariable=name) 
    name_entry.grid(row=1, column=2, ipadx = 5, ipady = 20)    # размещаем метку Entry в окне
    name_entry.focus_set() 
    # отслеживаем изменение значения переменной name
    name.trace_add("write", check)#запускаем функцию check при изменении 

    result = StringVar()
    check_labe2 = ttk.Label(textvariable=result, borderwidth=2,
                            relief="ridge", padding=8, width = 18)
    check_labe2.grid(row=1, column=3, stick = 'ns')


    #btn2 = tk.Button(root, text = 'Ввод', width = 8, height = 3,
        #command = name_entry_delete) #запускаем очистку окна
    #btn2.grid(row=1, column=4, stick = 'w')    # размещаем метку Button в окне

#создаем корневой объект - окно 
root = tk.Tk()#создаем корневой объект - окно    
root.title("Приложення обліку шокувань")     # устанавливаем заголовок окна
root.geometry("700x950+100+10")# устанавливаем размеры и расположение окна
root.resizable(False, False) # запрещаем изменять окно 

# создаем текстовую метку
lbosn = tk.Label(root, text = "Здраствуй Маліка!",
               font = ('Arial', 16, 'bold'), width = 20, height = 2, relief = tk.RAISED, bd = 1)
                                        # создаем текстовую метку, определяем где размещаем и текст,
                                        #width - ширина, height - высота в знаках, relief = граница
                                        #bd - ширина границ
lbosn.grid(row=0, column=0, columnspan = 2, stick = 'we')    # размещаем метку в окне

# создаем 1 кнопку
btn1 = tk.Button(root, text = 'Почінаем шокування!', width = 18, height = 3,
                 command = add_labe1) #state = tk.DISABLED - кнопка выключена
btn1.grid(row=1, column=0, stick = 'w')    # размещаем метку в окне



root.mainloop()#запускает цикл обработки событий;
                #пока мы не вызовем эту функцию, наше окно
                #не будет реагировать на внешние раздражители.


Получаю ошибку
UnboundLocalError: cannot access local variable 'result' where it is not associated with a value
При выполненииresult.ser(f'Отсканировано {n} пакетов плазмы.')
Хотя я ее объявил раньше до вызова ф
result = StringVar()
    check_labe2 = ttk.Label(textvariable=result, borderwidth=2,
                            relief="ridge", padding=8, width = 18)
    check_labe2.grid(row=1, column=3, stick = 'ns')


Если я resul делаю глобальной
global time_string1   
        global result
        ff = name.get()

То получаю ошибку NameError: name 'result' is not defined
  • Вопрос задан
  • 2758 просмотров
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
result = f'Уложите плазму в шокерную'
Во-первых, от того, что ты присвоил переменной строку, в окне программы ничего не изменится.
Во-вторых, у тебя этот result инициализируется только внутри этого if. Если условие if не выполнено, result не будет существовать, на что тебе питон и указывает.
Ответ написан
Комментировать
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Нюанс в том, что функцию check вы явно не вызываете. Вы её передаёте как аргумент в другую функцию или метод. И вот там, в этой другой функции, область видимости, в которой объявлена проблемная переменная, не видна.

Вообще, это очень грязный вариант - глобальные переменные и вся эта возня. Делайте чистые функции, которые только явно принимают переменные и только явно возвращаются результат.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы