Не присваивается переменной значение окна Entry

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
В программе есть функция задача которой получить скан штрих кода передать его переменной skan. Значение переменной сравнивается с 0 и если не равно ему записывается в список и снова все повторяется при этом производится очистка окна Entry. name1 = tk.Entry(root) метод name1.delete(0, tk.END).
Если переменная = 0 . то ее значение записывается в словарь.
Код:
def get_entry():
    global skan
    global skan_lotok
    global spt
    skan = '0'#переменная для ввода номера плазмы или лотка
    sp = []#список номеров плазм
    spt = []#список времен укладки и забора плазмы   
    skan_lotok = '' 
    while skan[0] != 'm':
        name1.delete(0, tk.END)
        skan = name1.get()#присваиваем скан плазмы из окна
        print(skan)
        if skan[0] != '0':
            sp.append(str)
        if skan[0] == '0' and len(spt) == 0:
            sl[str] = sp
            skan_lotok = skan #номер лотка
            n ='загрузка лотка закончена'
            print('загрузка лотка закончена')
            tt = time.time()
            spt.append(tt)
            print(tt)
            break
    add_labe3()

Проблема в том, что после сканирования значение появляется в окне Entry но переменной не присваивается.

На всякий случай прилагаю весь скрипт. В нем предполагается и сканирование и автоматическая работа и ввод кода в окно Entry и далнейший запуск кн. btn2 = tk.Button
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
не используйте глобалы, можете получить неопределенное поведение, передавайте значения в функцию и возвращайте из нее

На всякий случай прилагаю весь скрипт
где?
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
не используйте глобалы, можете получить неопределенное поведение, передавайте значения в функцию и возвращайте из нее


где?
Код:
import tkinter as tk
from tkinter import ttk
import time
import datetime
from threading import Thread
from time import sleep
sl = {}#словарь - ведомость за день

def func():
    sleep(2)
    func1()

def func1():
    for i in range(10):
        lb3['text'] = f"Осталось {9 - i} секунд"
        sleep(1)
        lb3['text'] = f"Отсканируйте лоток"
    skan = name1.get()#присваиваем скан плазмы из окна
    if skan == skan_lotok:
        tt = time.time()
        spt.append(tt)
        sl['t'] = spt
        lb3['text'] = f"Шокирование закончилось"
    print(tt)
    print(sl)
    
def add_labe3():
    global lb3
    lb3 = tk.Label(root, text = "Шокування почалось",width = 20, height = 2, relief = tk.RAISED, bd = 1)
    lb3.grid(row=1, column=5, stick = 'ns')
    sleep(1)
    th = Thread(target=func)
    th.start()   

def get_entry():
    global skan
    global skan_lotok
    global spt
    skan = '0'#переменная для ввода номера плазмы или лотка
    sp = []#список номеров плазм
    spt = []#список времен укладки и забора плазмы   
    skan_lotok = '' 
    while skan[0] != 'm':
        name1.delete(0, tk.END)
        skan = name1.get()#присваиваем скан плазмы из окна
        print(skan)
        if skan[0] != '0':
            sp.append(str)
        if skan[0] == '0' and len(spt) == 0:
            sl[str] = sp
            skan_lotok = skan #номер лотка
            n ='загрузка лотка закончена'
            print('загрузка лотка закончена')
            tt = time.time()
            spt.append(tt)
            print(tt)
            break
    add_labe3()

def add_labe2():
    lb2 = tk.Label(root, text = '''В окно справа ведите
или отсканируйте
номер плазмы!''', relief = tk.RAISED, bd = 1,
               width = 18, height = 2) # создаем текстовую метку, тройные ковычки
                                        # и перенос текста на новую строку - создание
                                        #многострочного текста
    lb2.grid(row=1, column=1, stick = 'ns')    # размещаем метку в окне
    
    global name1
    global btn2
    name1 = tk.Entry(root)
    name1.focus_set()
    name1.grid(row=1, column=2, ipadx = 5, ipady = 20)    # размещаем метку Entry в окне
    
    btn2 = tk.Button(root, text = 'Ввод', width = 8, height = 3, command = get_entry) #запускаем обработку скана
    btn2.grid(row=1, column=4, stick = 'w')    # размещаем метку Button в окне

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


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


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

root.mainloop()


Работа еще в самом начале. Опыта пока очень мало. Когда получу хоть что нибудь более менее рабочее буду пытаться оптимизировать. Пока как могу.
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
В программе которую я делал первоначально и куда вставлял уже код кусок в котором переменной присваивается значение окна Entry работает все нормально.
import tkinter as tk
from tkinter import ttk
import time
import datetime
from threading import Thread
from time import sleep

def func():
sleep(2)
func1()

def func1():
for i in range(10):
lb3['text'] = f"Осталось{9 - i} секунд"
sleep(1)
lb3['text'] = f"Шокування закончилось"

