Как преобразовать текст из файла в словарь? В каждой строчке текста есть символ "|". То что перед ним должно быть ключом, после - значением
В файле содержится текст:
Foundation|Asimov, Isaac
Foundation and Empire|Asimov, Isaac
Second Foundation|Asimov, Isaac
Нужно привести это к виду:

{'Foundation': 'Asimov, Isaac', 'Foundation and Empire': 'Asimov, Isaac', 'Second Foundation': 'Asimov, Isaac'}

Пробовал так:

with open(f'{filename}', 'r') as s:
        data = s.read()
        for i in data:
            if '|' in i:
                result = dict(enumerate(data.split()))
                return result

но получается только:

{0: 'Foundation|Asimov, Isaac', 1: 'Foundation and Empire|Asimov, Isaac', 2: 'Second Foundation|Asimov, Isaac', 3: 'Dune|Herbert, Frank'}

result = {}
with open(f'{filename}', 'r') as s:
    data = s.readlines() # читаем содержание файла в список
    for line in data:
        elements = line.split("|") # делим строку по "|" на части и сохраняем в список
        result[elements[0]] = elements[1] # добавляем в словарь


Сторонние декораторы в классе. ООП
Вопрос. Почему этот код воспроизводится так как надо хотя вызова самого класса нет. Есть предположение что из-за того что была вызвана переменная
dp, но на сколько это достоверно мне не понятно и на сколько практично.

from aiogram import Bot, Dispatcher, executor, types
import config

bot = Bot(token=config.TOKEN_TESTING, parse_mode=types.ParseMode.MARKDOWN_V2)
dp = Dispatcher(bot)

class SheduleBot:
    @dp.message_handler(commands=['today' ])
    async def queue(message):
        await message.reply("```\nОтправь мне в личку сообщение```\n")

#shedule_bot = SheduleBot()
executor.start_polling(dp, skip_updates=True)

Почему этот код воспроизводится так как надо хотя вызова самого класса нет.

Класс как раз есть, это объекта нет.
Почему срабатывают декораторы - потому что всё внутри класса (кроме содержимого методов) выполняется сразу при загрузке модуля (тупо, если
print внутрь класса вставить снаружи методов, он сработает при старте). Поэтому и методы создаются, и выполняются декораторы. А дальше через диспетчер просто вызываются методы, зарегистрированные декораторами.
Демонстрационный код, без асинхронности, но суть та же самая:

from collections import defaultdict
from typing import List

class Dispatcher:
    def __init__(self):
        self.functions = defaultdict(list)

    def message_hanlder(self, commands: List[str]):
        print("Внутри message_hanlder, commands =", commands)
        def decorator(func):
            print("Внутри декоратора на функции", func)
            # В данном случае декоратор ничем не оборачивает функцию
            # а просто регистрирует ее как обработчик команд
            # и возвращает ее же саму, а не wrapper
            for command in commands:
                self.functions[command].append(func)

            return func
        print("Выходим из message_hanlder")
        return decorator

    def send_message(self, command: str, message: str):
        for func in self.functions[command]:
            func(message)

dp = Dispatcher()

class SomeClass:
    print("Внутри класса SomeClass")

    @dp.message_hanlder(commands=["yesterday", "today"])
    def handler1(message):
        print("Handler1:", message)

    print("Между методами класса SomeClass")

    @dp.message_hanlder(commands=["today", "tomorrow"])
    def handler2(message):
        print("Handler2:", message)

print("Посылаем сообщения")
dp.send_message(command="yesterday", message="Hello!")
dp.send_message(command="today", message="Bye!")
dp.send_message(command="tomorrow", message="Hello again!")

Вывод:

Внутри класса SomeClass
Внутри message_hanlder, commands = ['yesterday', 'today']
Выходим из message_hanlder
Внутри декоратора на функции <function SomeClass.handler1 at 0x7fb610b3c1f0>
Между методами класса SomeClass
Внутри message_hanlder, commands = ['today', 'tomorrow']
Выходим из message_hanlder
Внутри декоратора на функции <function SomeClass.handler2 at 0x7fb610b3c280>
Посылаем сообщения
Handler1: Hello!
Handler1: Bye!
Handler2: Bye!
Handler2: Hello again!

Т.е. видно, что и
print внутри класса сразу отработал, и декораторы выполнились сразу при старте.
Еще очевиднее будет, если вспомнить, что декоратор - это просто функция, в которую передается декорируемая функция, и возвращается другая функция (или та же самая в данном случае, но декорируемая функция регистрируется диспетчером). Поэтому класс можно переписать так:

class SomeClass:
    print("Внутри класса SomeClass")

    def handler1(message):
        print("Handler1:", message)

    handler1 = dp.message_hanlder(commands=["yesterday", "today"])(handler1)

    print("Между методами класса SomeClass")

    def handler2(message):
        print("Handler2:", message)

    handler2 = dp.message_hanlder(commands=["today", "tomorrow"])(handler2)

При этом все будет работать точно так же.
То, что декоратор является методом объекта dp, никак на результат не влияет, точно такое же поведение будет и если декоратор будет отдельной функцией.


Проблема в discord.py
Ошибка в последней строке, я хочу запустить проигрыватель, но выдается ошибка которую можно увидеть в самом низу, помогите с написанием этого кода, и пожалуйста поймите в чем ошибка. Код:

with youtube_dl.YoutubeDL(YDL_OPTIONS) as ydl:
            info = ydl.extract_info(url, download=False)
            url2 = info['formats'][0]['url']
            voice = discord.utils.get(bot.voice_clients, guild=ctx.guild)
            source = await discord.FFmpegOpusAudio.from_probe(url2, **FFMPEG_OPTIONS)
            vc.connect(reconnect=False)
            vc.play(source)

Ошибка:

discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'VoiceChannel' object has no attribute 'play'

Ответ (благодаря комментарию @RAINGM): надо искать
voice_client, а не
voice_channel.


Эксперименты с монетой (Эл Свейгарт)
Делаю задание, которое заключаеся вот, в чем :
Напишите программу, которая позволит узнать, насколько часто серия
из шести решек или шести орлов появляется в случайно сгенерированном
списке.
Написала код, который состоит из двух частей :
в первой части генерируется
список случайно выбранных значений орлов и решек, а во второй
части проверяется, есть ли в нем интересующая нас серия.
Вот он :

import random

numberOfStreaks = 0
arr = []
subArr = ["OOOOOO", "PPPPPP"]

def coinFlip(array) :
    for i in range(0, 100, 1):
        coin = random.randint(0, 1)
        if coin == 1 :
            array.append("O")
        else :
            array.append("P")
    return array

res = coinFlip(arr)

for i in subArr :
    for j in res :
        if i in j :
            numberOfStreaks = numberOfStreaks + 1

print(res)
print(numberOfStreaks)
input("\nEnter")

Проблема заключается в том, что у меня не получается найти количество вхождений заданного подсписка в основном списке.
Собственно проблемное место :

for i in subArr :
        for j in res :
            if i in j :
                numberOfStreaks = numberOfStreaks + 1

Пожалуйста, помогите исправить

<code>
import random

numberOfStreaks = 0
arr = []
subArr = ["OOOOOO", "PPPPPP"]

def coinFlip(array) :
    for i in range(0, 100, 1):
        coin = random.randint(0, 1)
        if coin == 1 :
            array.append("O")
        else :
            array.append("P")
    return array

res = coinFlip(arr)

sixO=0
sixR=0
nowO=0
nowR=0
for it in res:
    if it=='O':
        nowO+=1
        nowR=0
    else:
        nowR+=1
        nowO=0
    if nowO==6:
        sixO+=1
        nowO=0
    if nowR==6:
        sixR+=1
        nowR=0

print(sixR,sixO)
</code>
Суть решения создаём четыре счётсчика для два для текущего показателя, два для итоговых. Сравнивая каждый элемент плюсуем текущий показатиль либо орла либо решка, обнуляя показатель противоположный.
При достижении нужного количества вхождений плюсуюм результат.
Но есть загвоздка: o ooooo o должно защитаться за одно вхождение либо за два.
& я бы игрался с модулем itertools и [].count('') для более быстрого кода


Високосный год на Python
Есть рабочий код для определения того високосный год или нет. Вот:

def is_leap(year):
    leap = False

if (year % 4) == 0:
    if (year % 100) == 0:
        if (year % 400) == 0:
            return True
        else:
            return False
    else:
        return True
else:
    return False

return leap

year = int(input())
print(is_leap(year))

И есть такой, но он не работает, только если год равен
1992, а с другими годами все окей.

def is_leap(year):
    leap = False

if year%4==0 and year%100==0 and year%400==0:
    return True
else:
    return False

    return leap

year = int(input())
print(is_leap(year))

Объясните пожалуйста почему. Разве они не идентичны? Почему первый рабочий полностью, а второй частично? Спасибо.

В вашем втором варианте високосными будут считаться только те года, которые делятся на 400, т.к.
True вернется только если все три условия выполняются, а это случается только для тех лет, которые делятся на 400 (они автоматически делятся еще и на 4 и на 100).
Попробуйте так:

def is_leap(year):
    return year%4==0 and (year%100!=0 or year%400==0)

тесты:

In [168]: is_leap(2000)
Out[168]: True

In [169]: is_leap(2020)
Out[169]: True

In [170]: is_leap(2100) # если год делится на 100, но не делится на 400 - он НЕ является високосным
Out[170]: False


Разбить список на n элементов
Допустим, есть список
l и число
j <= len(l)/2
как разбить список l на j подмассивов так, чтобы длина самого длинного и самого короткого подмассивов отличалась не более чем на 1.

у меня получилось разбить список таким кодом:
<code>
j = 5
l = [1,2,3,4,5,6,7,8,9,10,11,12,13]
res = []

l1,l2 = divmod(len(l), j)
r = [l1+1]*l2 + [l1]*(j-l2)  # длины итоговых списков

temp = l.copy()
for i in r:
    res.append(temp[:i])
    del temp[:i]

print(res)  # [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11], [12, 13]]
</code>
итого, получили заданные пять списков, длина самого длинного-3, самого короткого-2


Как сделать так, чтобы кнопка в tkinter выполняла свою команду?
Имеется вот такой код:
<code>
    uslog = tk.Entry(login, width=20, font="Calibri 20")
    uslog.place(x=60, y=100)
    atg = uslog.get()
    def logging(uslog, atg):
            print(atg)
    text1 = tk.Label(login, text="Введите ваш пароль:", font="Calibri 12", bg="limegreen")
    text1.place(x=60, y=140)
    uspass = tk.Entry(login, width=20, font="Calibri 20")
    uspass.place(x=60, y=165)
    reg_butt = tk.Button(login, width=16, height = 1, text="Зарегистрироваться", bg="cyan", command=logging(uslog, atg))
    reg_butt.place(x=145, y=210)
</code>
Но почему то logging() не вызывается при нажатии на кнопку регистрации
что делать?

Функция не вызывается потому, что вы и так её уже позвали когда создавали кнопку.

reg_butt = tk.Button( .... command=logging(uslog, atg))
#                                         ^^^^^^^^^^^^
#                                         это вызов

Чтобы передать функцию с аргументами как обработчик события, надо её поместить в
lambda, например.

reg_butt = tk.Button( .... command=lambda: logging(uslog, atg))

Второе... Значение
atg надо доставать непосредственно в функции-обработчике. Там где оно у вас сейчас достаётся оно всегда пустое, и нет смысла передавать его как аргумент функции.
Итого:

def logging(uslog):
    atg = uslog.get()
    print(atg)

....

reg_butt = tk.Button( .... command=lambda: logging(uslog))


Удалить словарь из списка словарей по значению одного из ключей
Есть словарь

a = [{"animal": "cats", "color": "red yellow blue"},
     {"animal": "dogs", "color": "brown green black"},
     {"animal": "birds", "color": "purple white pink"},
...]

И есть список слов:

b = ["yellow", "black" ...]

Необходимо полностью удалить словарь из списка, если второй элемент значения ключа "color" находится в списке b.
То есть на выходе нужно получить такой список словарей:

a = [{"animal": "dogs", "color": "brown green black"},
     {"animal": "birds", "color": "purple white pink"},
...]

Пыталась реализовать следующим образом, но не получаю нужного результата:

for i in a:
    words = []
    for word in i['color'].split():
        words.append(word)

    if words[1] in b:
        del i

Помогите, пожалуйста, справиться с задачей

Идём по списку
a. Для каждого элемента этого списка (словарь
d) берём значение по ключу
d["color"], разбиваем его
split(), берём второй элемент
[1] и проверяем что он не в списке
b. Если это так, то весь словарь помещается в результарующий список
c.

