Задача

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
Задача
Создать окно entry в Tkinter. При вводе 7 цифр они должны быть записаны в список sp. Окно очищается, выдается команда "ввести новое значение" и все по новой. Если первая цифра 2 и длина 3 значения, то производится запись в словарь где ключ 2 а в значение предыдущий заполненный список. После этого программа выдает 'процес начался' и останавливается на 10 сек и выдает 'введите значения повторно' После этого, если вводится значение соответствующее ключу словаря, выводится 'процес закончился' и программа заканчивается.
Код:
from tkinter import *
from tkinter import ttk
import time
import datetime

sp = []
sl = {}

def check(*args):
    #print(name)
    m = 0
    ff_lotok = 'a'
    ff = name.get()
    if int(ff[0]) == 2 and len(ff) == 3  and m == 0:
        ff_lotok = ff
        sl[ff] = sp
        print('процес начался')
        name_entry.delete(0, last= END)
        time.sleep(10)
        m = m + 1
        ff_lotok = ff
        print('введите значения повторно')

    if  ff_lotok == ff and m == 1:
        print('процес закончился')

    if len(ff) == 7 and m == 0:
        sp.append(ff)
        print('введите значения повторно')
        name_entry.delete(0, last= END)       
 
root = Tk()
root.title("METANIT.COM")
root.geometry("250x200")
 
name = StringVar()
 
name_entry = ttk.Entry(textvariable=name)
name_entry.pack(padx=5, pady=5, anchor=NW)
name_entry.focus_set()

# отслеживаем изменение значения переменной name
name.trace_add("write", check)
 
root.mainloop()

Вместо этого программа останавливается на 10 сек. сразу срабатывает
Код:
    if  ff_lotok == ff and m == 1:
        print('процес закончился')
И программа продолжает работать.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
После этого, если вводится значение
То функция check начинается сначала, она никого не ждёт, и не завершается программа

Сделайте первым ифом это
Python:
if  ff_lotok == ff and m == 1:
        print('процес закончился')
И добавьте sys.exit(0)
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
То функция check начинается сначала, она никого не ждёт, и не завершается программа

Сделайте первым ифом это
Python:
if  ff_lotok == ff and m == 1:
        print('процес закончился')
И добавьте sys.exit(0)
есть проблема.
m находится внутри функции. Когда сработает if int(ff[0]) == 2 and len(ff) == 3 and m == 0: и m = 1
далее функция вызывается снова и m = 0.
При вводе снова числа на 2 должно по задаче сработать if ff_lotok == ff and m == 1: а срабатывает снова if int(ff[0]) == 2 and len(ff) == 3 and m == 0:.
По идее надо m вывести из функции. Но при объявлении ее перед def check(*args): то есть она должна стать глобальной получаю UnboundLocalError: local variable 'm' referenced before assignment. Те ссылку на локальную переменную.
Код:
from tkinter import *
from tkinter import ttk
import time, datetime
sp = []
sl = {}
m = 0
def check(*args):
    #m = 0
    ff_lotok = 'a'
    ff = name.get()
    if  ff_lotok == ff and m == 1:
        print('процес закончился')
        sys.exit(0)

    if int(ff[0]) == 2 and len(ff) == 3  and m == 0:
        ff_lotok = ff
        sl[ff] = sp
        print('процес начался')
        name_entry.delete(0, last= END)
        #time.sleep(10)
        m = m + 1
        ff_lotok = ff
        print('введите значения ключа повторно')

    if len(ff) == 7 and m == 0:
        sp.append(ff)
        print('введите значения повторно')
        name_entry.delete(0, last= END)       
 
root = Tk()
root.title("METANIT.COM")
root.geometry("250x200")
 
name = StringVar()
name_entry = ttk.Entry(textvariable=name)
name_entry.pack(padx=5, pady=5, anchor=NW)
name_entry.focus_set()
# отслеживаем изменение значения переменной name
name.trace_add("write", check)
root.mainloop()
 

s591962

Новичок
Пользователь
Окт 12, 2021
130
3
18
То функция check начинается сначала, она никого не ждёт, и не завершается программа

Сделайте первым ифом это
Python:
if  ff_lotok == ff and m == 1:
        print('процес закончился')
И добавьте sys.exit(0)
Сделал так
Код:
from tkinter import *
from tkinter import ttk
import time, datetime
import sys
sp = []
sl = {}
m = 0
ff_lotok = 'a'
def check(*args):
    #m = 0
    global m
    global ff_lotok
    ff = name.get()
    if  ff_lotok == ff and m == 1:
        print('процес закончился')
        sys.exit(0)

    if int(ff[0]) == 2 and len(ff) == 3  and m == 0:
        ff_lotok = ff
        sl[ff] = sp
        print('процес начался')
        name_entry.delete(0, last= END)
        #time.sleep(10)
        m = m + 1
        ff_lotok = ff
        print('введите значения ключа повторно')

    if len(ff) == 7 and m == 0:
        sp.append(ff)
        print('введите значения повторно')
        name_entry.delete(0, last= END)       
 
root = Tk()
root.title("METANIT.COM")
root.geometry("250x200")
 
name = StringVar()
name_entry = ttk.Entry(textvariable=name)
name_entry.pack(padx=5, pady=5, anchor=NW)
name_entry.focus_set()
# отслеживаем изменение значения переменной name
name.trace_add("write", check)
root.mainloop()

Теперь все работает. Но пришлось объявить две глобальных переменных а вы говорили что это плохой вкус.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
Теперь все работает. Но пришлось объявить две глобальных переменных а вы говорили что это плохой вкус.
не вкус, а плохая практика, но если необходимо, то почему и нет
можно ее передать, как параметр функции, например
 

s591962

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

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