def add_labe3():
global lb3
lb3 = tk.Label(root, text = "Шокування почалось",width = 20, height = 2, relief = tk.RAISED, bd = 1)
lb3.grid(row=1, column=5, stick = 'ns')
sleep(1)
th = Thread(target=func)
th.start()

def get_entry():
skan = name1.get()#присваиваем скан плазмы из окна
add_labe3()
print (skan)

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

global name1
global btn2
name1 = tk.Entry(root)
name1.focus_set()
name1.grid(row=1, column=2, ipadx = 5, ipady = 20) # размещаем метку Entry в окне

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

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


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


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

root.mainloop()
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
Обнаружил что если убрать очистку окна
Код:
name1.delete(0, tk.END)
то стоящее после
Код:
skan = name1.get()
срабатывает. Но если не делать очистку то после сканирования кода 40005 она проходит цикл и не останавливается для нового сканирования а продолжает дальше с тем же значением и программа уходит в бесконечный цикл.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
Обнаружил что если убрать очистку окна
Код:
name1.delete(0, tk.END)
то стоящее после
Код:
skan = name1.get()
срабатывает. Но если не делать очистку то после сканирования кода 40005 она проходит цикл и не останавливается для нового сканирования а продолжает дальше с тем же значением и программа уходит в бесконечный цикл.
ну естественно, вы очищаете поле, и в переменной ничего нет...
сначала присвойте значение из поля, а потом очищайте...
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
ну естественно, вы очищаете поле, и в переменной ничего нет...
сначала присвойте значение из поля, а потом очищайте...
Я так понимаю
name1.delete(0, tk.END) очищаю поле
skan = name1.get()#программа останавливается, происходит сканирование и значение присваивается переменной.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
Я так понимаю
name1.delete(0, tk.END) очищаю поле
skan = name1.get()#программа останавливается, происходит сканирование и значение присваивается переменной.
я не понимаю, что вы подразумеваете под "сканирование"

name1.delete(0, tk.END) - очищает поле ввода name1
skan = name1.get() - переменной skan присваивается строка, которая находится в поле ввода name1
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
я не понимаю, что вы подразумеваете под "сканирование"

name1.delete(0, tk.END) - очищает поле ввода name1
skan = name1.get() - переменной skan присваивается строка, которая находится в поле ввода name1
К компьютеру подключён скан штрих кода. Я думал что программа доходит до skan = name1.get() и останавливается. Я подношу к сканеру штрихкод он его считывает и заносит в Entry. Я вижу в окне появление штрих кода. Я думал дальше должно произойти присваивание значения skan = name1.get() и цикл идет дальше. Или я не прав?
Задача в этом и состоит. Последовательно считать несколько штрих кодов и занести в список. Когда будет штрищ код начинающийся на 0 она должна занести это значение в другой список и закончить функцию.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
нет, если вам нужно ожидание ввода, вам нужно подписаться на событие поля ввода, и после отрабатывания события выполнять свои функции, само ничего останавливаться не будет
я же вам скидывал пример
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
нет, если вам нужно ожидание ввода, вам нужно подписаться на событие поля ввода, и после отрабатывания события выполнять свои функции, само ничего останавливаться не будет
я же вам скидывал пример
Спасибо. Пошел изучать что это такое?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
Последовательно считать несколько штрих кодов и занести в список. Когда будет штрищ код начинающийся на 0 она должна занести это значение в другой список и закончить функцию.
как у вас деляться штрихкоды? есть ли какой нибудь завершающий суффикс?
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
как у вас деляться штрихкоды? есть ли какой нибудь завершающий суффикс?
Я планировал так: сканировал штрих код. Записал в переменную, переменная в список. далее цикл повторяется очистка окна - сканирование - запись в переменную - запись в список. Когда штрих код начинается на 0 тоже самое но через другой if - запись в другой список и выход из цикла.
Сейчас разбираюсь что такое событие поля ввода (никогда не сталкивался). Потом если вылезет что то буду разбираться дальше.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
Я планировал так: сканировал штрих код. Записал в переменную, переменная в список. далее цикл повторяется очистка окна - сканирование - запись в переменную - запись в список. Когда штрих код начинается на 0 тоже самое но через другой if - запись в другой список и выход из цикла.
Сейчас разбираюсь что такое событие поля ввода (никогда не сталкивался). Потом если вылезет что то буду разбираться дальше.
как вы определите, что один штрихкод закончился и начинается другой? когда поле то чистить? когда в переменную писать?
сканер настроен как клавиатура? в конце есть завершающий символ?
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
как вы определите, что один штрихкод закончился и начинается другой? когда поле то чистить? когда в переменную писать?
сканер настроен как клавиатура? в конце есть завершающий символ?
Вопросы пока без ответа. Сначала сделаю чтобы штихкод записывался в переменную потом остальное. Я только учюсь.
 

Форум IT Специалистов