c = [d for d in a if d["color"].split()[1] not in b]


Количество вхождений элементов в каждом столбце двухмерного массива
Существует некоторая логика программы. Необходимо определить количество одинаковых элементов каждом столбце двумерного массива. Имеется следующий код:

import numpy as np
a = np.array([[1, 2, 3, 1, 0],
              [3, 2, 4, 3, 1],
              [1, 3, 1, 0, 4],
              [1, 0, 2, 0, 2],
              [0, 0, 4, 3, 4]])
b = np.zeros_like(a)
for i in range(a.shape[1]):
    b[:, i] = np.bincount(a[:, i], minlength=a.shape[0])

Результат работы:

[[1 2 0 2 1]
 [3 0 1 1 1]
 [0 2 1 0 1]
 [1 1 1 2 0]
 [0 0 2 0 2]]

Все работает корректно, однако хотелось бы избавится от употребления явного цикла, так как реальный массив может иметь достаточно большую размерность.
Возможно ли это сделать?

Максимум что можно сделать:

b = np.apply_along_axis(lambda x: np.bincount(x, minlength=a.shape[0]), axis=0, arr=a)

Подсмотрено на английском SO.
Более простой вариант к сожалению не работает на ваших данных:

b = np.apply_along_axis(np.bincount, 0, m)

Проблема в том, что
bincount может возвращать разное кол-во значений для разных колонок, поэтому этот вариант работает не всегда.


Напиши программу, которая разделяет запятыми на тройки (считая справа) натуральное число [закрыт]

Закрыт. Данный вопрос необходимо конкретизировать. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.

Закрыт 1 год назад.

                        Улучшить вопрос

Напиши программу, которая разделяет запятыми на тройки (считая справа) натуральное число.
Программа на вход получает натуральное число.
Если в числе менее трёх знаков, то программы выводи текст: NO.
Пример работы программы.
Входные данные: 14875
Выходные данные: 14,875
Входные данные: 148
Выходные данные: NO

Громаднейшая программа, но работает!
<code>
a=list(input())
b=a[:]
s=0
sc=1
while True:
    if sc == 1 and len(a)<=3:
        print('NO')
        break
    if s-3 >= 0-len(b) and sc==1:
        s-=3
        a.insert(s, ',')
    elif s-3 >= 0-len(b):
        s-=4
        a.insert(s, ',')

    else:
        print(''.join(a))
        break
    sc+=1

</code>


Как проверить что строка состоит только из букв, цифр и пробелов python?
Ребят подскажите как проверить что имя состоит только из букв, цифр и пробелов?
<code>
        while True:
            name_product = input('Введите имя продукта(разрешается использовать только буквы и цифры)> ')
            if name_product.isspace() or name_product.isalnum():
                break
            else:
                print('Введите корректное имя продукта')
</code>
например имя может быть такое : куриное филе1

Вы должны проверить, что все символы введённого названия соответствуют вашим критериям (пробел, буква или цифра), соответственно, код проверки можно преобразовать так:

    if all(x.isspace() or x.isalnum() for x in name_product):
        break

Т.е. перебираем все символы названия через
for, каждый символ проверяем вашим условием
isspace or isalnum, и проверяем, что все эти условия выполнились одновременно с помощью функции
all.


map без lambda функции
Имеется
<code>
N=3
st=list(map(lambda s: ",K%d" % s,range(1,N)))#,K1,K2,K3
</code>
N-больше 100. 3 для краткости.
Как все это записать без lamda или с использованием format ?

Буквально, с использованием
format вместо
lambda и форматирования через
%:

N = 3
print(list(map(",K{}".format, range(1,N))))
# Вывод: [',K1', ',K2']

Если запятая нужна для разделения элементов (начальная запятая не нужна), лучше убрать ее из строки форматирования, и использовать
join для сборки элементов в строку с указанием запятой в качестве разделителя:

print(",".join(map("K{}".format, range(1,N))))
# Вывод: K1,K2

Еще вариация на форматирование через процент (пользуемся тем, что
",K%d" % s эквивалентно вызову метода
__mod__:
",K%d".__mod__(s))

print(list(map(",K%d".__mod__, range(1,N))))

Но в целом, сейчас (при наличии в Python format и f-строк, т.е. начиная с Python 3.6) уже нет особого смысла вообще использовать процент для форматирования. Да код с использованием функций с двойным подчеркиванием напрямую выглядит не очень хорошо.


Случайная замена одинаковых элементов списка Python
Час добрый. Подскажите пожалуйста как можно заменить определенные одинаковые элементы в списке на разные элементы из другого списка. То есть имеется два списка

список 1 = ['пример', 'пример', '♥♥♥', 'пример', '♥♥']
список 2 = ['1', '2', '3', '4', '5', '6', 'текст']

И после обработки списка 1 по ключевому слову 'пример', нужно получить новый список, в котором не будут повторятся переменные из списка 2. Выходные данные должны быть примерно такими

список 1 после обработки = ['1', '6', '♥♥♥', 'текст', '♥♥']

Пробовал код по типу того что оставлю ниже, но он заменяет все ключевые слова на одну и ту же переменную

 for word in text_model_split:
                s = word
                l = s

                with open('short.txt', 'r', encoding='utf-8') as file_short:
                    for line in file_short:
                        line = line.split('\n')
                        short_list.append(line[0])

                        random_element = random.choice(short_list)

                l = [i.replace('пример', f'{random_element}') for i in l]
                l = (''.join(l))

Попробовать онлайн!

import random

list1 = ['пример', 'пример', '♥♥♥', 'пример', '♥♥']
list2 = ['1', '2', '3', '4', '5', '6', 'текст']
replace = 'пример'

unique2 = sorted(set(list2))
random.shuffle(unique2)
for j, i in enumerate([i for i, e in enumerate(list1) if e == replace]):
    list1[i] = unique2[j % len(unique2)]

print(list1)

Вывод:

['4', 'текст', '♥♥♥', '2', '♥♥']


Удалить ячейки по их содержимому
<code>
df = pd.DataFrame([[1, '?', 3],
                  [2, '?', 1],
                  [3, '?', 2]],
columns=['0','1','2'])
df
</code>
Необходимо удалить все объекты с пропусками ('?')

Если допустить, что в каждой строке нужно удалить одинаковое количество "пропусков", то можно так:

df = df.replace("?", pd.NA)
df = df.apply(lambda x: pd.Series(x.dropna().values), axis=1)

теперь df:

   0  1
0  1  3
1  2  1
2  3  2

Если количество пропусков в строках - разное, то этот код тоже будет работать, но у вас появятся NaN-значения.


Выбор аргумента из списка при инициализации экземпляра класса
Предположим, есть список доступных рас персонажа.
Как при инициализации реализовать выбор из существующего списка, что бы исключить опечатки и прочие связанные с этим трудности?

race_list = ['Orc','Elf','Human']
class Hero:
    def __init__(self,race):
        self.race = race

У меня есть идея вывести список рас и предложить выбор:

class Hero:
    def __init__(self,race=int(input('Выберите расу героя:\n1: Orc\n2: Elf\n3: Human\n'))):
        self.race = race_list[race - 1]

Anduin = Hero()

Есть ли более элегантный метод реализации?

Я бы сделал так:

Сделал бы базовый класс BaseRace

Для каждой рассы создавал бы класс, унаследованный от BaseRace
(По хорошему нужна фабрика классов)

Рассу бы принимал из input-а или откуда угодно, создавая соответствующий экземпляр класса

В вашем классе в init проверял бы через issubclass проверял бы, что расса это один из существующих классов:

<code>
def __init__(self, race):
assert issubclass(race, BaseRace)
</code>


Ошибка бота: Отсутствуют разрешения
Бот перестал работать после изменения прав канала, хотя даже попытки все вернуть как было не дали результатов.

import discord
from discord.ext import commands
from discord import utils
from discord.utils import get

bot = commands.Bot(command_prefix = '!')
descp = ['📝 - записаться как участник \n🔊 - присоединиться к лобби']
post_ID = None

@bot.event
async def on_ready():
    print('бот запущен')

@bot.command()
@commands.has_permissions(administrator=True)
async def lobby(ctx):
    emb = discord.Embed(title='Открыт набор в игру!',
                        description=''.join(descp),
                        colour=discord.Color.red()
                        )
    message = await ctx.send(embed=emb)
    await message.add_reaction('📝')
    await message.add_reaction('🔊')
    global post_ID
    post_ID = message.id

    print('> создано лобби ID =', post_ID)

Мне выдает ошибку об отсутствующих разрешениях, но я не могу понять какие именно надо боту выдать разрешения (казалось у него есть то, что надо)

бот запущен
Ignoring exception in command lobby:
Traceback (most recent call last):
  File "", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "", line 23, in lobby
    message = await ctx.send(embed=emb)
  File "", line 1065, in send
    data = await state.http.send_message(channel.id, content, tts=tts, embed=embed,
  File "", line 248, in request
    raise Forbidden(r, data)
discord.errors.Forbidden: 403 Forbidden (error code: 50013): Missing Permissions

Мне что-то надо обновить или как решить данную задачу?
Что я пробовал:

редактировать права канала
редактировать права роли бота
переустанавливать бота

В общем и целом, чтобы решить проблему именно с разрешениями, я просто создал новый сервер и больше внимания уделил правам на каналах и ролях.


Ускорение рисунка turtle
Я делаю фрактал Леви на Python с помощью turtle. У меня получается но рисуется очень медленно. Мне надо завтра сдать эту работу но не хочется, чтобы учитель долго стоял и смотрел как она рисуется.
Вот код:
<code>
import turtle

def draw(n):
    if n == 0:
        turtle.forward(10)

    else:
        turtle.left(45)
        draw(n - 1)
        turtle.right(45)
        turtle.right(45)
        draw(n - 1)
        turtle.left(45)

draw(20)
</code>

В таких случаях я вызываю в начале кода функцию tracer() из модуля turtle, а когда нужно отрисовать, вызываю функцию update() из того же модуля.
В примере отрисовка производится всего 100 раз на более чем 200тыс движений
<code>
turtle.tracer(0)
t = turtle.Turtle()
for i in range(1000):
    t.goto(0, 0)
    t.lt(1.001)
    for j in range(100):
        t.fd(i)
        t.color('white') if i % 2 else t.color('black')
        t.lt(173)
    if not i % 10:
        turtle.update()
</code>


Как обнулить цикл. При выполнении elif, итератор j должен заново пробегаться, уже с элемента counter -1
<code>
n = int(input())
spisok = list()
for i in range(n):
    name = input()
    spisok.append(name)
a = int(input())
b = int(input())
counter = 0
spisok1 = list()
for j in spisok:
    counter += 1
    if counter % a != 0:
        spisok1.append(str(j))
    elif counter % a == 0:
        del spisok[:counter - 1]
        counter = 0

for k in spisok1:
    print(k)
</code>
Формат ввода
На первой строке вводится натуральное число N — количество солдат.
Далее следуют имена солдат в количестве N штук на отдельных строках.
Далее на отдельной строке следует натуральное число K — наряд получит каждый K-й солдат.
Наконец, на последней строке указывается натуральное число M — сколько раз будет повторено наказание каждого K-го.
Формат вывода
Нужно вывести на отдельных строках в том же порядке имена всех тех солдат, которых минует наказание.

Вроде же не сложно пройтись по списку и добавлять в новый все элементы кроме К-тых. Повторить М раз.

N = int(input())
names = [input() for _ in range(N)]
K = int(input())
M = int(input())
for _ in range(M):
    names = [name for i, name in enumerate(names, 1) if i % K != 0]
print(names)

Или тоже самое без list comprehensions.

N = int(input())
names = []
for _ in range(N):
    names.append(input())
K = int(input())
M = int(input())
for _ in range(M):
    new_names = []
    i = 1
    for name in names:
        if i % K != 0:
            new_names.append(name)
        i += 1
    names = new_names
print(names)


Не понимаю в чём проблема
Всё правильно работает, однако
shutil.copy2(a, dir_res) не принимает мои значения и выводит ошибку:

Введите директорию копирования 1:E:\CFG
Traceback (most recent call last):
  File "C:\Users\zoodlePC\Desktop\second.py", line 27, in <module>
    shutil.copytree(a, dir_res)
  File "C:\Users\zoodlePC\AppData\Local\Programs\Python\Python310\lib\shutil.py", line 556, in copytree
    return _copytree(entries=entries, src=src, dst=dst, symlinks=symlinks,
  File "C:\Users\zoodlePC\AppData\Local\Programs\Python\Python310\lib\shutil.py", line 457, in _copytree
    os.makedirs(dst, exist_ok=dirs_exist_ok)
  File "C:\Users\zoodlePC\AppData\Local\Programs\Python\Python310\lib\os.py", line 210, in makedirs
    head, tail = path.split(name)
  File "C:\Users\zoodlePC\AppData\Local\Programs\Python\Python310\lib\ntpath.py", line 185, in split
    p = os.fspath(p)
TypeError: expected str, bytes or os.PathLike object, not NoneType

Вот код программы:

import os
import time
import shutil

# получение имени папки:
time_s = time.time() # получение времени с начала эпохи
time_y = time.ctime(time_s) # преобразование секунд в нормальное время

# требуемые замены
time_y = time_y.replace(" ", "_") # замена недопустимых символов
time_y = time_y.replace(":", ".") #

# создание папки
directory = os.getcwd() # получаем местоположение программы
dir_res = os.mkdir(directory + "\\" + time_y) # создание папки с текущим временем

# сбор имён требуемых для архивации файлов
b = 1
i = 1
while i != 0:
    a = input("Введите директорию копирования " + str(b) + ":")
    b+=1

    if a == "Всё":
        break

    shutil.copy2(a, dir_res)

os.mkdir(directory + "\\" + time_y) возвращает None.
Присвойте переменной значение
os.path.join(os.path.abspath(directory), time_y) и все будет работать.


Выводится изначальная цена
<code>
def dis(price, discount):
    prise = price * (discount * 0.01)
    if prise - int(price) == 0:
        return int(price)
    else:
        return price

print(dis(1500, 50))
</code>

def disc(price: int, discount: int) -> int:

        if not discount: # проверяет наличие скидки если она равна 0, то возвращает просто цену
            return price

        return price * (discount * 0.01) # возврат цены со скидкой


Определить количество повторений слова в текстах и номера этих текстов
Имеется новый словарь вида:

texts2 = [{'id': 1, 'text': 'Шла Саша по шоссе'}, {'id': 2, 'text': 'Ехал Грека через реку'}, {'id': 3, 'text': 'Где труд там и счастье'}, {'id': 4, 'text': 'Доброта и труд рядом живут'}]

Необходимо определить количество повторений каждого слова и в каких текстах оно встречается, чтобы получить список:

result = {"word": "труд", "count": 2, "id": [3, 4]}

Есть функция, которая может реализовать данный алгоритм. На вход она принимает словарь и какое-либо слово.

def number_of_occurrences(text, word):
        res = {"word": word, "count": 0, "id": []}
        for key, value in text.items():
            n = value.count(word)
            if n:
                res["count"] += n
                res["id"].append(key)
        return res

number_of_occurrences(texts, 'труд')

Но в данном случае в качестве словаря используются старые данные:

texts = {1 : 'Шла Саша по шоссе', 2 :'Ехал Грека через реку', 3 : 'Где труд там и счастье', 4 : 'Доброта и труд рядом живут'}

Помогите, пожалуйста, реализовать эту функцию,чтобы она работала правильно со словарем texts2.

Я бы сделал так:
сначала собрал бы словарь, затем перевел бы в список
кроме того использовал бы
set при сборе
id вместо списка, чтобы не добавлять повторяющиеся
id (например для случая текста
вышли вышли мы на улицу вышли)

texts = [{'id': 1, 'text': 'Шла Саша по шоссе'}, {'id': 2, 'text': 'Ехал Грека через реку'}, {'id': 3, 'text': 'Где труд там и счастье'}, {'id': 4, 'text': 'Доброта и труд рядом живут'}]

tmp = dict()

for text in texts:
    for word in text['text'].split():
        tmp[word] = tmp.get(word, {'count': 0, 'id': set()})

        tmp[word]['count'] += 1
        tmp[word]['id'].add(text['id'])

res = [{'word': word, 'count': tmp[word]['count'], 'id': list([tmp[word]['id']])} for word in tmp]

print(res)

Конкретно для вашей задачи (с учетом того, что вы дополнили условие) ваша функция должна выглядеть так:

texts = [{'id': 1, 'text': 'Шла Саша по шоссе'}, {'id': 2, 'text': 'Ехал Грека через реку'}, {'id': 3, 'text': 'Где труд там и счастье'}, {'id': 4, 'text': 'Доброта и труд рядом живут'}]

def number_of_occurrences(word, texts):
    res = {"word": word, "count": 0, "id": []}
    for text in texts:
        n = text['text'].lower().count(word)
        if n:
            res["count"] += n
            if text['id'] not in res["id"]:
                res["id"].append(text['id'])

    return res

print(number_of_occurrences('шла', texts))

я специально перевел текст в нижний регистр, чтобы
шла и
Шла воспринимались как одно слово


Pandas рассчет mode() на скользящем окне
Как быстро посчитать моду на скользящем окне в pandas?
Средствами pandas выдает ошибку:

Dts[fnc].rolling(1000).mode()

AttributeError: 'Rolling' object has no attribute 'mode'

Через apply и lambda очень долго:

%timeit Dts[fnc].rolling(1000).apply(lambda x: stats.mode(x)[0])

Результат:

5.67 s ± 277 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Попробуйте воспользоваться "родным" Pandas методом Series.mode():
<code>
Dts[fnc].rolling(1000).apply(lambda x: x.mode()[0])
</code>


django.contrib.humanize не верно переводит время на русский язык
Баг django.contrib.humanize.templatetags.humanize NaturalTimeFormatter? Неверно/не до конца переводится обозначение времени.
Хочу убедиться, что это действительно баг, либо получить коммент как исправить:

import datetime
import random

from django.contrib.humanize.templatetags.humanize import NaturalTimeFormatter
from django.shortcuts import HttpResponse

def random_tm_str():
    choices = tuple(x for x in range(10))
    delta = datetime.timedelta(days=random.choice(choices),
                               hours=random.choice(choices),
                               minutes=random.choice(choices))
    now = datetime.datetime.now()
    return NaturalTimeFormatter.string_for(now - delta)

def index(request):
    txts = '<html>' \
           '<body'+'<br/>'.join(random_tm_str() for x in range(100)) + \
            '</body </html>'
    return HttpResponse(txts)

На выходе по index получаем:

2 дня, 2 часа ago
5 дней, 1 час ago
9 hours ago
4 дня, 9 часов ago
1 неделя, 2 дня ago
1 день, 9 часов ago
1 неделя, 2 дня ago
3 дня ago
4 дня, 1 час ago
1 неделя, 1 день ago
1 неделя, 2 дня ago
3 дня, 5 часов ago
5 дней, 5 часов ago
4 дня ago
1 неделя, 1 день ago
3 дня, 1 час ago
3 дня, 3 часа ago
1 неделя, 2 дня ago
5 дней ago
3 дня, 6 часов ago
2 дня, 5 часов ago
5 дней, 6 часов ago
1 неделя, 2 дня ago
1 неделя ago
3 дня, 4 часа ago
2 дня, 2 часа ago
2 дня, 1 час ago
1 неделя ago
2 дня, 6 часов ago
1 неделя, 1 день ago
1 неделя, 2 дня ago
1 день, 3 часа ago
1 неделя, 2 дня ago
4 дня, 8 часов ago
1 неделя ago
4 hours ago
6 hours ago
4 дня, 9 часов ago
2 дня, 7 часов ago
5 дней, 7 часов ago
4 дня ago
5 дней, 3 часа ago
1 неделя ago
1 неделя ago
an hour ago
5 дней, 3 часа ago
1 неделя, 1 день ago
2 дня, 1 час ago
1 неделя, 1 день ago
2 дня, 3 часа ago
2 дня, 8 часов ago
7 hours ago
1 неделя ago
1 неделя ago
1 неделя ago
5 дней, 4 часа ago
4 hours ago
3 hours ago
1 день, 5 часов ago
1 неделя, 2 дня ago
6 дней ago
1 неделя ago
1 неделя, 2 дня ago

То есть не смотря на включенный русский язык не все фразы выглядят русскими.
Кто нибудь сталкивался с этим, и если да, то как победили?

Для того, чтобы использовать набор фильтров
django.contrib.humanize, необходимо их зарегистрировать, то есть, добавить в раздел
INSTALLED_APPS файла
settings.py.


interval_range и pd.cut с игнорированием Overlapping error
Имеется код, который делит датафрейм на сегменты(колонка n1) в зависимости от колонки linear.
<code>
import pandas as pd
import numpy as np
d = {'stores': ['AG21', 'AG41', 'AG85', 'AG45',
'AG31', 'AS25', 'AR81', 'AA43',
'AG21', 'AD83', 'AA36', 'AG55',
'AT58', 'AD11', 'AH32', 'AE17'],
'linear': [430, 145 , 120, 180,
250, 250, 250, 320,
376, 390, 420, 580,
350, 190, 125, 390]}
df = pd.DataFrame(data=d)
df = df.sort_values(by='linear')
ints = pd.interval_range(start=df['linear'].min(), periods=6, end=df['linear'].max(), closed='left')
df['ranges'] = pd.cut(df['linear'], bins=ints,labels=False, include_lowest=True)
def fun(x):
    if isinstance(x, float) is True:
        return np.nan
    else:
        return x.right
df['ranges1'] = df['ranges'].apply(fun)
df['n1'] = (df['ranges1'] != df['ranges1'].shift()).cumsum()
df
</code>
При попытке указания closed='both' в interval_range, для отображения нижней и верхней границы в расчете, получаю ошибку:

ValueError: Overlapping IntervalIndex is not accepted.

Нужно так, чтобы последняя строчка в linear тоже учитывалась в диапазоне, а closed='left' не берет ее.

Подозреваю, что проблема в точности представления чисел с плавающей точкой. Ну и в том, что у вас числа прямо на границе интервалов. Как это красиво/правильно вылечить не знаю, но если добавить некий эпсилон к правому краю в
pd.interval_range, то последнее значение попадёт в интервал:

end = df['linear'].max() + 1e-12

Вывод:

...
0   AG21    430 [426.66666666666737, 503.3333333333342) 503.333333  5
11  AG55    580 [503.3333333333342, 580.000000000001)   580.000000  6


Выбор всего текста до определенного слова (регулярные выражения)
задача в следующем:
Есть строки: "test/test/chars" "test/test"
Как написать регулярное выражение, чтобы выделялось только "test/test" в обоих слуаях
Я пробовал написать .*(?=/chars), но оно работает только в первом случае ("test/test/chars"), без chars оно не выделяет ничего.
Язык программирования python
Пробовал:
<code>
re.findall('.*(?=\/chars)', 'test/test')
re.findall('.*(?=\/chars)', 'test/test/chars')
</code>

в вашем случае впереди надо искать либо
/chars либо конец строки
$

.*?(?=\/chars|$)

либо,

(.*?)(?>\/chars)?$

последнее дастат результат
test/test для строки
test/test/chars, но для строки
test/tests/chars1 вернет всю строку целиком


{} в строке python
<code>
"Привет {}".format( "мир" }
</code>
Как вставить {} в строку чтобы format воспринимал их ак ломаные кавычки. Это нужно для других format которые будут применены к строке позже, с другими данными которых пока нету.

print("Привет {}{{}}".format("мир"))
#Привет мир{}


Как создать список по макету?
Допустим у меня есть списки: pum , root , number

pum = [9 , 15 ,  4]

root = [3 , 2]

number = [15]

И мне надо чтобы в итоге получился список all_numbers

all_numbers = [3 , 15 , 2]

Также хочу заметить что 15(или любое другое число) могут стоять в разных частях списка
Например:

pum = [15 , 9 , 4]

root = [3 , 2]

number = [15]

И в итоге:

all_numbers = [15 , 3 , 2]

Как должен работать алгоритм:
Вначале в список добавляются числа 3 и 2 ,после чего, если 15 было посередине списка Pum,то оно добавляется в середину списка all_numbers,если в начале, то в начало и т.д.

Я не до конца понял саму суть задания, но судя по описанию это должно вам помочь
<code>
pum = [9, 4, 15]

root = [3, 2]

number = [15]

all_numbers = []

all_numbers += root
all_numbers.insert(pum.index(15), 15)
print(all_numbers)
</code>


Что-то не так как должно по задумке. Python [дубликат]

На этот вопрос уже даны ответы здесь:

Неправильно работает сравнение переменной с несколькими значениями через or

                                (3 ответа)

Закрыт 1 год назад.

<code>
string_ = "This website is for losers LOL!"
def disemvowel(string_):
    size = len(string_)
    for i in range(size):
        if string_[i] == 'a' or 'i' or 'u' or 'e' or 'o' or 'O':
            string_.replace(string_[i], "")
    print(string_)
disemvowel(string_)
</code>
По задумке, если находится гласная буква то функцией replace() вырезаем ее из строки, но так не получается. По результату выводит изначальную полную строку

О чем мы в предыдущих вопросах говорили
не меняйте строку идя по ней, создайте новую

string_ = "This website is for losers LOL!"

string_ = ''.join(letter for letter in string_ if letter not in 'aiueoO')

print(string_)

а можно через регулярные выражения:

import re

string_ = "This website is for losers LOL!"

string_1 = re.sub('[aiueoO]', '', string_)


Переключение на новое окно pywinauto
автоматизирую одну программу. В начале когда я запускаю её там логин панель(вход), я нажимаю на кнопку войти дальше окно закрывается и через время появляется другое
Задача:

Дождаться появления нового окна
Переключиться на это окно что бы можно было с ним работать

Вот код:
<code>
from pywinauto.application import Application
import pywinauto.mouse as mouse

app = Application(backend="uia").start("Alien Crypter v3.exe")
windows = app.window(title="Alien Crypter", auto_id="Form2", control_type="Window").wait('visible', timeout=20, retry_interval=0.5)

def login(app):
    coords = app.Dialog.child_window(title="Login", auto_id="Guna2GradientTileButton1", control_type="Pane").rectangle().mid_point()
    mouse.click(coords=(coords.x, coords.y))
login(app)
</code>

На самом деле много не понадобилось, достаточно просмотреть приложение например в
Instepct.exe и найти например
auto_id нужного элемента и дождаться его при помощи
wait()


поиск минимального и максимального по критерию длины числа python
Дана последовательность чисел, завершающаяся числом 0. Найдите самое короткое и длинное число из введенных. Для вычисления длины числа, нахождения минимума и максимума используйте отдельные функции.
Формат входных данных:
Вводится последовательность целых чисел, оканчивающаяся числом 0 (само число 0 в последовательность не входит, а служит как признак ее окончания).
<code>
def count_digits(num):
    count = 0
    while num:
        num //= 10
        count += 1
    return count

def min_max(num, count):
    num_len = count
    max_len, min_len = -1, 99999999
    min_num, max_num = None, None
    if num_len > max_len:
        max_len = num_len
        max_num = num
    if num_len < min_len:
        min_len = num_len
        min_num = num
    print(min_num, max_num)

while True:
    num = int(input())
    if num == 0:
        break
    count = count_digits(num)
    min_max(num, count)
</code>
Не могу понять, в чем проблема, если например просто использовать поиск максимума, т.е убирать в функции часть с посиком минимума, все хорошо.. Не могу понять, где спотыкаюсь...

Не хватает отступов в двух последних строках, чтобы они входили в тело цикла
Здесь

if num_len < max_len:

должно быть

if num_len < min_len:

и min_len инициализируйте большим числом, например, 999999,а не -1

def min_max(lst):
    max_len, min_len = -1, 100000
    min_num, max_num = None, None
    for num in lst:
        num_len = count_digits(num)
        if num_len > max_len:
            max_len = num_len
            max_num = num
        if num_len < max_len:
            min_len = max_len
            min_num = num
    return min_num, max_num

lst = []
while True:
    num = int(input())
    if num == 0:
        break
    else:
        lst.append(num)
print(min_max(lst))


библиотеки и PyCharm
При установке библиотеки Flask, PyCharm пишет, что такой библиотеки не существует. Как быть?
ошибка:
ModuleNotFoundError: No module named 'Flask'
На удивление pip3 install Flask не помогает. При повторной установке пишет, что библиотека уже существует.

В настройках PyCharm нужно было установить системный интерпретатор, то есть Python, который устанавливался вручную, а не через PyCharm. И сделать также для самого файла.

PS после выбора системного интерпретатора можно будет увидеть доступные для обработки библиотеки.


Как создать сервер с помощью домашнего пк?
Помогите пожалуйста, нужно поднять сервер на простом домашнем компьютере. Как это сделать? В видео на YouTube ничего не понятно. Сервер будет использоваться для хранения, чтения и создания .txt файлов на нем.
Ход действий:

К серверу будет обращаться python'овский скрипт
При наличии файла с именем аккаунта будет открываться файл и проверяться файл на содержимое с паролем (внутри файла будет пароль)
Если файла с именем аккаунта нет, то создавать файл и записывать в него данные
Закрытие файла

Возможно ли это реализовать?

Предоставлять конкретный код не буду, так как это не решит проблему вашего незнания, а также усугубит навык "Я не знаю как это делать, но и гуглить я не буду".
Для простого общения используйте библиотеку socket. В гугле третья ссылка после http серверов, которые вам не нужны, так как вам не нужен сайт.
Еще один довольно полезный источник. Ну и вот.
Пока этого будет достаточно, на мой взгляд. В свое время я на этой библиотеке писал мессенджер. Его логика была такая: Если подключается новый юзер, я отправляю всем тем, кто на данный момент подключен, определенную команду, содержащую аргументы времени и ника пользователя. По сути, сервер выполнял команду, получи от одного и отправь всем.

PS не забывайте, что гугл может ответить на 90% ваших вопросов.


Получение файлов из директории в правильном порядке | Python
Мне надо получить все файлы из папки с форматом docx. Делаю это так:

glob.glob("/home/adam/*docx")

Смысл в том, что мой файлы имею форматы названия Name 1.docx, Name 2.docx, Name 10.docx, Name 11.docx, Name 12.docx, Name 100.docx.
Как я понял, любая подобная функция сортирует массив в зависимости от разряда чисел. Т.е., в примере выше мне выдаст не:

[
    'Name 100.docx',
    'Name 10.docx',
    'Name 11.docx',
    'Name 12.docx',
    'Name 1.docx',
]

Как мне отключить эту функцию? Я хочу получать список в том же порядке, как он отображется в винде: "Сортировка по имени. От меньшего к большему"

воспользуйтесь модулем natsort:

from natsort import natsorted  #  pip install natsort

files = [
    'Name 100.docx',
    'Name 10.docx',
    'Name 11.docx',
    'Name 12.docx',
    'Name 1.docx',
]

res = natsorted(files)

результат:

In [15]: res
Out[15]:
['Name 1.docx',
 'Name 10.docx',
 'Name 11.docx',
 'Name 12.docx',
 'Name 100.docx']


Непонятна логика
<code>
i = 0
save = []
while i <= 9:
    arr = int(input(("Введите число:")))
    save += [arr]
    i += 1
def positive_sum(arr):
    for i in arr:
        if i < 0:
            arr.remove(i)
    print(arr)
positive_sum(save)
</code>
Есть значит такой код, который должен отрицательное число со списка удалить, но какие-то он удаляет, а некоторые отрицательные оставляет почему так?
Вот к примеру что вывелось в конце [213, 1, 23, 4, 21, -2, -4] Хотя -2 и -4 не должно быть.

потому что НИКОГДА НЕ УДАЛЯЙТЕ ЭЛЕМЕНТЫ ДВИГАЯСЬ ПО СПИСКУ!!!
ошибка многих - вы идете по списку от его начало до конца, но удаляя элемент вы сокращаете его размер и как бы сдвигаетесь еще вперед, в итоге ваша нумерация слетает и возникает ошибка в логике
режьте с помощью
filter

save = list(filter(lambda elem: elem >= 0, save))

т.е. вы собираете новый список из элементов старого, которые не меньше 0
ну или можно собрать новый список из старого через
for if

save = [elem for elem in save if elem >= 0]

при простых условиях это выглядит короче, чем через
filter
P.S.
кстати зачем такой изврат?

i = 0
while i <= 9:
    arr = int(input(("Введите число:")))
    save += [arr]
    i += 1

можно же

save = [int(input(("Введите число:"))) for i in range(10)]

ну или если не нравится в 1 строку, то

for i in range(10):
    save += [int(input(("Введите число:")))]

а если числа передать через пробел то вообще можно так:

save = list(map(int, input().split()))[:10]


Можно ли ранее обозначенную числом переменную вывести из str в int?
Всем доброго времени суток. Появилась необходимость сделать мини метрический калькулятор. Например, из слова "megananokilogigamicrometer" по приставкам вывести степень конечного числа x. На примере mega имеет вид 10^6, nano 10^-9 и так далее, в итоге получится 10^3, нужно вывести степень 10, то есть 3. Я обозначил в коде заранее, чему равны эти переменные, но после того, как я нашел их в слове, не знаю, как вернуть в них значение из начала. Вот код:
<code>
tera    =12
giga    =9
mega    =6
kilo    =3
deci    =-1
centi   =-2
milli   =-3
micro   =-6
nano    =-9

words = ['tera', 'giga', 'mega', 'kilo', 'deci','centi', 'milli', 'micro', 'nano']

word = input()
ans = []

##Находим слова-приставки
for i in words:
    if i in word:
        ans.append(i)

##Находим сумму их степени
print(sum(map(int, ans)))
</code>
Главный для меня вопрос - как все таки перевести приставку, которую я получил в цикле for в заданное ей значение. Опять же пример. Слово kilometer. В цикле for я получаю 'kilo' в строчке, но как эту "kilo" перевести в 3

Как вам написали создайте словарь, который содержит значения для степеней, а не список
<code>
words = {'tera':12, 'giga':9, 'mega':6, 'kilo':3, 'deci':-1,'centi':-2, 'milli':-3, 'micro':-6, 'nano':-9}

test = "megananokilogigamicrometer"
result = 0

for key in words.keys():
  if key in test:
    result += words[key]

print(result)

# вывод
# 3
</code>


Можете помочь, мне нужно передать аргументы через argparse
Мне надо передать несколько аргументов: delay, id, token через argparse следующим образом
python C:\Script.py -d 0.2 -i 4554053 -t "DHFKJDFHGKJH"
Код:

import telebot
import time
import pyautogui
import argparse

delay_parser = argparse.ArgumentParser(description='The delay')
delay_parser.add_argument("-d", "--delay", help="The delay in minutes", type=float)

id_parser = argparse.ArgumentParser(description='The id')
id_parser.add_argument("-i", "--id", help="The id where the bot will send screenshots", type=str)

token_parser = argparse.ArgumentParser(description='The token')
token_parser.add_argument("-p", "--token", help="Thet telegram bot token", type=str)

delay = delay_parser.parse_args()
id_ = id_parser.parse_args()
token_ = token_parser.parse_args()

minutes = delay
id = id_
token = token_

def get():
    ScreenShot = pyautogui.screenshot()

    return ScreenShot

bot = telebot.TeleBot(token)

while True:
    screen = get()
    print("Successfully saved screenshot")

    bot.send_photo(id, screen)
    print("Successfully sended")

    time.sleep(60 * minutes)

bot.polling(none_stop=True)

Парсер нужен один. И у него указываются аргументы.
<code>
import argparse

parser = argparse.ArgumentParser(description='My program')
parser.add_argument("-d", "--delay", help="The delay in minutes", type=float)
parser.add_argument("-i", "--id"   , help="The id to where the bot will send screenshots", type=str)
parser.add_argument("-p", "--token", help="The telegram bot token", type=str)

args = parser.parse_args()
print(args.delay, args.id, args.token)
</code>


Как можно увеличить скорость программы с перестановками?
Ввожу с экрана числа N,M,O которые больше и равны нуля
N показывает сколько раз будет использоваться символ '()'. М показывает сколько раз будет использоваться '[]'. O показывает сколько раз будет использоваться '{}'. Нужно найти все перестановки символов.
<code>
def permut(arr):
    if len(arr) == 0:
        return [arr]
    res = []
    for i, j in enumerate(arr):
        res += [j+k for k in permut(arr[:i]+arr[i+1:])]
    return res

def main():
    N = int(input())
    M = int(input())
    O = int(input())

    array = []
    if N >= 0 and M >= 0 and O >= 0:
        array.append('()' * N)
        array.append('[]' * M)
        array.append('{}' * O)
    simbols = (''.join(map(str, array)))
    mat = list(set(permut(simbols)))
    print('\n'.join(mat))

main()
</code>

Если считать, что заданы одиночные символы в указанном количестве, то количество перестановок будет

 (n + m+o)!/(n!*m!*o!)

Если символы из пар разбиваются, то

 (2*n + 2*m + 2* o)!/((n!)^2*(m!)^2*(o!)^2)

Если нужны сами перестановки (что сомнительно уже при не очень больших параметрах), то стоит нужно использовать  алгоритм next_permutation (код с сайта nayuki), не требующий дополнительной памяти. К сожалению,
itertool.permutations не учитывает одинаковость элементов, и будет генерировать повторы.

def next_permutation(arr):
    # Find non-increasing suffix
    i = len(arr) - 1
    while i > 0 and arr[i - 1] >= arr[i]:
        i -= 1
    if i <= 0:
        return False

    # Find successor to pivot
    j = len(arr) - 1
    while arr[j] <= arr[i - 1]:
        j -= 1
    arr[i - 1], arr[j] = arr[j], arr[i - 1]

    # Reverse suffix
    arr[i : ] = arr[len(arr) - 1 : i - 1 : -1]
    return True

Использование:

a = sorted(list('[[(')) #начальная перестановка должна быть лексически наименьшей
print(''.join(a))
while next_permutation(a):
    print(''.join(a))

или прямо на строке:

a = sorted('[[(')
print(a)
while next_permutation(a):
    print(a)

([[
[([
[[(


Сжатие с помощью алгоритма LZW на pytohn
Потребовалось написать реализацию алгоритма LZW на python. В результате выполнения программы на примере входного файла небольшого размера выходной файл имеет размер, превышающий размер входного.
Код:
<code>
import argparse
from struct import *

mode = ''
file_paths = []
arch_path = ''

class Compressor:
    def __init__(self, file_paths, arch_path):
        self.file_paths = file_paths
        self.arch_path = arch_path

    def readFile(self, path):
        input_file = open(path, 'rt')
        data = input_file.read()
        input_file.close()
        return data

    def compressData(self, data, dictionary, dict_size):
        compessed_data = []
        string = ''
        for symbol in data:
            new_string = string + symbol
            if new_string in dictionary:
                string = new_string
            else:
                compessed_data.append(dictionary[string])
                dictionary[new_string] = dict_size
                dict_size += 1
                string = symbol

        if string in dictionary:
            compessed_data.append(dictionary[string])
        return compessed_data

    def writeFile(self, compressed_data):
        output_file = open(self.arch_path, 'wb')
        for data in compressed_data:
            output_file.write(pack('>H', int(data)))
        output_file.close()

    def compress(self):
        for path in self.file_paths:
            dict_size = 256
            dictionary = {chr(i): i for i in range(dict_size)}
            data = self.readFile(path)
            compressed_data = self.compressData(data, dictionary, dict_size)
            self.writeFile(compressed_data)

if __name__ == '__main__':
    args = parseCmdArgs(sys.argv)
    if args.mode == 'pack':
        Compressor(<путь к файлу>, <путь к архиву>).compress()
</code>
Текст в исходном файле: "abacabadabacabae" (16 bytes)
Размер выходного файла - 22 bytes
Почему выходной файл имеет больший размер?

В алгоритме lzw происходит расширение алфавита. Например, вместо 8 бит на символ используется 16, но при этом 16 бит кодируют некоторую последовательность символов.
То есть строка "abcd", которая изначально весила 4 байта, будет весить в 2 раза больше (т.к. нет повторяющихся символом и невозможно расширить алфавит). Сжатие будет заметно только на больших данных, и чем больше будет повторяющихся последовательностей символов, тем эффективнее будет сжатие.


Необходимо выполнить транслитерацию документа и вернуть матрицу каждой строкой которой является предложение исходного документа
Здравствуйте попалась интересная задачка:
Необходимо написать функцию, принимающую в качестве аргумента текстовый документ на русском языке, выполняющую транслитерацию документа и возвращающую числовую матрицу, каждой строкой которой является предложение исходного документа. Знаки препинания в таких предложениях следует проигнорировать, а слова - заменить суммой порядковых номеров составляющих их букв в латинском алфавите. Отсутствующие позиции заполнить нулями.
Первая часть задания не вызывает трудностей, создал словарь

def myfunction(filename):
    with open(filename ,encoding="utf8") as file:
        in_file = file.read()
    dictionary = {'а':'a','б':'b','в':'v','г':'g','д':'d','е':'e','ё':'yo',
      'ж':'zh','з':'z','и':'i','й':'i','к':'k','л':'l','м':'m','н':'n',
      'о':'o','п':'p','р':'r','с':'s','т':'t','у':'u','ф':'f','х':'h',
      'ц':'c','ч':'ch','ш':'sh','щ':'sch','ъ':'','ы':'y','ь':'','э':'e',
      'ю':'u','я':'ya', 'А':'A','Б':'B','В':'V','Г':'G','Д':'D','Е':'E','Ё':'Yo',
      'Ж':'Zh','З':'Z','И':'I','Й':'I','К':'K','Л':'L','М':'M','Н':'N',
      'О':'O','П':'P','Р':'R','С':'S','Т':'T','У':'U','Ф':'F','Х':'H',
      'Ц':'C','Ч':'Ch','Ш':'Sh','Щ':'Sch','Ъ':'','Ы':'y','Ь':'','Э':'E',
      'Ю':'U','Я':'Ya'}
       for i in dictionary :
            in_file = in_file.replace(i,dictionary[i])
       print (in_file)

Потом я предположил что необходимо соотнести каждую букву к её порядковому номеру в алфавите, то есть сделать обратный перевод только уже в формате
'Буква' :'Номер'

dictionary1 = {
        'A':'1', 'B':'2', 'C':'3', 'D':'4' ,
        'E':'5' , 'F':'6','G':'7', 'H':'8',
        'I':'9','J':'10','K':'11','L':'12',
        'M':'13','N':'14','O':'15','P':'16','Q':'17',
        'R':'18','S':'19','T':'20','U':'21',
        'V':'22','W':'23','X':'24',
        'Y':'25','Z':'26','a':'1', 'b':'2', 'c':'3', 'd':'4' ,
        'e':'5' , 'f':'6','g':'7', 'h':'8',
        'i':'9','j':'10','k':'11','l':'12',
        'm':'13','n':'14','o':'15','p':'16','q':'17',
        'r':'18','s':'19','t':'20','u':'21',
        'v':'22','w':'23','x':'24',
        'y':'25','z':'26', ' ':' ', '\n':'0', '.':'\n'}
         for i in dictionary1 :
        in_file = in_file.replace(i,dictionary1[i])
        print (in_file)

Таким образом получаю на выходе уже строку из условно цифр (так как тип относиться строковому)
На этом этапе я встрял и не могу дальше додуматься к решению.
Подскажите кто знает

ну всё делал верно... и видимо встрял на пробелах...
в итоге же должно получится ааа-3 ббб ввв - 6 9
следовательно нужно промежуточная замена пробела, для того чтобы можно было отличать цифры одного слова от цифр другого слова то есть
ббб ввв - 2 2 2 3 3 3 между двойками и тройками лишь один пробел, то есть теряется граница слова. Предлагаю изначально заменить пробел символом табуляции, это и парсится легко и в текстовом редакторе отображается как пробелы


Создать список столбцов со значениями "yes" или "no" из датафрейма pandas
Мне надо заменить все значения
yes/no на
1/0 в датафрейме pandas. Как это сделать я знаю, но вот для начала я хотел бы создать список из этих столбцов, но никак идеи в голову не приходят.

Как-то так. Eсли у вас строковые только эти колонки, то дополнительная проверка с
any не нужна, тем более я её явно не оптимально как-то написал.

import pandas as pd

df = pd.DataFrame({'int': [1, 2, 3], 'obj1': ['yes', 'no', 'yes'], 'obj2': ['no', 'yes', 'no'], 'obj3': ['n', 'y', 'n']})

obj_columns = df.columns[df.dtypes == 'object'].to_list()
for col in obj_columns:
    if any(df[col].str.contains(x).any() for x in ('yes','no')):
        df[col] = df[col].map({'yes': 1, 'no': 0})

На выходе:

  int obj1  obj2 obj3
0   1    1     0    n
1   2    0     1    y
2   3    1     0    n


Узнать день недели
Вася изобрёл машину времени. И уже переместился во времени в d1-й день m1-го месяца некоторого года. Оказалось, что это w1-й день недели. Сейчас Вася планирует переместиться во времени в день 2-й m2-го месяца этого же года. Помогите ему узнать, какой это будет день недели. Считайте, что этот год невисокосный. Формат входных данных Первая строка содержит три целых числа m1, d1 и w1 - месяц, число и день недели первой даты. Вторая строка содержит два целых числа m2 и d2 - месяц и число второй даты. Формат выходных данных Выведите одно число w2 – день недели второй даты.
<code>
import datetime
import random

def generate_year() -> int:
    year = random.randint(1000, 2200)
    if((year % 400 == 0) or
        (year % 100 != 0) and
        (year % 4 == 0)):
        return year
    else:
        generate_year()

def day_of_week(first_line: list, second_line: list):
    month, num, day = first_line
    month2, num2 = second_line
    year = generate_year()

    date = datetime.date(month, day, year)
</code>

Непонятно, зачем все эти все шаманские танцы.Если день недели задан просто числом, то наверное и вывод дня недели надо выполнить в виде числа. И тогда:

from datetime import datetime
m1,d1,w1=input().split(',')
w1=int(w1)
a = datetime.strptime(m1+'/'+d1, "%m/%d")
m2,d2=input().split(',')
b = datetime.strptime(m2+'/'+d2, "%m/%d")
delta = b - a
(delta.days+w1)%7

Пример вводим 27 февраля пятница, т.е. 2,27,5
Интересуемся днем 6 марта, т.е. 3,6

2,27,5

3,6
Out[34]: 5

Надо только помнить, что номера дней недели отсчитываются от понедельника (1), а воскресенье соответствует 0.
Ну например:

2,27,5
3,8
Out[35]: 0


Определите количество цепочек длины 4, где все четыре символа различны
Скачайте текстовый файл, состоящий не более чем из 106 символов A, B, C и D.
Определите количество цепочек длины 4, где все четыре символа различны.
Не очень понимаю как проверять сразу длину цепочки и количество символов, идея была примерно такая:
<code>
file = open("24.14.txt")
line = file.readline()
count = 0
maxx_summ = 0
for i in range(len(line)-1):
    if line[i] != line[i+1] and line[i+1] != line[i+2] and line[i+2] != line[i+3]:
        count += 1
        maxx_summ = max(maxx_summ,count)
    else:
        count = 1
 print(maxx_summ)
</code>

ты внутри цикла используешь

line[i],
line[i+1],
line[i+2],
line[i+3]
Следовательно тебе нужно убедиться, что
i + 3 не превышает
len(line) - 1.
Получается нужно уменьшить длину цикла до
len(line) - 3

Для того, чтобы проверить, что у тебя все символы различны, можно использовать set

{line[i], line[i+1], line[i+1], line[i+3]} и проверить, что количество элементов в этом сете равна 4

У тебя счетчики
count и
maxx_summ используются примерно для одного и того же, можно обойтись одним

в итоге, если модифицировать твой код, получится

count = 0
for i in range(len(line)-3):
    if len({line[i], line[i+1], line[i+2], line[i+3]}) == 4:
        count += 1

print(count)


Heroku ограничения по работе скриптов
Я загрузил вчера телеграм бота на хостинг Хероку, я хотел бы знать какие есть ограничения по работе моего бота на этом хостинге, а то есть сколько времени он может там работать без отключений?

Инстанс заснет через полчаса бездействия. Когда сам использовал его, раньше был лимит на 550 часов работы в месяц. Сейчас на сайте не нашел упоминания про это.


изменение размера, перемещение и поворот QWidget во время работы программы
У меня есть QWidget и мне нужно изменять его размер, перемещать и поворачивать по форме (как в Фотошоп или QtDesigner).
Это всё должно быть во время работы приложения.
Помогите пожалуйста и нет я не Фотошоп делаю.
Вот мой код перемещения, но вот изменение размера и поворот я не где в Google не нашёл:
'''
<code>
def mousePressEvent(self, event):
    self.__mousePressPos = None
    self.__mouseMovePos = None
    if event.button() == Qt.LeftButton:
        self.__mousePressPos = event.globalPos()
        self.__mouseMovePos = event.globalPos()
    super(DragButton, self).mousePressEvent(event)

def mouseMoveEvent(self, event):
    if event.buttons() == Qt.LeftButton:
        # adjust offset from clicked point to origin of widget
        currPos = self.mapToGlobal(self.pos())
        globalPos = event.globalPos()
        diff = globalPos - self.__mouseMovePos
        newPos = self.mapFromGlobal(currPos + diff)
        self.move(newPos)
        self.__mouseMovePos = globalPos
    super(DragButton, self).mouseMoveEvent(event)

def mouseReleaseEvent(self, event):
    if self.__mousePressPos is not None:
        moved = event.globalPos() - self.__mousePressPos
        if moved.manhattanLength() > 3:
            event.ignore()
            return
    super(DragButton, self).mouseReleaseEvent(event)
</code>
'''

Вот небольшой пример использования
QGraphicsProxyWidget, может быть это ваш случай

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGraphicsScene, QGraphicsView

if __name__=='__main__':
  app = QApplication(sys.argv)

  scene = QGraphicsScene()
  view = QGraphicsView(scene)
  view.setGeometry(100, 100, 400, 200)
  view.show()

  widget = QWidget() # << Ваш виджет
  proxy = scene.addWidget(widget)

  // Модифицируем виджет, используя его прокси
  // Масштаб
  proxy.setScale(2.0)
  // Вращение
  proxy.setRotation(30)

  sys.exit(app.exec_())

В документации есть такое предупреждение:

Using an OpenGL viewport limits the ability to use
QGraphicsProxyWidget . Not all combinations of widgets and styles can
be supported with such a setup. You should carefully test your UI and
make the necessary adjustments.


"угадай число" на python с записью 3 лучших результатов
нужно сделать игру "угадай число" с записью 3 лучших результатов по кол-ву попыток в файле. притом, если игрок со своим результатом входит в топ 3, он должен вписать своё имя, и оно должно отображаться в файле в виде:

Player1 - 1 попытка
Player2 - 2 попытки и т.д.

пока есть такой кусок кода

rand_num = random.choice(rand_num_list)
attempts = 0
import random
import pickle

rand_num_list = [1, 2, 3, 4, 5]
rand_num = random.choice(rand_num_list)
attempts = 0

# эти строчки раскоментить чтобы создать файл
# file = open("highScores.txt", "wb")
# file.close()

answer = int(input("Угадай число: "))
if answer == rand_num:
    attempts += 1
    print("Угадал")
    print(f'Тебе понадобилось {attempts} попыток')

elif answer < rand_num:
    print("Число слишком маленькое")
    attempts += 1

elif answer > rand_num:
    print("Число слишком большое")
    attempts += 1

Добавьте следующий код:

file = open("highScores.txt", 'w')
file.write(PlayerName+' - '+attempts+' '+po)
file.close()

Вот полный код:

import random
rand_num = random.randint(1, 5)
attempts = 0
while True:
    answer = int(input("Угадай число: "))
    if answer == rand_num:
        attempts += 1
        print("Угадал")
        print(f'Тебе понадобилось {attempts} попыток')
        PlayerName=input('Введи своё имя: ')
        file = open("highScores.txt", 'w')
        file.write(PlayerName+' - '+str(attempts)+' попыток\n')
        file.close()
        break
    elif answer < rand_num:
        print("Число слишком маленькое")
        attempts += 1

    elif answer > rand_num:
        print("Число слишком большое")
        attempts += 1


Как получить значение из строки в БД SQL?
Мне нужно вытащить значение из строки в БД и если значение в этой строке равно male то выполнить вывод текста в терминал,пытаюсь это сделать вот так
<code>
    def get_genderr(self, chat_id, gender):
    with self.connection:
        self.cursor.execute("SELECT * FROM `users` WHERE `chat_id`, 'gender' = (?,?)", (chat_id, gender)).fetchmany(1) # Просмотр пола
        if gender == 'male':
            print('тест')
</code>
Пишу на python база данных sql3

def select_gender_db(chat_id):
    conn = sqlite3.connect(db)
    gender = conn.execute('SELECT gender FROM users WHERE chat_id = ?', [chat_id]).fetchone()
    if gender is None:
        conn.close()
        return None
    else:
        conn.close()
        gender_id = gender[0]

a = select_gender_db(message.chat.id)
if a == 'male':
   print('male')


Как правильно сделать генератор списка?
Друзья, подскажите пожалуйста, как в одну строку записать цикл?
Пол дня потратили, ничего не получилось...
<code>
results_tokened_list = [['готовы', 'осведомленность', 'готовность', 'новой', 'рабочей', 'силы', 'медицинской', 'проверке', 'одному'], ['внедрение', 'принципа', 'принесли', 'детской'], ['детский', 'диатез', 'превращается', 'пренебрежение', 'злоупотребление', 'думают', 'родители'],['синоним', 'совершенства'], ['библиотека', 'bda', 'открыта'], ['юридическая', 'помощь', 'ваших', 'нужд'], ['шприцы', 'пациентов', 'вич']]

tmp = []
for i in results_tokened_list:
    for j in ngrams(i, n=3):
        tmp.append(' '.join(j))
</code>


Проблема с приложением
Вот код программы:`
<code>
    import tkinter as tk
from tkinter import ttk

class Main(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        self.init_main()

    def init_main(self):
        toolbar = tk.Frame(self, bg="#d7d8e0", bd=10)
        toolbar.pack(side=tk.TOP, fill=tk.X)

        btn_open_dialog1 = tk.Button(toolbar, text="Заявка", command=lambda:self.open_dialog1(), bg="#d7d8e0", bd=0,
                                      compound=tk.LEFT)
        btn_open_dialog1.pack(side=tk.LEFT)

        self.add_img = tk.PhotoImage(file="icons8-администратор-microsoft-50.png")
        btn_open_dialog2 = tk.Button(toolbar, text="ЗаявкаГАИ", command=lambda:self.open_dialog2(), bg="#d7d8e0", bd=0,
                                     compound=tk.LEFT)
        btn_open_dialog2.pack(side=tk.LEFT)

        self.add_img2 = tk.PhotoImage(file="icons8-администратор-microsoft-50.png")
        btn_open_dialog3 = tk.Button(toolbar, text="Администратор", command=lambda: self.open_dialog3(), bg="#d7d8e0",
                                     bd=0, compound=tk.LEFT)
        btn_open_dialog3.pack(side=tk.LEFT)

    def open_dialog2(self):
        ZaiavkaGAI()

    def open_dialog1(self):
        Zaiavka()

    def open_dialog3(self):
        Admin()

class Sotrudniki(tk.Toplevel):
    def __init__(self):
        super().__init__(root)
        self.init_Sotrudniki()

    def open_dialog8(self):
        Dobavlenie_Sotrudnika()

    def init_Sotrudniki(self):
        self.title("Сотрудники")
        self.geometry("600x420+400+300")
        self.resizable(False, False)

        toolbar2 = tk.Frame(self, bg='#d8d9e9', bd=0)
        toolbar2.pack(side=tk.TOP, fill=tk.X)
        self.add_img6 = tk.PhotoImage(file="siren_emergency_lights_hooter_police_icon_191334.png")
        btn_open_dialog8 = tk.Button(toolbar2, text="Добавить сотрудника", command=lambda: self.open_dialog8(),
                                     bg="#d7d8e0", bd=0,
                                     compound=tk.LEFT)
        btn_open_dialog8.pack(side=tk.LEFT)

        self.grab_set()
        self.focus_set()

        self.tree = ttk.Treeview(self, columns=("ID", "FIO driver", "nomber ud", "nomber pass", "age jods",), height=15,
                                 show="headings")
        self.tree.column("ID", width=20, anchor=tk.CENTER)
        self.tree.column("FIO driver", width=150, anchor=tk.CENTER)
        self.tree.column("nomber ud", width=150, anchor=tk.CENTER)
        self.tree.column("nomber pass", width=120, anchor=tk.CENTER)
        self.tree.column("age jods", width=170, anchor=tk.CENTER)

        self.tree.heading("ID", text = "ID")
        self.tree.heading("FIO driver", text="ФИО водителя эвак.")
        self.tree.heading("nomber ud", text="Номер удостоверения")
        self.tree.heading("nomber pass", text="Номер паспорта")
        self.tree.heading("age jods", text="Трудовой стаж")
        self.tree.pack()

class ZaiavkiADM(tk.Toplevel):
    def __init__(self):
         super().__init__(root)
         self.init_ZaiavkiADM()

    def init_ZaiavkiADM(self):
        self.title("Заявления на эвакуацию")
        self.geometry("797x420+400+300")
        self.resizable(False, False)

        self.grab_set()
        self.focus_set()

        self.tree = ttk.Treeview(self, columns=("ID", "FIO driver", "nomber ud", "nomber pass", "nomber car","Data",
                                                "Vid"),
                                 height=15,show="headings")
        self.tree.column("ID", width=25, anchor=tk.CENTER)
        self.tree.column("FIO driver", width=120, anchor=tk.CENTER)
        self.tree.column("nomber ud", width=135, anchor=tk.CENTER)
        self.tree.column("nomber pass", width=120, anchor=tk.CENTER)
        self.tree.column("nomber car", width=120, anchor=tk.CENTER)
        self.tree.column("Data", width=150, anchor=tk.CENTER)
        self.tree.column("Vid", width=150, anchor=tk.CENTER)

        self.tree.heading("ID", text="ID")
        self.tree.heading("FIO driver", text="ФИО водителя")
        self.tree.heading("nomber ud", text="Номер удостоверения")
        self.tree.heading("nomber pass", text="Номер паспорта")
        self.tree.heading("nomber car", text="Номер машины")
        self.tree.heading("Data", text="Дата подачи заявления")
        self.tree.heading("Vid", text="Вид заявления")
        self.tree.pack()

class Protocol(tk.Toplevel):
    def __init__(self):
        super().__init__()
        self.init_Protocol()

    def open_dialog7(self):
        Dobavlenie_Protocol()

    def init_Protocol(self):
        self.title("Протокол")
        self.geometry("900x420+400+300")
        self.resizable(True, True)

        self.grab_set()
        self.focus_set()
        toolbar2 = tk.Frame(self, bg='#d8d9e9', bd=0)
        toolbar2.pack(side=tk.TOP, fill=tk.X)
        self.add_img6 = tk.PhotoImage(file="siren_emergency_lights_hooter_police_icon_191334.png")
        btn_open_dialog7 = tk.Button(toolbar2, text="Заполнить протокол эвакуации", command=lambda: self.open_dialog7(),
                                     bg="#d7d8e0", bd=0,
                                     compound=tk.LEFT)
        btn_open_dialog7.pack(side=tk.LEFT)
        self.tree = ttk.Treeview(self, columns =("ID", "nomber car arrest", "FIO driver", "nomber car","adress arest",
                                                 "adres stop", "Data arrest"), height = 15,
                                 show="headings")
        self.tree.column("ID", width=20, anchor=tk.CENTER)
        self.tree.column("nomber car arrest", width=150, anchor=tk.CENTER)
        self.tree.column("FIO driver", width=150, anchor=tk.CENTER)
        self.tree.column("nomber car", width=120, anchor=tk.CENTER)
        self.tree.column("adress arest", width=170, anchor=tk.CENTER)
        self.tree.column("adres stop", width=170, anchor=tk.CENTER)
        self.tree.column("Data arrest", width=150, anchor=tk.CENTER)

        self.tree.heading("ID", text = "ID")
        self.tree.heading("nomber car arrest", text="Номер эвак. машины")
        self.tree.heading("FIO driver", text="ФИО водителя")
        self.tree.heading("nomber car", text="Номер эвакуатора")
        self.tree.heading("adress arest", text="Место эвакуации")
        self.tree.heading("adres stop", text="Место доставки")
        self.tree.heading("Data arrest", text="Дата эвакуации")
        self.tree.pack()

class ZaiavkaGAI(tk.Toplevel):
    def __init__(self):
        super().__init__(root)
        self.init_ZaiavkaGAI()

    def init_ZaiavkaGAI(self):
        self.title("Заполнить заявку ГАИ")
        self.geometry("400x320+400+300")
        self.resizable(False, False)

        label1 = tk.Label(self,text="Сотрудник ГАИ", fg="#eee", bg="#333")
        label1.pack()

        label_FIO_driver = tk.Label(self, text = "ФИО водителя")
        label_FIO_driver.place(x=80, y=30)

        label_entry_ud = tk.Label(self, text = "Номер удостоверения")
        label_entry_ud.place(x=60, y=60)

        label_entry_pass = tk.Label(self, text = "Номер паспорта")
        label_entry_pass.place(x=80, y=90)

        label_entry_nomder_car = tk.Label(self, text = "Номер машины")
        label_entry_nomder_car.place(x=80, y=120)

        label_Data = tk.Label(self, text="Дата заполнения")
        label_Data.place(x=80, y=150)

        self.entry_FIO_driver = ttk.Entry(self)
        self.entry_FIO_driver.place(x=190, y=30)

        self.entry_ud = ttk.Entry(self)
        self.entry_ud.place(x=190, y=60)

        self.entry_pass = ttk.Entry(self)
        self.entry_pass.place(x=190, y=90)

        self.entry_nomder_car = ttk.Entry(self)
        self.entry_nomder_car.place(x=190, y=120)

        self.Data = ttk.Entry(self)
        self.Data.place(x=190, y=150)

        btn_cansel = ttk.Button(self, text="Закрыть", command=self.destroy)
        btn_cansel.place(x=240, y=250)

        btn_add = ttk.Button(self, text="Добавить")
        btn_add.place(x=70, y=250)

        self.grab_set()
        self.focus_set()

class Admin(tk.Toplevel):
    def __init__(self):
        super().__init__()
        self.init_Admin()

    def open_dialog4(self):
        Protocol()

    def open_dialog5(self):
        Sotrudniki()

    @staticmethod
    def open_dialog6():
        ZaiavkiADM()

    def init_Admin(self):
        toolbar1 = tk.Frame(self, bg='#d8d9e9', bd=0)
        toolbar1.pack(side=tk.TOP, fill=tk.X)
        self.add_img3 = tk.PhotoImage(file="siren_emergency_lights_hooter_police_icon_191334.png")
        btn_open_dialog4 = tk.Button(toolbar1, text="Протокол эвакуации", command=lambda:self.open_dialog4(),
                                     bg="#d7d8e0", bd=0, compound=tk.LEFT)
        btn_open_dialog4.pack(side=tk.TOP)
        self.add_img4 = tk.PhotoImage(file="siren_emergency_lights_hooter_police_icon_191334.png")
        btn_open_dialog5 = tk.Button(toolbar1, text="Сотрудники", command=lambda: self.open_dialog5(), bg="#d7d8e0", bd=0,
                                     compound=tk.LEFT)
        btn_open_dialog5.pack(side=tk.TOP)

        self.add_img5 = tk.PhotoImage(file="siren_emergency_lights_hooter_police_icon_191334.png")
        btn_open_dialog6 = tk.Button(toolbar1, text="Заявления на эвакуацию", command=lambda: self.open_dialog6(),
                                     bg="#d7d8e0", bd=0,
                                     compound=tk.LEFT)
        btn_open_dialog6.pack(side=tk.TOP)

class Zaiavka(tk.Toplevel):
    def __init__(self):
        super().__init__()
        self.init_Zaiavka()

    def init_Zaiavka(self):
        self.title("Заполнить заявку")
        self.geometry("400x320+400+300")
        self.resizable(False, False)
        label1 = tk.Label(self,text="Частное лицо", fg="#eee", bg="#333")
        label1.pack()

        label_FIO_driver = tk.Label(self, text="ФИО водителя")
        label_FIO_driver.place(x=80, y=30)

        label_entry_ud = tk.Label(self, text="Номер удостоверения")
        label_entry_ud.place(x=50, y=60)

        label_entry_pass = tk.Label(self, text="Номер паспорта")
        label_entry_pass.place(x=80, y=90)

        label_entry_nomder_car = tk.Label(self, text="Номер машины")
        label_entry_nomder_car.place(x=80, y=120)

        label_Data = tk.Label(self, text="Дата заполнения")
        label_Data.place(x=80, y=150)

        self.FIO_driver = ttk.Entry(self)
        self.FIO_driver.place(x=180, y=30)

        self.entry_ud = ttk.Entry(self)
        self.entry_ud.place(x=180, y=60)

        self.entry_pass = ttk.Entry(self)
        self.entry_pass.place(x=180, y=90)

        self.entry_nomder_car = ttk.Entry(self)
        self.entry_nomder_car.place(x=180, y=120)

        self.Data = ttk.Entry(self)
        self.Data.place(x=180, y=150)

        self.grab_set()
        self.focus_set()

        btn_cansel = ttk.Button(self, text = "Закрыть", command =self.destroy)
        btn_cansel.place(x=240, y=250)

        btn_add = ttk.Button(self, text="Добавить")
        btn_add.place(x=70, y=250)

class Dobavlenie_Protocol(tk.Toplevel):
    def __init__(self):
        super().__init__()
        self.init_Dobavlenie_Protocol()

    def init_Dobavlenie_Protocol(self):
        self.title("Заполнить протокол")
        self.geometry("400x320+400+300")
        self.resizable(False, False)

        label_nomber_car_driver = tk.Label(self, text="Номер машины")
        label_nomber_car_driver.place(x=80, y=30)

        label_entry_FIO = tk.Label(self, text="ФИО водителя")
        label_entry_FIO.place(x=80, y=60)

        label_entry_nomber_car_arrest = tk.Label(self, text="Номер эвак. машины")
        label_entry_nomber_car_arrest.place(x=55, y=90)

        label_entry_adress_arest = tk.Label(self, text="Место эвакуации")
        label_entry_adress_arest.place(x=80, y=120)

        label_entry_jail_adress = tk.Label(self, text="Место доставки")
        label_entry_jail_adress.place(x=80, y=150)

        label_entry_Data = tk.Label(self, text="Дата эвакуации")
        label_entry_Data.place(x=80, y=180)

        self.entry_nomber_car_driver = ttk.Entry(self)
        self.entry_nomber_car_driver.place(x=180, y=30)

        self.entry_FIO = ttk.Entry(self)
        self.entry_FIO.place(x=180, y=60)

        self.entry_nomber_car_arrest = ttk.Entry(self)
        self.entry_nomber_car_arrest.place(x=180, y=90)

        self.entry_adress_arest = ttk.Entry(self)
        self.entry_adress_arest.place(x=180, y=120)

        self.entry_jail_adress = ttk.Entry(self)
        self.entry_jail_adress.place(x=180, y=150)

        self.entry_Data = ttk.Entry(self)
        self.entry_Data.place(x=180, y=180)

        btn_cansel = ttk.Button(self, text="Закрыть", command=self.destroy)
        btn_cansel.place(x=240, y=250)

        btn_add = ttk.Button(self, text="Добавить")
        btn_add.place(x=70, y=250)

        self.grab_set()
        self.focus_set()

class Dobavlenie_Sotrudnika(tk.Toplevel):
    def __init__(self):
        super().__init__()
        self.init_Dobavlenie_Sotrudnika()

    def init_Dobavlenie_Sotrudnika(self):
        self.title("Добавить сотрудника")
        self.geometry("400x320+400+300")
        self.resizable(False, False)

        label_FIO_driver = tk.Label(self, text="ФИО сотрудника")
        label_FIO_driver.place(x=80, y=30)

        label_entry_nomber_ud = tk.Label(self, text="Номер удостоверения")
        label_entry_nomber_ud.place(x=50, y=60)

        label_entry_nomber_pass = tk.Label(self, text="Номер паспорта")
        label_entry_nomber_pass.place(x=80, y=90)

        label_entry_age_jobs = tk.Label(self, text="Трудовой стаж")
        label_entry_age_jobs.place(x=90, y=120)

        self.FIO_driver = ttk.Entry(self)
        self.FIO_driver.place(x=180, y=30)

        self.entry_nomber_ud = ttk.Entry(self)
        self.entry_nomber_ud.place(x=180, y=60)

        self.entry_nomber_pass = ttk.Entry(self)
        self.entry_nomber_pass.place(x=180, y=90)

        self.entry_entry_age_jobs = ttk.Entry(self)
        self.entry_entry_age_jobs.place(x=180, y=120)

        btn_cansel = ttk.Button(self, text="Закрыть", command=self.destroy)
        btn_cansel.place(x=240, y=250)

        btn_add = ttk.Button(self, text="Добавить")
        btn_add.place(x=70, y=250)

        self.grab_set()
        self.focus_set()

file = open("Protokol.data")
file.read()

if __name__ == "__main__":
    root = tk.Tk()
    app = Main(root)
    app.pack(side=tk.TOP, fill=tk.X)
    root.title("Эвакуаторное агенство")
    root.geometry("450x250+100+200")
    root.resizable(False, False)
    root.mainloop()
</code>
Нужно сделать следующее:
1.Добавить возможность вносить в таблицы(Сотрудники,Протоколы эвакуации,Заявки) новые данные через окна (Добавить Протокол,Добавить Сотрудника), данные так же нужно сохранить на файл(3 штуки,1 файл на 1 таблицу).
2.Оптимизировать код.
3.По скольку я еще новичок в этом то был бы очень рад если бы вы предоставили мне подробное объяснение всех ваших действий,что бы в дальнейшем все сам делал)

Нужен такой параметр "<Button-1>" в этой строчке:
<code>
btn_add.bind("<button-1>", lambda event: self.view.records3(self.FIO_driver,self.entry_ud,self.entry_pass,
                                                                    self.entry_nomder_car))
</code>


NameError: name 'secret_dec' is not defined
Пытаюсь вывести результат работы функции в
label через переменную

   def defbuttonencrypt(self):
        self.sec = secret_dec
        if self.res:
            decode_string(video=self.res)
            self.label.setText(self.sec)

я переменной
self.sec присвоил значение
глобальной переменной
global secret_dec, но почему то получаю ошибку:

Traceback (most recent call last):
  File "/home/mazafaker/python/SUPER PROJECT v228/project stegano/main.py", line 194, in defbuttonencrypt
    self.sec = secret_dec
NameError: name 'secret_dec' is not defined

полный код:

# -*- coding: utf8 -*-
# импортируемые модули для проекта
import os,sys
import pathlib
import wave
import numpy as np
import math
import cv2
import shutil
from math import ceil
from subprocess import call,STDOUT
from tqdm import tqdm
from stegano import lsb
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QDialog, QApplication, QFileDialog, QPushButton, QMainWindow, QLabel,QProgressBar

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(430, 538)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(20, 170, 241, 17))
        self.label_2.setStyleSheet("font: 9pt \"Ubuntu\";")
        self.label_2.setObjectName("label_2")
        self.browse = QtWidgets.QPushButton(self.centralwidget)
        self.browse.setGeometry(QtCore.QRect(250, 190, 89, 25))
        self.browse.setObjectName("browse")
        self.logo = QtWidgets.QLabel(self.centralwidget)
        self.logo.setGeometry(QtCore.QRect(90, -10, 251, 81))
        self.logo.setText("")
        self.logo.setPixmap(QtGui.QPixmap("./logo.png"))
        self.logo.setObjectName("logo")
        self.filename = QtWidgets.QLineEdit(self.centralwidget)
        self.filename.setGeometry(QtCore.QRect(20, 190, 221, 25))
        self.filename.setObjectName("filename")
        self.line = QtWidgets.QFrame(self.centralwidget)
        self.line.setGeometry(QtCore.QRect(-10, 220, 441, 31))
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.btncryptmsg = QtWidgets.QPushButton(self.centralwidget)
        self.btncryptmsg.setGeometry(QtCore.QRect(250, 110, 171, 21))
        self.btncryptmsg.setStyleSheet("font: 10pt \"Ubuntu\";")
        self.btncryptmsg.setObjectName("btncryptmsg")
        self.line_2 = QtWidgets.QFrame(self.centralwidget)
        self.line_2.setGeometry(QtCore.QRect(-20, 60, 471, 20))
        self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
        self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line_2.setObjectName("line_2")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(20, 90, 161, 17))
        self.label_4.setStyleSheet("font: 9pt \"Ubuntu\";")
        self.label_4.setObjectName("label_4")
        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(20, 110, 221, 51))
        self.textEdit.setObjectName("textEdit")
        self.btnencryptmsg = QtWidgets.QPushButton(self.centralwidget)
        self.btnencryptmsg.setGeometry(QtCore.QRect(250, 140, 171, 21))
        self.btnencryptmsg.setStyleSheet("font: 10pt \"Ubuntu\";")
        self.btnencryptmsg.setObjectName("btnencryptmsg")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(10, 240, 411, 111))
        self.label.setText("")
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 430, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label_2.setText(_translate("MainWindow", "Укажите путь к видео  файлу:"))
        self.browse.setText(_translate("MainWindow", "Обзор..."))
        self.btncryptmsg.setText(_translate("MainWindow", "зашифровать текст "))
        self.label_4.setText(_translate("MainWindow", "Введите сообщение:"))
        self.btnencryptmsg.setText(_translate("MainWindow", "расшифровать текст"))

# Function to split the message.
def split_string(split_str,count=10):
    per_c=math.ceil(len(split_str)/count)
    c_cout=0
    out_str=''
    split_list=[]
    for s in split_str:
        out_str+=s
        c_cout+=1
        if c_cout == per_c:
            split_list.append(out_str) # The message is divided into substrings
            out_str=''
            c_cout=0
    if c_cout!=0:
        split_list.append(out_str)
    return split_list

# As we know video is a collection of frames, where each frame is a picture.
# This function will extract each frame along with audio from the video.
def frame_extraction(video):
    if not os.path.exists("./temp"):
        os.makedirs("temp")
    temp_folder="./temp" # Temporary folder created to store the frames and audio from the video.
    print("[INFO] temp directory is created")
    vidcap = cv2.VideoCapture(video)
    count = 0
    while True:
        success, image = vidcap.read()
        if not success:
            break
        cv2.imwrite(os.path.join(temp_folder, "{:d}.png".format(count)), image)
        count += 1

# This function would embed the splitted string into the frames extracted from the video.
def encode_string(input_string,root="./temp/"):
    split_string_list=split_string(input_string)   # Acquire the splitted string from the message.
    for i in range(0,len(split_string_list)):
        f_name="{}{}.png".format(root,i)
        secret_enc=lsb.hide(f_name,split_string_list[i])   # Вставка разделенной строки в каждый кадр.
        secret_enc.save(f_name)                            # Сохранил кадры после сокрытия строк.
        print("[INFO] frame {} holds {}".format(f_name,lsb.reveal(f_name)))
    print("Сообщение хранится в файле  Embedded_Video.mp4 ")

# This function would decode the hidden message by extracting frames from the video
def decode_string(video):
    frame_extraction(video)        # Extracting each frame from the video
    secret=[]
    root="./temp/"
    for i in range(len(os.listdir(root))):
        f_name="{}{}.png".format(root,i)
        global secret_dec
        secret_dec=lsb.reveal(f_name)         # Выявление сообщения внутри каждой строки
        if secret_dec == None:
            break
        secret.append(secret_dec)
    print(''.join([i for i in secret]))
    clean_temp()

# This function would delete the temp directory
def clean_temp(path="./temp"):
    if os.path.exists(path):
        shutil.rmtree(path)
        print("[INFO] temp files are cleaned up")

# This function would extraxt audio from the video so as to stitch them back later.
def input_main(f_name):
    input_string = w.i
    frame_extraction(f_name)
    # The call function would be used to extract the audio and then stitch it again properly with the frames extracted.
    call(["ffmpeg", "-i",f_name, "-q:a", "0", "-map", "a", "temp/audio.mp3", "-y"],stdout=open(os.devnull, "w"), stderr=STDOUT)
    encode_string(input_string)
    call(["ffmpeg", "-i", "temp/%d.png" , "-vcodec", "png", "temp/Embedded_Video.mp4", "-y"],stdout=open(os.devnull, "w"), stderr=STDOUT)
    call(["ffmpeg", "-i", "temp/Embedded_Video.mp4", "-i", "temp/audio.mp3", "-codec", "copy", "Embedded_Video.mp4", "-y"],stdout=open(os.devnull, "w"), stderr=STDOUT)
    clean_temp()

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.res = None  # !!!

        # !!! тут логика
        self.btncryptmsg.clicked.connect(self.defbuttncrypt)
        self.btnencryptmsg.clicked.connect(self.defbuttonencrypt)
        self.browse.clicked.connect(self.clicker)

    def clicker(self):
        self.res, ok = QFileDialog.getOpenFileName(self, 'Open File', './')
        if self.res:  # +++
            self.filename.setText(self.res)  # !!!  - [0]

    def defbuttncrypt(self):
        self.i = self.textEdit.toPlainText()
        #input_main(f_name=w.res)
        if self.res:  # +++
            input_main(f_name=self.res)  # +++

    def defbuttonencrypt(self):
        self.sec = secret_dec
        if self.res:
            decode_string(video=self.res)
            self.label.setText(slef.sec)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    #    uw = Ui_MainWindow()                                      # ---                           # +++
    w.show()
    sys.exit(app.exec())

Я не могу проверить ваш пример, но предложу попробовать то, как я это понимаю.
Я оставил некоторые комментарии в тексте приложения, прочтите из и пробуйте запустить.
<code>
import sys
import os
import pathlib
import wave
import numpy as np
import math
import cv2
import shutil
from math import ceil
from subprocess import call,STDOUT
from tqdm import tqdm
from stegano import lsb
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QDialog, QApplication, QFileDialog, QPushButton, QMainWindow, QLabel,QProgressBar

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(430, 538)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(20, 170, 241, 17))
        self.label_2.setStyleSheet("font: 9pt \"Ubuntu\";")
        self.label_2.setObjectName("label_2")
        self.browse = QtWidgets.QPushButton(self.centralwidget)
        self.browse.setGeometry(QtCore.QRect(250, 190, 89, 25))
        self.browse.setObjectName("browse")
        self.logo = QtWidgets.QLabel(self.centralwidget)
        self.logo.setGeometry(QtCore.QRect(90, -10, 251, 81))
        self.logo.setText("")
        self.logo.setPixmap(QtGui.QPixmap("./logo.png"))
        self.logo.setObjectName("logo")
        self.filename = QtWidgets.QLineEdit(self.centralwidget)
        self.filename.setGeometry(QtCore.QRect(20, 190, 221, 25))
        self.filename.setObjectName("filename")
        self.line = QtWidgets.QFrame(self.centralwidget)
        self.line.setGeometry(QtCore.QRect(-10, 220, 441, 31))
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.btncryptmsg = QtWidgets.QPushButton(self.centralwidget)
        self.btncryptmsg.setGeometry(QtCore.QRect(250, 110, 171, 21))
        self.btncryptmsg.setStyleSheet("font: 10pt \"Ubuntu\";")
        self.btncryptmsg.setObjectName("btncryptmsg")
        self.line_2 = QtWidgets.QFrame(self.centralwidget)
        self.line_2.setGeometry(QtCore.QRect(-20, 60, 471, 20))
        self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
        self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line_2.setObjectName("line_2")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(20, 90, 161, 17))
        self.label_4.setStyleSheet("font: 9pt \"Ubuntu\";")
        self.label_4.setObjectName("label_4")
        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(20, 110, 221, 51))
        self.textEdit.setObjectName("textEdit")
        self.btnencryptmsg = QtWidgets.QPushButton(self.centralwidget)
        self.btnencryptmsg.setGeometry(QtCore.QRect(250, 140, 171, 21))
        self.btnencryptmsg.setStyleSheet("font: 10pt \"Ubuntu\";")
        self.btnencryptmsg.setObjectName("btnencryptmsg")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(10, 240, 411, 111))
        self.label.setText("")
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 430, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label_2.setText(_translate("MainWindow", "Укажите путь к видео  файлу:"))
        self.browse.setText(_translate("MainWindow", "Обзор..."))
        self.btncryptmsg.setText(_translate("MainWindow", "зашифровать текст "))
        self.label_4.setText(_translate("MainWindow", "Введите сообщение:"))
        self.btnencryptmsg.setText(_translate("MainWindow", "расшифровать текст"))

# Function to split the message.
def split_string(split_str,count=10):
    per_c=math.ceil(len(split_str)/count)
    c_cout=0
    out_str=''
    split_list=[]
    for s in split_str:
        out_str+=s
        c_cout+=1
        if c_cout == per_c:
            split_list.append(out_str) # The message is divided into substrings
            out_str=''
            c_cout=0
    if c_cout!=0:
        split_list.append(out_str)
    return split_list

# As we know video is a collection of frames, where each frame is a picture.
# This function will extract each frame along with audio from the video.
def frame_extraction(video):
    if not os.path.exists("./temp"):
        os.makedirs("temp")
    temp_folder="./temp" # Temporary folder created to store the frames and audio from the video.
    print("[INFO] temp directory is created")
    vidcap = cv2.VideoCapture(video)
    count = 0
    while True:
        success, image = vidcap.read()
        if not success:
            break
        cv2.imwrite(os.path.join(temp_folder, "{:d}.png".format(count)), image)
        count += 1

# This function would embed the splitted string into the frames extracted from the video.
def encode_string(input_string,root="./temp/"):
    split_string_list=split_string(input_string)   # Acquire the splitted string from the message.
    for i in range(0,len(split_string_list)):
        f_name="{}{}.png".format(root,i)
        secret_enc=lsb.hide(f_name,split_string_list[i])   # Вставка разделенной строки в каждый кадр.
        secret_enc.save(f_name)                            # Сохранил кадры после сокрытия строк.
        print("[INFO] frame {} holds {}".format(f_name,lsb.reveal(f_name)))
    print("Сообщение хранится в файле  Embedded_Video.mp4 ")

# Эта функция будет декодировать скрытое сообщение, извлекая кадры из видео.
def decode_string(video):
    frame_extraction(video)        # Extracting each frame from the video
    secret = []
    root="./temp/"
    for i in range(len(os.listdir(root))):
        f_name="{}{}.png".format(root, i)

# !!!
#        global secret_dec
        secret_dec = lsb.reveal(f_name)    # Выявление сообщения внутри каждой строки
        if secret_dec == None:
            break
        secret.append(secret_dec)
    print(''.join([i for i in secret]))
    clean_temp()

# !!!
    return secret                         # secret - это список     # +++  !!!

# This function would delete the temp directory
def clean_temp(path="./temp"):
    if os.path.exists(path):
        shutil.rmtree(path)
        print("[INFO] temp files are cleaned up")

# This function would extraxt audio from the video so as to stitch them back later.
def input_main(f_name):
    input_string = w.i
    frame_extraction(f_name)
    # The call function would be used to extract the audio and then stitch it again properly with the frames extracted.
    call(["ffmpeg", "-i",f_name, "-q:a", "0", "-map", "a", "temp/audio.mp3", "-y"],stdout=open(os.devnull, "w"), stderr=STDOUT)
    encode_string(input_string)
    call(["ffmpeg", "-i", "temp/%d.png" , "-vcodec", "png", "temp/Embedded_Video.mp4", "-y"],stdout=open(os.devnull, "w"), stderr=STDOUT)
    call(["ffmpeg", "-i", "temp/Embedded_Video.mp4", "-i", "temp/audio.mp3", "-codec", "copy", "Embedded_Video.mp4", "-y"],stdout=open(os.devnull, "w"), stderr=STDOUT)
    clean_temp()

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.res = None  # !!!

        # !!! тут логика
        self.btncryptmsg.clicked.connect(self.defbuttncrypt)

        # расшифровать текст
        self.btnencryptmsg.clicked.connect(self.defbuttonencrypt)
        self.browse.clicked.connect(self.clicker)

    def clicker(self):
        self.res, ok = QFileDialog.getOpenFileName(self, 'Open File', './')
        if self.res:  # +++
            self.filename.setText(self.res)  # !!!  - [0]

    def defbuttncrypt(self):
        self.i = self.textEdit.toPlainText()
        #input_main(f_name=w.res)
        if self.res:  # +++
            input_main(f_name=self.res)  # +++

# !!!
    def defbuttonencrypt(self):

#        self.sec = secret_dec

        if self.res:
#            decode_string(video=self.res)
            sec = decode_string(video=self.res)     # <--- в sec возвращаем результат
                                                    # работы функции decode_string().
            print(* sec, sep='\n')                  # Посмотрите что там и определитесь
                                                    # что вы хотите видеть в self.label
#            self.label.setText(slef.sec)           #                        vvvvvvvvvv
            self.label.setText(str(sec))            # <---------------------< vvvvvvvv

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    #    uw = Ui_MainWindow()                                      # ---                           # +++
    w.show()
    sys.exit(app.exec())
</code>


Как зациклить функцию и вернуть нужные значения?
Есть функция, нужно чтоб при определенном введеном аргументе просчитывалось значение и функции, затем просчитать значение функции с предыдущим аргументом и так до тех пор пока оно не станет равно 1 и после этого все значения добавить в массив.
<code>
def f(n):
    if n % 2 == 0:
        return n / 2
    else:
        return 3 * n + 1
</code>
Например при значении 13 будет последовательность:
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1

Вам нужно вызывать функцию пока число не станет меньше, либо равным единице.
Это можно легко реализовать через рекурсию.
<code>
def f(n, numbers_list=[]):
    # Проверяем меньше либо равно число единице
    # Если да, то возвращаем список, в который мы добавили числа
    if n <= 1:
        return numbers_list

    # Если число четное, то добавляем его в список - делим на два, и вызываем фун-цию
    elif n % 2 == 0:
        numbers_list.append(n)
        f(n / 2)

    # Если число не четное, добавляем его в список, и вызываем фун-цию
    else:
        numbers_list.append(n)
        f(3 * n + 1)

    # Возвращаем весь, список
    return numbers_list
</code>