Как связать выбор нескольких Checkbutton с выполнением основного кода?
Написал простой генератор паролей. Использую флажки Checkbutton для выбора конкретных символов используемых в генерировании пароля. Выбор нескольких наборов символов для пароля организовал через if.
Подскажите, можно ли упростить код и сделать выбор наборов не через if, ведь Checkbutton может быть не три, а гораздо больше. Буду рад любому совету. Спасибо.
<code>
import random
from tkinter import *
from tkinter import messagebox
from tkinter import ttk

def generator():
    if Letters.get() == 1:
        list_pas = 'ABCDEFGHIGKLMNOPQRSTUVYXWZ'
    if Numbers.get() == 1:
        list_pas = '0123456789'
    if Symbols.get() == 1:
        list_pas = '<>=-_!@#$%'
    if Letters.get() == 1 and Numbers.get() == 1:
        list_pas = 'ABCDEFGHIGKLMNOPQRSTUVYXWZ0123456789'
    if Letters.get() == 1 and Symbols.get() == 1:
        list_pas = 'ABCDEFGHIGKLMNOPQRSTUVYXWZ<>=-_!@#$%'
    if Numbers.get() == 1 and Symbols.get() == 1:
        list_pas = '0123456789<>=-_!@#$%'
    if Letters.get() == 1 and Numbers.get() == 1 and Symbols.get() == 1:
        list_pas = 'ABCDEFGHIGKLMNOPQRSTUVYXWZ0123456789<>=-_!@#$%'
    try:
        Entry_Long_Pass = Entry_Data.get()
        Entry_Long_Pass = int(Entry_Long_Pass)
        if Entry_Long_Pass < 0:
            messagebox.showwarning('ВНИМАНИЕ', 'ДЛИНА ПАРОЛЯ МЕНЬШЕ 0')
        else:
            pas = ''
            for i in range(Entry_Long_Pass):
                pas = pas + random.choice(list(list_pas))
            TextWorld.delete(1.0,END)
            TextWorld.insert(END, pas)
    except ValueError:
        messagebox.showerror('ВНИМАНИЕ', 'ПРОВЕРЬ ДЛИНУ ПАРОЛЯ')
    except:
        messagebox.showerror('ВНИМАНИЕ', 'ВЫБЕРИ СИМВОЛЫ ДЛЯ ПАРОЛЯ')

root = Tk()
root.title('ГЕНЕРАТОР ПАРОЛЕЙ')
Label(root, text='ДЛИНА ПАРОЛЯ:', font='Arial 11').grid(row=0, column=0)
Entry_Data = Entry(root, width=10, font='Arial 11')
Entry_Data.grid(row=0, column=1)

Letters = IntVar()
Letters_checkbutton = ttk.Checkbutton(text='A...Z', variable=Letters)
Letters_checkbutton.grid(row=0, column=2)

Numbers = IntVar()
Numbers_checkbutton = ttk.Checkbutton(text='0...9', variable=Numbers)
Numbers_checkbutton.grid(row=0, column=3)

Symbols = IntVar()
Symbols_checkbutton = ttk.Checkbutton(text='!...%', variable=Symbols)
Symbols_checkbutton.grid(row=0, column=4)

Button_pas = Button(root,text='ГЕНЕРАТОР',  font=('Arial', 10), bg='#d8e4bc', fg='black', width=10, height=1, command=generator).grid(row=0,   column=5)

TextWorld = Text(root, font='Arial 11', width=55, height=10, fg='white', bg='black')
TextWorld.grid(row=1, column=0, columnspan=6)

root.resizable(width=False, height=False)
root.mainloop()
</code>

Просто склеивайте нужный набор символов из частей, а не перебирайте все варианты сочетаний чекбоксов, тогда нужно будет всего 3 if-а. Также можно убрать сравнение с 1, т.к. 1 и так эквивалентно истине:
<code>
    list_pass = ""
    if Letters.get():
        list_pas += 'ABCDEFGHIGKLMNOPQRSTUVYXWZ'
    if Numbers.get():
        list_pas += '0123456789'
    if Symbols.get():
        list_pas += '<>=-_!@#$%'
</code>


Перестановка строк матрицы в соответствии с характеристикой
Дана целочисленная прямоугольная матрица. Определить кол-во столбцов, не содержащих ни одного нулевого элемента (оформить в виде функции). - сделано
Характеристикой строки целочисленной матрицы назовем сумму ее положительных четных элементов. Переставляя строки заданной матрицы, расположить их в соответствии с ростом характеристик (оформить в виде процедуры).Я создаю отдельный массив xar, в котором находятся характеристики каждой строки. Подскажите пожалуйста, каким образом закончить мой способ, для перестановки строк. Либо же прошу подсказать альтернативный способ решения данной задачи.
Мой код:
<code>
#lab5_var2
import numpy as np
sz = (4, 5)
ar = np.random.randint(-5, 10, size = sz)
print(ar)

def func(ar):
    l = 0
    for i in range(5):
        k = 0
        for j in range(4):
            if ar[j][i] != 0: k += 1
        if k == 4: l += 1
    return(l)
print("Кол-во столбцов, не содержащих ни одного нулевого элемента = ", func(ar))

def proc(ar):
    xar = []
    for i in range(sz[1]-1):
        xar.append(0)
    for i in range(sz[0]):
        for j in range(sz[1]):
            if ar[i,j] % 2 == 0 and ar[i,j] > 0:
                xar[i] += ar[i,j]
    print(xar)
proc(ar)
</code>

import numpy as np
sz = (4, 5)
ar = np.random.randint(-5, 10, size = sz)

Определить кол-во столбцов, не содержащих ни одного нулевого элемента

print(len(ar[np.where(ar.all(axis=1))]))

отдельный массив xar, в котором находятся характеристики каждой строки

temp = np.where((ar > 0) & ~(ar % 2), 1, 0) * ar
xar = temp.sum(axis=1)

Переставляя строки заданной матрицы, расположить их в соответствии с ростом характеристик

print(ar[xar.argsort()])


Как отправить случайные фото с подписью из списка кортежей
Пытаюсь сделать бота с рандомным выводом текста с картинкой, но уперся в проблему, не знаю как дальше
torot_list прописать функцию для вывода.

import telebot
from telebot import types # для указание типов
from datetime import datetime
import config
import random
import json

bot = telebot.TeleBot('')

@bot.message_handler(commands=['start'])
def start(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    btn = types.KeyboardButton("🧿")
    markup.add(btn)
    bot.send_message(message.chat.id, text="Привет, {0.first_name}!\nХочешь узнать своё будущее?\nЖми на всевидящее око 🧿\nНо будь осторожен,ведь чем меньше знаешь тем крепче спишь❗".format(message.from_user), reply_markup=markup)

@bot.message_handler(content_types=['text', 'photo'])
def func(message):
    if(message.text == "🧿"):
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton("🧿")
        markup.add(btn1)

        tarot_list = [
            ('img/image1.png', 'Текст 1'),
            ('img/image2.png', 'Текст 2'),
        ]

        bot.send_photo(message.chat.id, random.choice(tarot_list))

bot.polling(none_stop=True)

Попробуй так
<code>
from telebot.types import InputFile

tarot_list = [
    ('img/image1.png', 'Текст 1'),
    ('img/image2.png', 'Текст 2'),
]
rand_photo, rand_text = random.choice(tarot_list)

bot.send_photo(message.chat.id, photo=InputFile(rand_photo), caption=rand_text)
</code>


Помогите решить университетскую задачу [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Учебные задания допустимы в качестве вопросов только при условии, что вы пытались решить их самостоятельно перед тем, как задать вопрос. Пожалуйста, отредактируйте вопрос и укажите, что именно вызвало у вас трудности при решении задачи. Например, приведите код, который вы написали, пытаясь решить задачу

Закрыт 12 месяцев назад.

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

Дана матрица А размером nxm. Определить k — количество особых
элементов массива А, считая его элемент особым, если он больше суммы
остальных элементов его столбца.
<code>
m = [[2,4,6,8],
     [3,5,2,7],
     [9,4,1,8],
     [1,6,1,3]]
col = [[m[k][i] for k in range(len(m))] for i in range(len(m[0]))]
result = []
def f(a):
    for i in range(len(a)):
        acc = 0
        for k in range(len(a)):
            if k == i:
                continue
            else: acc += a[k]
        if a[i] > acc:
          result.append(a[i])
for i in col:
    f(i)
print(*result)
print('В матрице', len(result),'особых элементов')
</code>

Думаю, проще сделать так:
Внешний цикл по номеру столбца.
Внутренний цикл считает сумму столбца colsum (это можно также сделать через sum по соответствующему срезу).
Второй внутренний цикл проходит по столбцу, проверяя, что
<code>
if m[i][j]*2 > colsum:
    num_special += 1
</code>


Найти ближайшие k чисел в массиве со сложностью O(logn +k)
Мой код работает, по условию он должен пройти тест с огромными числами менее чем за 10 секунд и сложность должна быть O(logn + k) где k это количество цифр которые нужно возвращать. Подскажите как ускорить мой код, что убрать? Использовать bisect нельзя. Массив сортированный.
<code>
import math
def closest(array: list, value: int, count: int):
    masik = list(array)
    start, mid, end, tries = (0, len(masik) // 2, len(masik) - 1, 1)
    array2, final = [], []
    logarray = math.log(len(masik), 2) // 1
    while masik[mid] != value and start <= end:
        if value > masik[mid]:
            start = mid + 1
            tries += 1
        else:
            end = mid - 1
            tries += 1
        mid = (start + end) // 2
        for i in range(1, int(logarray)):
            if tries == logarray - i:
                if len(masik[start:end]) == count or (
                        count <= len(masik[start:end]) <= count ** 2):
                    for i in masik[start + 1:end + 1]:
                        array2.append(i)
        if len(array2) == 0:
            for i in array:
                array2.append(i)
    while len(final) <= count - 1:
        chislo = min(masik, key=lambda x: abs(x - value))
        final.append(chislo)
        masik.remove(chislo)
    final.sort()
    return final
</code>

Выполняем бинарный поиск, находя индекс места для вставки нужного значения.
O(logn)
Ищем ближайшие значения в массиве справа и слева подобно процедуре слияния из mergesort.
O(k)

def getkclosest(a, value, k):
    n = len(a)
    lo = 0
    hi = n
    while lo < hi:
        mid = (lo + hi) // 2
        if a[mid] < value:
            lo = mid + 1
        else:
            hi = mid

    res = []
    hi = lo
    lo -= 1
    cnt = 0

    while cnt < k and lo >= 0 and hi < n:
        if value - a[lo] <= a[hi] - value:
            res.append(a[lo])
            lo -= 1
        else:
            res.append(a[hi])
            hi += 1
        cnt += 1
    while cnt < k and lo >= 0:
        res.append(a[lo])
        lo -= 1
        cnt += 1
    while cnt < k and hi < n:
        res.append(a[hi])
        hi += 1
        cnt += 1
    return res


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

list = ['арбуз', 'паприка', 'дерево', 'хор', 'дверь', 'ор', 'приз', 'свет']

Мне известно что в слове 6 букв и знаю буквы 'е' и 'в'
По итогу программа должна мне выдать 'дерево'(исходя из этого списка слов)
То что у меня есть

list = ['арбуз', 'паприка', 'дерево', 'хор', 'дверь', 'ор', 'приз', 'свет']

#это список для примера, основной  список из более 5000 слов

word = input('Введите буквы которые  вам известны')
length = int(input('Введите длину слова'))

for line in list:
   if len(line) == lenght:
      print(line)

Через множества
<code>
lst = ['арбуз', 'паприка', 'дерево', 'хор', 'дверь', 'ор', 'приз', 'свет']
chars = set(input('Введите буквы, которые вам известны: ').lower())
length = int(input('Введите длину слова: '))

for word in lst:
    if len(word) == length and chars.issubset(word.lower()):
        print(word)
</code>


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

Для прикрепления к пользователю необходим некий идентификатор пользователя, который нужно создавать. Далее этот идентификатор и введённый текст можно записывать в базу данных.


whatsapp неверный номер телефона selenium
В общем делаю рассылку на whatsapp с помощью selenium на Python. Пользуюсь этим около 2-х месяцев, но сегодня утром начались странности. Отправляет несколько сообщений, а потом начинает писать, что не верный номер телефона. Хотя такого быть не может. Те номера, на которые уже отправлялось сегодня он открывает нормально, а на другие пишет о неверном номере. Если очистить кеш - то нормально, может открыть и отправить сообщение как и должно, но это ближайшие ~15 номеров, ну а дальше снова этот хоровод. Единственное что есть так это в консоли высвечивается: "3476:12008:1116/133241.458:ERROR:interface_endpoint_client.cc(690)] Message 3 rejected by interface blink.mojom.Widget"
Оно возникает перед тем, как начинается эта свистопляска с неверным номером, но что это я так и не понял, как и не понял имеет ли оно отношение к моей проблеме. Прошу просто дать понимание в какой стороне вообще проблема. Из моих догадок

вотс из-за большого кол-ва отправленных сообщений за сутки решил ограничить(но странно, что после удаления кеша дает находить номера)
происходит какой-то конфликт кеша(часто переходы с разных whatапов, а номера куда отправляется сообщения могут совпадать, ну и я делаю это но созданном профиле Гугла, чтобы постоянно не носить телефоны к монитору)
У вотса свои тех работы, и завтра все будет норм(надеюсь и верю в это)
Виноваты звезды

столкнулся с такими же проблемами несколько дней назад. писал в поддержку whatsapp, вот что ответили: We are sorry to hear there is an ongoing issue with WhatsApp. This issue has been escalated to the appropriate parties and we are working to get this fixed. Thank you for your patience.


Почему программа не правильно считает элементы массива?
Задача:
Дан одномерный массив (список), содержащий 20 элементов. Элементами массива являются случайные целые числа из
от -10 до 10. Напишите программу, которая вычисляет сумму первых 10 элементов и произведение последних 10 элементов, а также вычисляет количество положительных элементов.
Мой код:
<code>
from random import randint
arrayLen20 = [randint(-10, 10) for i in range(20)]
halfLeftSum = 0
halfRightSum = 0
halfRightMult = 1
positiveNumbersCount = 0
for i, v in enumerate(arrayLen20):
    halfCount = (len(arrayLen20) / 2)
    if (i < halfCount):
    halfLeftSum += v
    if (i > halfCount):
    halfRightSum += v
    halfRightMult *= v
    if v > 0:
        positiveNumbersCount += 1
print(f"Весь массив: {arrayLen20}")
print(f"Сумма первой половины: {halfLeftSum}")
print(f"Сумма второй половины: {halfRightSum}")
print(f"Умножение второй половины: {halfRightMult}")
print(f"Количество положительных числа: {positiveNumbersCount}")
</code>
Проблемы:

Сумму второй половины считает не правильно
Умножение второй половины считает не правильно

В общем Ваш вариант полностью. Без второй суммы, в задаче её нет
<code>
from random import randint
arrayLen20 = [randint(-10, 10) for i in range(20)]
halfLeftSum = 0
halfRightMult = 1
positiveNumbersCount = 0

arr_mul = []
arr_sum = []
for i, v in enumerate(arrayLen20):
    halfCount = (len(arrayLen20) // 2)
    if (i < halfCount):
        halfLeftSum += v
        arr_sum.append(v)
    else: #if (i >= halfCount):
        halfRightMult *= v
        arr_mul.append(v)
    if v > 0:
        positiveNumbersCount += 1

# Test mul array
res_mul = 1
for x in arr_mul:
    res_mul = res_mul * x

print(f"Весь массив: {arrayLen20}")
print(f"Сумма первой половины:     {arr_sum} {sum(arr_sum)} == {halfLeftSum}")
print(f"Умножение второй половины: {arr_mul} {res_mul} == {halfRightMult}")
print(f"Количество положительных числел: {positiveNumbersCount}")
</code>


Задача на обработку числовой последовательности на Python
Не понимаю, как решать такие задачи:

Напишите программу, которая в последовательности целых чисел определяет их сумму и подсчитывает количество положительных чётных чисел, не превосходящих 100.
Количество чисел не превышает 1000. Введённые числа по модулю не превышают 30 000.

Что с кодом не так?
<code>
count = 0
total = 0
while True:
    n = int(input())
    if n == 0:
        break
    else:

        total += n
while n > 0 and n%2 == 0 and n<=100:
    count+=n
print(total)
print(count)
</code>

<code>
sum = 0

Count = 0

while True:
    n = int(input())
    if n == 0:
        break
    sum += n
    if 0 < n <=100 and n%2==0:
        Count += 1

print(sum)

print(Count)
</code>
Может, кому пригодится.


Python как считать переход на новую строку?
Можно ли вообще считывать переход на новую строку? И если можно, то как?
Данные находятся в строке (большой кусок текста, где присутствует переход на новую строку), надо разделить большой кусок на много "однострочных"строк, либо в список.

Простой вариант:
<code>
text = '''
    Hello World !
    Hello World 1!
    Hello World 2 !
    Hello World 3  !
    Привет
    Привет 2
'''

newtext = text.splitlines()
print(newtext)
</code>


Аналог set() из python в rust
В python есть такой тип, как множество. Он выглядит так:
set().
По своей семантике напоминает список, однако, как могу судить, в нем хранятся только хеши добавленных объектов.
Это удобно, для проверки на вхождение данных в определенную группу.
В раст можно использовать
HashMap, но он, кажется, служит в первую очередь для того, чтобы связывать несколько объектов.
Стоит ли использовать
HashMap для таких задач, как проверка на вхождение строки в список заданных строк или есть более подходящие методы?

Используйте
HashSet:

use std::collections::HashSet;
let mut books = HashSet::new();

// Добавление элементов
books.insert("A Dance With Dragons".to_string());
books.insert("To Kill a Mockingbird".to_string());
books.insert("The Odyssey".to_string());
books.insert("The Great Gatsby".to_string());

// Проверка на вхождение
if !books.contains("The Winds of Winter") {
    println!("We have {} books, but The Winds of Winter ain't one.",
             books.len());
}

// Удалить объект
books.remove("The Odyssey");

// Итерируемся
for book in &books {
    println!("{book}");
}


Отсортируйте массив так, чтобы все нули в нем оказались в конце массива, сохранив при этом порядок чисел [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Учебные задания допустимы в качестве вопросов только при условии, что вы пытались решить их самостоятельно перед тем, как задать вопрос. Пожалуйста, отредактируйте вопрос и укажите, что именно вызвало у вас трудности при решении задачи. Например, приведите код, который вы написали, пытаясь решить задачу

Закрыт 12 месяцев назад.

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

На вход вашей программе поступает список целых чисел через пробел.
Отсортируйте массив так, чтобы все нули в нем оказались в конце массива, сохранив при этом порядок чисел.
Ввод:
Список целых чисел через пробел
Вывод:
Список чисел в котором нули находятся в конце.
Sample Input:

10 0 3 0 4 0 0 5 6 7 8

Sample Output:

10 3 4 5 6 7 8 0 0 0 0

Ничего дельного я сам не написал(

вариант 1:

подсчитать кол-во нулей в списке

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

добавить к списку список только с нулями

вариант 2 (в 1 строку):
выполнить сортировку где в
key указать функцию сравнения с
0


Вывести повторяющиеся значения списка (вопрос по конкретному методу решения)
Чуть больше месяца изучаю Python, по учебникам, youtube и онлайн-урокам. Мой вопрос по задаче, решение которой я видел (возможно, один и тот же курс). Но там она решена другими способами. В данном случае хотел бы узнать что не так с моим решением. По ощущениям, логика решения верна, но надо убрать одну ошибку.
Условие: напишите программу, которая принимает на вход список чисел в одной строке и выводит на экран в одну строку значения, которые встречаются в нём более одного раза. Выводимые числа не должны повторяться, порядок их вывода может быть произвольным. Например, если на входе дано: 4 8 0 3 4 2 0 3, на выходе должно быть: 0 3 4.
Мое решение:

a = [int(j) for j in input().split()]
a.sort()                               # сортировка
b = []                                 # новый пустой список

for i in range(len(a) - 1):

    if a[i] == a[i + 1] % len(a):      # если равны два соседних члена списка...
        b.append(a[i])                 # первый из них переносим в новый список.
        while a[i] == a[i + 1]:        # и удаляем одинаковые значения чтобы не было повтора
            a.pop(a[i])

    else:
        continue
print(*b, end=' ')

Итак, главная загвоздка - вывести повторяющиеся значения один раз. Т.е. после переноса a[i] в новый список другие равные ему числа удаляются до тех пор, пока к сравнению не будет подано новое число. Часть кода
a[i + 1] % len(a) оформил таким образом, чтобы остановить цикл на предпоследнем члене списка (нашел способ в разборе чужого решения). Для этого же выше применял
range(len(a) - 1). Тем не менее, для строки с while регулярно выводится ошибка 'IndexError: list index out of range'.
Знаю, что можно решить ее в две строчки, может даже в одну. Но сейчас мне важнее на примере этого решения найти изъян в собственной логике.

 a[i + 1] % len(a)

не имеет смысла. Вы понимаете, что там могло делаться?  Вот что:

a[(i + 1) % len(a)]

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

while a[i] == a[i + 1]:
        a.pop(a[i])

А

else:
    continue

просто не нужно.
Давайте сделаем так - будем проверять левый и правый элементы, таким образом из длинной серии условие сработает только на последней паре. И предусмотрим аккуратную проверку для последнего элемента. И удалять ничего не надо. (Можно превратить в однострочник, но незачем)

for i in range(1, len(a)):
    if a[i] == a[i - 1] and (i + 1 == len(a) or a[i] != a[i + 1]):
        print(a[i], end=' ')

Добавлю линейный алгоритм

from collections import Counter

c = Counter([4, 8, 0, 3, 4, 2, 0, 3])
for k in c:
    if c[k]>1:
        print(k)

или однострочником

print(" ".join(str(k) for k, v in Counter([4, 8, 0, 3, 4, 2, 0, 3]).items() if v > 1))


Метод Text.replace() ошибка TypeError: Text.replace() missing 1 required positional argument: 'chars'

from tkinter import *
def find(event=False):
    txt_edit.tag_remove("found", "1.0", END)
    s = findEntry.get()
    if (s):
        idx = "1.0"
        while 1:
            idx = txt_edit.search(s, idx, nocase = 1, stopindex = END)
            if not idx: break
            lastidx = "% s+% dc" % (idx, len(s))
            txt_edit.tag_add("found", idx, lastidx)
            idx = lastidx
        txt_edit.tag_config("found", foreground="red", background="blue")
    findEntry.focus_set()

def replace(event=False):
    txt_edit.replace(index1=str(findEntry.get()), index2=str(replaceEntry.get()))
def closefr(event=False):
    findaNdreplace.destroy()
def findandreplace(event=False):
    global findaNdreplace, findEntry, findButton, replaceEntry, replaceButton, txt_edit
    findaNdreplace = Tk()
    findaNdreplace["bg"]="LightGrey"
    txt_edit = Text()
    txt_edit.pack()
    findEntry = Entry(findaNdreplace)
    findEntry.pack(fill=X)
    findButton = Button(findaNdreplace, text="Найти", command=find, background="LightGrey")
    findButton.pack(fill=X)
    replaceEntry = Entry(findaNdreplace)
    replaceEntry.pack(fill=X)
    replaceButton = Button(findaNdreplace, text="Заменить", command=replace, background="LightGrey")
    replaceButton.pack(fill=X)
    findEntry.bind("<Key>", find)
    findaNdreplace.protocol("WM_DELETE_WINDOW", closefr)
    findaNdreplace.mainloop()
findandreplace()

После чего получаю:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\miros\AppData\Local\Programs\Python\Python310-32\lib\tkinter\__init__.py", line 1921, in __call__
    return self.func(*args)
  File "D:\Z\VarTexter2\VarTexter_v.2.0.py", line 1034, in replace
    txt_edit.replace(index1=str(findEntry.get()), index2=str(replaceEntry.get()))
TypeError: Text.replace() missing 1 required positional argument: 'chars'

Что вписать в 3-ий аргумент?

Метод
replace у виджета
Text заменяет текст между указанными индексами на другой текст и добавляет теги переданные в дополнительных параметрах. См. докстроку метода replace:

def replace(self, index1, index2, chars, *args): # new in Tk 8.5
    """Replaces the range of characters between index1 and index2 with
    the given characters and tags specified by args.

    See the method insert for some more information about args, and the
    method delete for information about the indices."""
    self.tk.call(self._w, 'replace', index1, index2, chars, *args)

Т.е. например
text.replace("1.0", "1.2", "asdf") заменит первые два символа в первой строке текстового поля на
asdf.
Чтобы заменить какой-то текст на другой текст, нужно вытащить текст полностью (
text.get(1.0, END)), методом
replace строки заменить текст, потом перезаписать текст обратно в текстовое поле (тем же методом
replace виджета
Text с указанием индексов начала и конца текста):

all_text = txt_edit.get("1.0", END)
all_text = all_text.replace(findEntry.get(), replaceEntry.get())
txt_edit.replace("1.0", END, all_text)


Как перебрать все комбинации из списка списков?
Есть некий список:
<code>
[
 [1, 2],
 [4, 5, 6],
 [7]
]
</code>
Все списки могут иметь любую длину
Как получить всевозможные комбинации? Например:

1, 4, 7;
1, 5, 7;
2, 5, 7;
2, 6, 7;

Ваш вопрос заключается в Декартовом произведении. В Python за это отвечает itertools.product.
На него уже отвечали. Цитирую ответ Kenan Banks:

import itertools

nested_lists = [
    [1, 2],
    [4, 5, 6],
    [7]
]

for part in itertools.product(*nested_lists):
    print(part)

Что равносильно

for part in itertools.product([1, 2], [4, 5, 6], [7]):
    print(part)


Как вывести элементы из списка несколько раз в Python?
Всем привет. Есть список:

['1_собака', '2_кошка', '3_попугай', '4_медведь']

Я хочу вывести в print что-то вроде:

'собака', 'кошка', 'попугай', 'медведь', 'собака', 'кошка', 'попугай', 'медведь', 'собака', 'кошка'

Делаю так:

listtest = ['1_собака', '2_кошка', '3_попугай', '4_медведь']

lgo = [listtest[i] for i in range(50)]

print(lgo)

И мне выдается ошибка: IndexError: list index out of range, что логично. Ведь количество элементов в списке доходит только до 3. Вопрос - как сделать, чтобы элементы начинали перебираться заново, если выходят за рамки нумерации?

Способ 1:

lgo = []
for i in range (50):
    idx = 0
    lgo.append(listtest[idx])
    idx += 1
    if idx == len(listtest):
        idx = 0

Способ 2:

lgo = [listtest[i % len(listtest)] for i in range(50)]

Способ 3:

m = 50 // len(listtest) + 1
lgo = listtest * m
lgo = lgo[:50]


Завершение потоков QThread и инициализация диалогового окна после этого
Прошу помощи в реализации функции завершения потоков и инициализации диалогового окна после этого.
После того как отработает цикл до команды
"STOP"

class Thread(QThread):
    def run(self):
        for i in date_command:
            if "SYSCFGEX" in i:
                i = i.strip('"')
                self.msleep(1000 * 2)  # 2 сек.
            Thread.message_handler(self, id_dev, msg=i)

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

class MainWindow(QMainWindow, Ui_MainWindow):
    def run_th(self):
            self.thread_1.start()
            self.thread_2.start()

Пробовал делать вот такую конструкцию:

            if "STOP" in msg:
                self.updateSignal.emit(
                    id_dev, "STOP", self.name_thread)   # <--- После этого сигнала должен завершаться поток
                # name_th = self.name_thread
                main_window.textEdit_plate_1.append("Сканирование завершено")
                MainWindow.stop_th(self, msg="STOP", name_thread=self.name_thread)

в функцию
stop_th я попадаю, пробовал завершать через
self.thread_1.finished, через
self.thread_1.quit(), не выходит ничего.
Получаю ошибки:

AttributeError: 'Thread' object has no attribute 'thread_1'. Did you mean: 'thread'?
AttributeError: 'Thread' object has no attribute 'thread_2'. Did you mean: 'thread'?

Объясню для чего мне это надо:
Это надо для того, чтобы иницализировать диалоговое окно, в котором пользователь будет проводить манипуляции, и для того, чтобы откатить кнопку в изначальное состояние (START), так как приложение должно работать без перезагрузки, т.е. отработал поток по клику кнопки, еще раз можно кликнуть, чтобы он работал, и так необходимое количество раз.
Файл
main.py, а также
dialog_adress.py прилагаю

main.py

import sys
import serial
import serial.tools.list_ports
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.Qt import *

from reo_main_window import Ui_MainWindow
from dialog_adress import Ui_form_dialog_adress

from scanclass import ScanningReo

class Thread(QThread):
    updateSignal = QtCore.pyqtSignal(object, str, str)

    def __init__(self, plate, name_thread):
        super().__init__()
        self.number_port = plate
        self.name_thread = name_thread
        print(f'number_port = {self.number_port}; {self.name_thread}')

    def run(self):
        scan = ScanningReo(
            "serial_port", "date_from_cmd",
            "date_command", "name_freq", "name_dev")
        opn_srl_prt = scan.open_serial_port(self.number_port)
        opn_srl_prt.close()
        opn_srl_prt = scan.open_serial_port(self.number_port)
        id_dev = scan.device_identification(opn_srl_prt)

        print(id_dev)
        if "120" in id_dev:
            self.updateSignal.emit(id_dev, '120', self.name_thread)
            date_command = [f'"AT^SYSCFGEX="03",1\r"',
                            f'"AT^SYSCFGEX="01",2\r"', "AT^NETSCAN=0\r",
                            f'"AT^SYSCFGEX="01",3\r"', "AT^NETSCAN=0\r",
                            f'"AT^SYSCFGEX="02",4\r"', "AT^NETSCAN=1\r",
                            f'"AT^SYSCFGEX="03",5\r"', "AT^NETSCAN=3\r",
                            "STOP"
                            ]
        elif "821" in id_dev:
            if "821" in id_dev:
            self.updateSignal.emit(id_dev, '821', self.name_thread)
            date_command = [f'"AT^SYSCFGEX="03",1\r"',
                            f'"AT^SYSCFGEX="01",2\r"', "AT^NETSCAN=0\r",
                            f'"AT^SYSCFGEX="01",3\r"', "AT^NETSCAN=0\r",
                            f'"AT^SYSCFGEX="02",4\r"', "AT^NETSCAN=1\r",
                            f'"AT^SYSCFGEX="03",5\r"', "AT^NETSCAN=3\r",
                            "STOP"
                            ]

        for i in date_command:
            Thread.message_handler(self, id_dev, msg=i)
            if "SYSCFGEX" in i:
                i = i.strip('"')
                self.msleep(1000 * 2)  # 2 сек.
            while scan.send_comm(opn_srl_prt, i) == "STOP":
                self.msleep(1000 * 2)  # 2 сек.

    def message_handler(self, id_dev, msg):
        """ Функция "message_handler" обрабатывает поступающие сообщения
            и выводит их в ui.textEdit
        """
        if "120" in id_dev:
            if "NETSCAN" in msg:
                if "AT^NETSCAN=200" in msg:
                    self.updateSignal.emit(
                        id_dev, "AT^NETSCAN=200", self.name_thread)
                    main_window.textEdit_plate_2.append("Начинаю сканирование 2!")
                if "AT^NETSCAN=20,-110,1" in msg:
                    self.updateSignal.emit(
                        id_dev, "AT^NETSCAN=201", self.name_thread)
                    main_window.textEdit_plate_2.append("Начинаю сканирование 3!")
                if "AT^NETSCAN=20,-110,3" in msg:
                    self.updateSignal.emit(
                        id_dev, "AT^NETSCAN=203", self.name_thread)
                    main_window.textEdit_plate_2.append("Начинаю сканирование 4!")
            if "STOP" in msg:
                self.updateSignal.emit(
                    id_dev, "STOP", self.name_thread)   # <--- После этого сигнала должен завершаться поток
                # name_th = self.name_thread
                main_window.textEdit_plate_2.append("Сканирование завершено")
                MainWindow.stop_th(self, msg="STOP", name_thread=self.name_thread)  #!!!!!

        if "821" in id_dev:
            if "NETSCAN" in msg:
                if "AT^NETSCAN=200" in msg:
                    self.updateSignal.emit(
                        id_dev, "AT^NETSCAN=200", self.name_thread)
                    main_window.textEdit_plate_1.append("Начинаю сканирование 2!")
                if "AT^NETSCAN=201" in msg:
                    self.updateSignal.emit(
                        id_dev, "AT^NETSCAN=201", self.name_thread)
                    main_window.textEdit_plate_1.append("Начинаю сканирование 3!")
                if "AT^NETSCAN=203" in msg:
                    self.updateSignal.emit(
                        id_dev, "AT^NETSCAN=203", self.name_thread)
                    main_window.textEdit_plate_1.append("Начинаю сканирование 4!")
            if "STOP" in msg:
                self.updateSignal.emit(
                    id_dev, "STOP", self.name_thread)   # <--- После этого сигнала должен завершаться поток
                # name_th = self.name_thread
                main_window.textEdit_plate_1.append("Сканирование завершено")
                MainWindow.stop_th(self, msg="STOP", name_thread=self.name_thread)

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.thread_1 = None
        self.thread_2 = None

        self.pushButton_start.clicked.connect(self.run_th)

    def run_th(self):
        """ Функция "run_th" запускает потоки с экземплярами класса """

        device_port = self.scan_ttyusb()
        plate1 = device_port[0]
        plate2 = device_port[1]
        icon = QtGui.QIcon()

        if self.thread_1 is None and self.thread_2 is None:
            self.thread_1 = Thread(plate1, 'Plate 1')
            self.thread_1.updateSignal.connect(self.update_thread)
            self.thread_1.start()

            self.thread_2 = Thread(plate2, 'Plate 2')
            self.thread_2.updateSignal.connect(self.update_thread)
            self.thread_2.start()

            self.pushButton_start.setText("Stop")
            icon.addPixmap(QtGui.QPixmap(":/icons_main/cancel-64.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.pushButton_start.setIcon(icon)
            self.pushButton_start.setStyleSheet("QPushButton {\n"
                                               "    background-color: rgb(255, 255, 255);\n"
                                               "}")

        else:
            reply = QMessageBox.question(
                self,
                'ВНИМАНИЕ !',
                "Вы уверены, что хотите прервать выполнение программы?",
                QMessageBox.Yes, QMessageBox.No
            )
            if reply == QMessageBox.Yes:
                self.thread_1.terminate()
                self.thread_1 = None
                self.thread_2.terminate()
                self.thread_2 = None

                self.pushButton_start.setText("Start")
                icon.addPixmap(QtGui.QPixmap(":/icons_main/go-64.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
                self.pushButton_start.setIcon(icon)
                self.pushButton_start.setStyleSheet("QPushButton {\n"
                                                    "    color: rgb(255, 255, 255);\n"
                                                    "    background-color: rgb(17, 154, 40);\n"
                                                    "}")
-----------------------------------------------------------------
    def stop_th(self, msg, name_thread):
        if name_thread == 'Plate 1' and msg == 'STOP':
            self.thread_1.finished
        if name_thread == 'Plate 2' and msg == 'STOP':
            self.thread_1.finished

        if self.thread_1.quit() and self.thread_2.quit():
            self.pushButton_start.setText("Start")
            QtGui.QIcon().addPixmap(QtGui.QPixmap(":/icons_main/go-64.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.pushButton_start.setIcon(QtGui.QIcon())
            self.pushButton_start.setStyleSheet("QPushButton {\n"
                                                "    color: rgb(255, 255, 255);\n"
                                                "    background-color: rgb(17, 154, 40);\n"
                                                "}")
-----------------------------------------------------------------
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Эта часть кода не работает, так как потоки не прекращают свою работу.

    def update_thread(self, id_dev, plate, name_thread):
        if name_thread == 'Plate 1':
            if '821' in plate:
                self.label_plate_1.setText(f"{id_dev}")
            else:
                self.label_plate_1.setText(f"{id_dev}")
        if name_thread == 'Plate 2':
            if '120' in plate:
                self.label_plate_2.setText(f"{id_dev}")
            else:
                self.label_plate_2.setText(f"{id_dev}")

    def scan_ttyusb(self):
        """ Функция "scan_ttyusb" сканирует порты и возвращает номера портов
            к которым подключены нужные устройства
        """

        ports = list(serial.tools.list_ports.comports())
        result = ""
        for text in ports:
            if 'Pcui' in text[1]:
                txt = text[0]
                result = result + txt + ','
                device_port = result

        return device_port.split(",")

    def closeEvent(self, event):
        reply = QMessageBox.question(
            self,
            'Информация',
            "Вы уверены, что хотите закрыть приложение?",
            QMessageBox.Yes, QMessageBox.No
        )
        if reply == QMessageBox.Yes:
            if self.thread_1:
                self.thread_1.quit()
            del self.thread_1
            if self.thread_2:
                self.thread_2.quit()
            del self.thread_2

            super(MainWindow, self).closeEvent(event)
        else:
            event.ignore()

class DialogWindow(QDialog, Ui_form_dialog_adress):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.pushButton_save.clicked.connect(self.save_log)
        self.pushButton_cancel.clicked.connect(self.cancel_save)

    def create_window(self):    # Должно срабатывать после команды "СТОП" для обоих потоков!!!!!!!
        dialog_window.setFixedSize(440, 161)
        dialog_window.show()

    def save_log(self):
        pass

    def cancel_save(self):
        pass

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    main_window = MainWindow()
    main_window.setFixedSize(680, 572)
    main_window.show()

    dialog_window = DialogWindow()

    sys.exit(app.exec_())

dialog_adress.py

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_form_dialog_adress(object):
    def setupUi(self, form_dialog_adress):
        form_dialog_adress.setObjectName("form_dialog_adress")
        form_dialog_adress.resize(440, 161)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/icons_main/electrical_sensor_main-100.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        form_dialog_adress.setWindowIcon(icon)
        form_dialog_adress.setLayoutDirection(QtCore.Qt.RightToLeft)
        form_dialog_adress.setStyleSheet("QWidget{\n"
"    background-color: white;\n"
"}")
        self.pushButton_save = QtWidgets.QPushButton(form_dialog_adress)
        self.pushButton_save.setGeometry(QtCore.QRect(60, 100, 120, 41))
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap(":/icons_main/save-64.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.pushButton_save.setIcon(icon1)
        self.pushButton_save.setIconSize(QtCore.QSize(40, 40))
        self.pushButton_save.setObjectName("pushButton_save")
        self.pushButton_cancel = QtWidgets.QPushButton(form_dialog_adress)
        self.pushButton_cancel.setGeometry(QtCore.QRect(260, 100, 120, 41))
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap(":/icons_main/cancel-64.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.pushButton_cancel.setIcon(icon2)
        self.pushButton_cancel.setIconSize(QtCore.QSize(40, 40))
        self.pushButton_cancel.setObjectName("pushButton_cancel")
        self.label_adress = QtWidgets.QLabel(form_dialog_adress)
        self.label_adress.setGeometry(QtCore.QRect(10, 10, 420, 30))
        self.label_adress.setBaseSize(QtCore.QSize(0, 30))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.label_adress.setFont(font)
        self.label_adress.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.label_adress.setAlignment(QtCore.Qt.AlignCenter)
        self.label_adress.setObjectName("label_adress")
        self.lineEdit_adress = QtWidgets.QLineEdit(form_dialog_adress)
        self.lineEdit_adress.setGeometry(QtCore.QRect(10, 50, 420, 30))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.lineEdit_adress.setFont(font)
        self.lineEdit_adress.setText("")
        self.lineEdit_adress.setObjectName("lineEdit_adress")

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

    def retranslateUi(self, form_dialog_adress):
        _translate = QtCore.QCoreApplication.translate
        form_dialog_adress.setWindowTitle(_translate("form_dialog_adress", "Aдрес местонахождения"))
        self.pushButton_save.setText(_translate("form_dialog_adress", "Сохранить"))
        self.pushButton_cancel.setText(_translate("form_dialog_adress", "Отмена"))
        self.label_adress.setText(_translate("form_dialog_adress", "Введите адрес местонахождения:"))

Нельзя взаимодействовать с виджетами в дополнительном потоке.
Это не потокобезопасно. Надо использовать сигналы и слоты.
Вам срочно надо изучить Signals & Slots и Support for Signals and Slots

Такие записи как:

        main_window.textEdit_plate_2.append("Начинаю сканирование 2!")

в дополнительном потоке делать нельзя.

Мы же с вами это уже проходили:

в дополнительном потоке
class Thread(QThread):

создаем сигнал:

    updateSignal = QtCore.pyqtSignal(object, str, str)

испускаем сигнал:

    self.updateSignal.emit(id_dev, "AT^NETSCAN=203", self.name_thread)

Сигналы испускаются при использовании метода
emit(*args) связанного сигнала.

args - необязательная последовательность аргументов для передачи в любые связанные слоты.

в основном потоке:

делаем привязку сигналов и слотов

    self.thread_1.updateSignal.connect(self.update_thread)

пишем слот, в который принимаем данные из дополнительного потока:

    def update_thread(self, id_dev, plate, name_thread):
        ...

        # и делаем то что нам надо, например, обновляем label
        self.label_plate_1.setText(f"{id_dev}")

        # или добавляем в textEdit
        self.textEdit_plate_1.append("Начинаю сканирование 2!")

пока вы это не освоите - двигаться дальше нельзя.

По вашему текущему вопросу все то же самое:

в дополнительном потоке
class Thread(QThread):

создаем сигнал:

    class Thread(QThread):
        updateSignal = QtCore.pyqtSignal(object, str, str)
        finished = QtCore.pyqtSignal(str)                     # <----
        ...

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

    if "STOP" in msg:
        self.finished.emit(self.name_thread)                # <----

в основном потоке:

иницализировать диалоговое окно:

    class MainWindow(QMainWindow, Ui_MainWindow):
        def __init__(self):
            super().__init__()
            self.setupUi(self)
            self.thread_1 = None
            self.thread_2 = None
            self.pushButton_start.clicked.connect(self.run_th)

            # +++ иницализировать диалоговое окно
            self.dialogWindow = DialogWindow()              # <----

делаем привязку сигналов и слотов:

    self.thread_1 = Thread('plate1', 'Plate 1')
    self.thread_1.updateSignal.connect(self.update_thread)
    self.thread_1.finished.connect(self.finished_thread)       # <----

пишем слот, в который принимаем данные из дополнительного потока и
делаем то что надо:

    def finished_thread(self, name_thread):
        print(f'name_thread = {name_thread}')
        if name_thread == 'Plate 1':
            self.thread_1.terminate()
            self.thread_1 = None
        elif name_thread == 'Plate 2':
            self.thread_2.terminate()
            self.thread_2 = None

        if self.thread_1 is None and self.thread_2 is None:
            print('## оба потока закрыты')

            # востанавливайте кнопки START
            self.pushButton_start.setText("Start Thread`s")

            # показывайте диалоговое окно
            self.dialogWindow.create_window()

            # и делайте другие нужные вещи для вас

и наконец :

      if __name__ == '__main__':
          app = QtWidgets.QApplication(sys.argv)
          main_window = MainWindow()
          main_window.setFixedSize(680, 572)
          main_window.show()

      #    dialog_window = DialogWindow()                   # убираем

          sys.exit(app.exec_())


Кроссплатформенность Python
Можно ли назвать Python кроссплатформенным? Всегда ли так? Кроссплатформенность и переносимость программ это одно и то же?

Назвать можно, но не совсем. Отдельный файл будет кроссплатформеным, но интерпретаторы на разных платформах разные.
Кроссплатформенность и переносимость программ это одно и то же? - зависит от автора учебника.


Проверка 1 списка на сходство по шаблону 2 списка и вывод результата
Я хочу сравнить два списка: command и words. В command хранятся шаблоны слов, а в words - то, что введет сам пользователь. вот пример:

command = ['бег', 'прыжок', 'полет']
words = ['я', 'бегал', 'вчера']

мне нужно, чтобы программа написала, в данном случае, совпадение найдено, потому что бегал почти совпадает со словом бег из списка command. Сейчас я считаю, что это можно реализовать алгоритмом Вагнера — Фишера (чтобы каждой букве присваивался 1-сходство или 0-не сходство)
также может быть несколько слов или отпечатка (в слове есть лишняя буква, но так, чтобы смысл самого слова был понятен)
вот пример:

command = ['бег', 'прыжок', 'полет']
words = ['я', 'бегал', 'и', 'прыгал', 'вчера']

тут тоже программа видит, что некоторые слова из списка words практически совпадают со списком command, а значит программа напишет совпадение найдено

Ну вот вам "из коробки" практически ваш процент:

# pip install thefuzz[speedup]

from thefuzz import fuzz

command = ['бег', 'прыжок', 'полет']
words = ['бегать', 'прыгать', 'летать']
print(f'{fuzz.token_sort_ratio(command, words)}%')

Вывод:

59%

Но в любом случае, если вы не понимаете, что хотите считать, то это "сферические проценты в вакууме". Вот, например, другой процент с теми же данными:

print(f'{fuzz.ratio(command, words)}%')

Вывод:

74%

Если нужно просто сравнить соответствующие слова из двух списков, то так:

command = ['бег', 'прыжок', 'полет']
words = ['бегать', 'прыгать', 'летать']
for a, b in zip(command, words):
  print(f'{fuzz.ratio(a, b)}%')

Вывод:

67%
46%
55%


Как исправить TypeError
Ругается на вот эту функцию

def check_balance(self, user_id):
      self.c.execute("SELECT balance FROM users WHERE user_id=?", (user_id,)).fetchone()[0]

С вот такой ошибкой

    base_events.py [LINE:1738] #ERROR    [2022-11-15 11:52:58,347]  Task exception was never retrieved
future: <Task finished name='Task-10' coro=<Dispatcher._process_polling_updates() done, defined at /data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.9/site-packages/aiogram/dispatcher/dispatcher.py:407> exception=TypeError("'NoneType' object is not subscriptable")>
Traceback (most recent call last):
  File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.9/site-packages/aiogram/dispatcher/dispatcher.py", line 415, in _process_polling_updates
    for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
  File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.9/site-packages/aiogram/dispatcher/dispatcher.py", line 235, in process_updates
    return await asyncio.gather(*tasks)
  File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.9/site-packages/aiogram/dispatcher/handler.py", line 117, in notify
    response = await handler_obj.handler(*args, **partial_data)
  File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.9/site-packages/aiogram/dispatcher/dispatcher.py", line 256, in process_update
    return await self.message_handlers.notify(update.message)
  File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.9/site-packages/aiogram/dispatcher/handler.py", line 117, in notify
    response = await handler_obj.handler(*args, **partial_data)
  File "<string>", line 30, in process_start_command
  File "/storage/emulated/0/ReferralBot/db.py", line 28, in check_balance
    self.c.execute("SELECT balance FROM users WHERE user_id=?", (user_id,)).fetchone()[0]
TypeError: 'NoneType' object is not subscriptable

Кто может помочь, пожалуйста?

Метод fetchone скорее всего вернул None, поэтому обращение по индексу в данном случае невозможно


Как сделать выполнение команды раз в сутки. discord.py
Пытаюсь реализовать обновление статистики по решению задач на сервере раз в неделю, но loop не реагирует либо дает ошибку.

import asyncio
import discord
from discord.ext import commands, tasks

import config
import controls
import logging
logger = logging.getLogger('discord')
logger.setLevel(logging.INFO)
handler = logging.FileHandler(filename='discord.log', encoding='utf-8', mode='w')

intents = discord.Intents.default()
bot = commands.Bot(command_prefix='/', intents=intents)

@bot.event
async def on_ready():
    await bot.tree.sync()
    print('We have logged in as {0.user}'.format(bot))

@tasks.loop(seconds=10)
async def test1():
    chanel = bot.get_channel(config.CHANNEL_NEWS_ID)
    await chanel.send('Тест')

@test1.before_loop
async def test2():
    await bot.wait_until_ready()

test1.start()
bot.run(config.TOKEN, log_handler=handler)

Получаю ошибку

Traceback (most recent call last):
  File "C:\Users\vavil\PycharmProjects\Work\Разное\discord_bot_2\main.py", line 439, in <module>
    test1.start()
  File "C:\Users\vavil\PycharmProjects\Work\virtialpy\lib\site-packages\discord\ext\tasks\__init__.py", line 398, in start
    self._task = asyncio.create_task(self._loop(*args, **kwargs))
  File "C:\Users\vavil\AppData\Local\Programs\Python\Python39\lib\asyncio\tasks.py", line 360, in create_task
    loop = events.get_running_loop()
RuntimeError: no running event loop
sys:1: RuntimeWarning: coroutine 'Loop._loop' was never awaited

Ошибка возникает потому что вы пытаетесь вызвать асинхронную функцию
test1.start() вне цикла событий. Если вы хотите, чтобы каждые 10 секунд вызывалась функция
test1, запустите её во время запуска бота:

@bot.event
async def on_ready():
    await bot.tree.sync()
    print('We have logged in as {0.user}'.format(bot))
    test1.start()


Проверять дерево ключей в словаре
Есть словарь

dict1 =   {
        "value": {
            "test": {
                "name":{
                    "age":"30"
                }
            }
        }
    }

Нужно забирать элемент словаря, при этом какого то ключа может не быть, в этом случае заменять на дефолтное.
Все это нужно делать в одну строку!

dict1 =   {
            "value": {
                "test": None
            }
        }

Сделал такой вариант, но не првильно, есть еще варианты?

dict1.get("value").get("test").get("name").get("age") or "null"

Вариант1:

s = dict1.get("value",{}).get("test",{}).get("name",{}).get("age",{})
print(s)

Вариант с изголениями:)

getv = lambda d, val:  d.get(val,{})
s = getv(getv(getv(getv(dict1,"value"), "test"), "name"),"age")
print(s)


Разделить предложение на слова не используя метод split
я не понимаю почему мой код выводит только первые два слова
<code>
a = "Разделиsdf меняdfss болгаркой "
b=0
c=0
a1 = 0
for j in a:
    b+=1
    if j ==' ':
        a1+=1
        print(a1)
        print(a[c:b])
        c+=b
</code>

вариант 1 (через регулярки):

text = "Разделиsdf меняdfss болгаркой "

import re
res = re.findall(r"\w+", text)

вариант 2 (в лоб):

res, tmp = [], ""
for l in text:
    if l in " \t":
        if tmp:
            res.append(tmp)
            tmp = ""
    else:
        tmp += l
if tmp:
    res.append(tmp)

вариант 2.1 (без временной переменной):

res = [""]
for l in text:
    if l in " \t":
        if res[-1]: res.append("")
    else:
        res[-1] += l
if not res[-1]: res.pop()


Для чего в Магическом квадрате Ло Шу проверка на уникальность значений списка
Код из книги. Программа имитирует магический квадрат Ло Шу. Все понятно кроме условия проверяемого функцией check_unique. Что значит значения в списке уникальные? В чем вообще смысл данной функции?
<code>
# Глобальные константы
ROWS = 3    # Количество строк
COLS = 3    # Количество столбцов
MIN = 1     # Значение наименьшего числа
MAX = 9     # Значение наибольшего числа

def main():
    # Создать двумерный список.
    test_list = [ [4, 9, 2],
                  [3, 5, 7],
                  [8, 1, 6] ]

    # Показать список в строковом и постолбцовом формате.
    display_square_list(test_list)

    # Определить, является ли список магическим квадратом Ло Шу.
    if is_magic_square(test_list):
        print('Это магический квадрат Ло Шу.')
    else:
        print('Это не магический квадрат Ло Шу.')

# Функция display_square_list принимает двумерный список
# в качестве аргумента и показывает значения списка в строковом
# и постолбцовом формате.
def display_square_list(value_list):
    for r in range(ROWS):
        for c in range(COLS):
            print(value_list[r][c], end=' ')
        print()

# Функция is_magic_square принимает двумерный список
# в качестве аргумента и возвращает True, если список удовлетворяет
# всем требованиям, предъявляемым к магическому квадрату.
# В противном случае она возвращает False.
def is_magic_square(value_list):
    # Исходно назначить состоянию значение False.
    status = False

    # Вызвать функции и сохранить возвращаемые из них значения.
    is_in_range = check_range(value_list)      # в диапазоне
    is_unique = check_unique(value_list)       # уникальные
    is_equal_rows = check_row_sum(value_list)  # равные строки
    is_equal_cols = check_col_sum(value_list)  # равные столбцы
    is_equal_diag = check_diag_sum(value_list) # равные диагонали

    # Определить, удовлетворяет ли список всем требованиям.
    if is_in_range and \
       is_unique and \
       is_equal_rows and \
       is_equal_cols and \
       is_equal_diag:

        # Если да, то назначить переменной status значение True.
        status = True

    # Вернуть status.
    return status

# Функция check_range принимает двумерный список
# в качестве аргумента и возвращает True, если значения
# в списке лежат в пределах указанного диапазона.
# В противном случае она возвращает False.
def check_range(value_list):
    # Исходно назначить состоянию значение True.
    status = True

    # Перебрать все значения в списке.
    for r in range(ROWS):
        for c in range(COLS):
            # Определить, есть ли какие-либо значения,
            # которые лежат за пределами диапазона.
            if value_list[r][c] < MIN or \
               value_list[r][c] > MAX:
                # Если да, назначить status значение False.
                status = False

    # Вернуть status.
    return status

# Функция check_unique принимает двумерный список
# в качестве аргумента и возвращает True, если значения
# в списке уникальные.
# В противном случае она возвращает False.
def check_unique(value_list):
    # Исходно назначить состоянию значение True.
    status = True
    # Инициализировать переменную искомым значением.
    search_value = MIN
    # Инициализировать счетчик нулем.
    count = 0

    # Выполнять поиск до тех пор, пока не будет достигнуто
    # минимальное значение и при этом значение являются
    # уникальными.
    while search_value <= MAX and status == True:
        # Перебрать все значения в списке.
        for r in range(ROWS):
            for c in range(COLS):
                # Определить, равняется ли текущее
                # значение искомому значению.
                if value_list[r][c] == search_value:
                    # Если да, нарастить счетчик.
                    count += 1
                # Определить, является ли счетчик
                # больше единицы.
                if count > 1:
                    # Если да, то значение не уникальное.
                    # Присвоить переменной status значение False.
                    status = False
        # Нарастить значение переменной search_value.
        search_value += 1
        # Обнулить переменную count.
        count = 0

    # Вернуть status.
    return status

# Функция check_row_sum принимает двумерный список
# в качестве аргумента и возвращает True, если сумма
# значений в каждой строке списка одинаковая.
# В противном случае она возвращает False.
def check_row_sum(value_list):
    # Исходно назначить состоянию значение True.
    status = True

    # Вычислить сумму значений в первой строке.
    sum_row_0 = value_list[0][0] + \
                value_list[0][1] + \
                value_list[0][2]

    # Вычислить сумму значений во второй строке.
    sum_row_1 = value_list[1][0] + \
                value_list[1][1] + \
                value_list[1][2]

    # Вычислить сумму значений в третьей строке.
    sum_row_2 = value_list[2][0] + \
                value_list[2][1] + \
                value_list[2][2]

    # Определить, не является ли сумма любой строки одинаковой.
    if (sum_row_0 != sum_row_1) or \
       (sum_row_0 != sum_row_2) or \
       (sum_row_1 != sum_row_2):
        # Если да, то присвоить переменной status значение False
        status = False

    # Вернуть status.
    return status

# Функция check_col_sum принимает двумерный список
# в качестве аргумента и возвращает True, если сумма
# значений в каждом столбце списка одинаковая.
# В противном случае она возвращает False.
def check_col_sum(value_list):
    # Исходно назначить состоянию значение True.
    status = True

    # Вычислить сумму значений в первом столбце.
    sum_col_0 = value_list[0][0] + \
                value_list[1][0] + \
                value_list[2][0]

    # Вычислить сумму значений во втором столбце.
    sum_col_1 = value_list[0][1] + \
                value_list[1][1] + \
                value_list[2][1]

    # Вычислить сумму значений в третьем столбце.
    sum_col_2 = value_list[0][2] + \
                value_list[1][2] + \
                value_list[2][2]

    # Определить, не является ли сумма любого столбца одинаковой
    if (sum_col_0 != sum_col_1) or \
       (sum_col_0 != sum_col_2) or \
       (sum_col_1 != sum_col_2):
        # Если да, то присвоить переменной status значение False
        status = False

    # Вернуть status.
    return status

# Функция check_diag_sum принимает двумерный список
# в качестве аргумента и возвращает True, если сумма
# значений в каждой диагонали списка одинаковая.
# В противном случае она возвращает False.
def check_diag_sum(value_list):
    # Исходно назначить состоянию значение True.
    status = True

    # Вычислить сумму значений в первой диагонали.
    sum_diag_0 = value_list[0][0] + \
                 value_list[1][1] + \
                 value_list[2][2]

    # Вычислить сумму значений во второй диагонали.
    sum_diag_1 = value_list[2][0] + \
                 value_list[1][1] + \
                 value_list[0][2]

    # Определить, не является ли сумма диагоналей одинаковой
    if sum_diag_0 != sum_diag_1:
        status = False

    # Вернуть status.
    return status

# Вызвать главную функцию.
main()
</code>

Если вы зададите список из девяти одинаковых значений (например, равных 5),  то будут выполняться все условия, кроме уникальности значений.
Уникальность означает, что числа не должны повторяться, все должны быть различны.


Не получается сделать кнопку, для того чтобы она забирала значение из строки entry значение
Пытаюсь создать полушуточный вирус-вымогатель и у меня не получается сделать кнопку, для того чтобы она забирала значение из строки entry значение. В окне после нажатия на крестик появляется строка, но не появляется кнопка для того чтобы значение в этой строке как бы зафиксировать и записать для дальнейшего сравнения с 'ключём'.
<code>
from tkinter import *
from tkinter import ttk

window = Tk()
window.title('Капутеру капут')
window.geometry('900x600')
window.resizable(width=False, height=False)
window.config(bg='white')
text = Label(text='ё рот этого казино', fg='blue', bg='white', font=('Courier New', 34))
text.place(x=100, y=100, width=700, height=100)
count_text = Label(text='1', fg='blue', bg='white', font=('Courier New', 38))

def count_start():
    if int(count_text['text']) > 0:
        count_text['text'] = int(count_text['text']) - 1
        count_text.place(x=250, y=25, width=400, height=100)
        window.after(1000, count_start)
    else:
        count_text['text'] = 0
        width = window.winfo_screenwidth()
        height = window.winfo_screenheight()
        window.geometry(str(width) + 'x' + str(height))
        photo = PhotoImage(file="picture.gif")
        label = Label(image=photo, bg='white')
        label.image = photo
        label.place(width=width, height=height, x=0, y=0)

def keys():
    key = Entry.get()
    if key == 'КЛЮЧ':
        window.destroy()

def on_close():
    count_start()
    Entry().pack(anchor=NW, padx=8, pady=8)
    newtext = Label(text='Введите уникальный ключ-код иначе вирус ', fg='blue', bg='white', font=('Courier New', 14))
    newtext.place(x=100, y=200, width=700, height=100)
    newtext2 = Label(text='сотрёт вашу операционную систему через две минуты', fg='blue', bg='white', font=('Courier New', 14))
    newtext2.place(x=100, y=300, width=700, height=100)
    btn = ttk.Button(text="Ввести ключь", command=keys())
    btn.pack(anchor=NW, padx=8, pady=8)
    label = ttk.Label()
    label.pack(anchor=NW, padx=6, pady=6)

window.protocol("WM_DELETE_WINDOW", on_close)

window.mainloop()
</code>

надо указать в каком окне создаеться кнопка

btn = ttk.Button(window,text="Ввести ключь", command=keys)

тоесть первый аргумент функции это окно ткинтер в котором будет располагаться кнопка, а еще
keys() в команде кнопки надо писать без () или не будет работать функция keys


Как вывести массив без максимального и минимального числа?
Вот мой код:
<code>
A, B, C, D = map(int, input().split())
d = [A, B, C, D]
K = max(d)
L = min(d)
</code>
теоретически макс. число - А, мин. число - В
Как теперь получить список без них?

d.remove(K)
d.remove(L)

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

while K in d:
    d.remove(K)

Или еще какой-нибудь.
Или так еще в одну строчку

d = [num for num in d if (num != K and num != L)]


Бот discord (discord.py) фильтр матов
Ребят, подскажите, пожалуйста, как можно реализовать такую штуку. У меня есть бот на discord. py. Он берет сообщение из чата, переводит в нижний регистр, убирает знаки препинания и сравнивает, есть ли сходство msg_words (нашего полученного слова) в списке ban_words. Все прекрасно, однако есть но. Например, у нас есть слово стол. Его можно написать так: стоАААл или так: сАААтол. При выполнении моей программы остается это: стоал или это сатол. Но ТАКОГО СЛОВА НЕТ В СПИСКЕ! Есть только стол. И поэтому мне надо, чтобы он находил схожесть полученного слова с banwords в ПРОЦЕНТАХ! и если оно больше 80%, то тогда программа выводила: Щас по губам отшлепаю!
Вот сама программа:
<code>
import discord
from discord.ext import commands
import os, sqlite3
import string, json

ban_words = ["стол"]

def simplify_word(word):
    last_letter = ''
    result = ''
    for letter in word:
        if letter != last_letter:
            last_letter = letter
            result += letter

    return result

@bot.event
async def on_message(message):
    if message.author.bot:
        return

    msg_words = [simplify_word(word.lower().translate(str.maketrans('','', string.punctuation))) for word in message.content.split()]

    for word in msg_words:
        if word in ban_words:
            try:
                await message.delete()
            except:
                print('Произошла ошибка при удалении слова! Проверь наличие прав у бота!')
            await message.channel.send(f'{message.author.mention} **Щас по губам отшлепаю!**')
            return

bot.run('TOKEN')
</code>

Я думаю вам стоит посмотреть в сторону регулярных выражений. Модуль re


Остановка потоков QThread, передача текста в QTextEdit и работа QProgressBar
Снова прошу помощи с потоками. Есть несколько проблем.

Нужно инициализировать кнопку "СТОП", при клике на которую потоки должны фактически останавливаться (т.е. thread_1 и thread_2), предварительно выдавать диалоговое окно (Вы уверены, что хотите прервать выполнение программы? ОК - прерываем, Отмена - продолжаем), без блокирования основного окна и всех работающих потоков, т.е. сканирование должно продолжаться вплоть до нажатия кнопки ОК)
При передаче сообщений из scanclass в функцию обработки message_handler, должны эти самые сообщения печататься .append("text") в QTextEdit каждого из потоков (для 1 потока это textEdit_plate_1, для второго это textEdit_plate_2 соответственно). Фактически функция "message_handler" не работает.
При передаче сообщения, пользователь должен видеть как заполняет QStatusBar каждого из потоков (примерно 33 сообщения должно высыпаться т.е. для каждого сообщения шаг СтатусБара должен быть равен ~3,03)
После того, как оба потока получили в переменной date_command - STOP, т.е. фактически отправка команд для работы с портом закончена, должно высыпаться окно dialog_adress, в котором пользователь вводит своё местоположение и местоположение должно передаваться в другой py файл, после нажатия кнопки ОК, должен запускаться py файл, в который ушла переменная со значением местоположения.

main.py

import sys

from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtCore import QThread
from PyQt5.QtWidgets import QMainWindow

from reo_main_window import Ui_MainWindow
from dialog_adress import Ui_Form_dialog_adress

import scanclass

import serial
import serial.tools.list_ports

class Thread(QThread):
    updateSignal = QtCore.pyqtSignal(object, str, str)

    def __init__(self, plate, name_thread):
        super().__init__()
        self.number_port = plate
        self.name_thread = name_thread
        print(f'number_port = {self.number_port}; {self.name_thread}')

    def run(self):
        scan = scanclass.ScanningReo(
            "serial_port", "date_from_cmd",
            "date_command", "name_freq", "name_dev")
        opn_srl_prt = scan.open_serial_port(self.number_port)
        opn_srl_prt.close()
        opn_srl_prt = scan.open_serial_port(self.number_port)
        id_dev = scan.device_identification(opn_srl_prt)

        print(id_dev)
        if "120" in id_dev:
            self.updateSignal.emit(id_dev, '120', self.name_thread)
            date_command = [f'"AT^SYSCFGEX="03",1\r"',
                            f'"AT^SYSCFGEX="01",2\r"', "AT^NETSCAN=0\r",
                            f'"AT^SYSCFGEX="01",3\r"', "AT^NETSCAN=0\r",
                            f'"AT^SYSCFGEX="02",4\r"', "AT^NETSCAN=1\r",
                            f'"AT^SYSCFGEX="03",5\r"', "AT^NETSCAN=3\r",
                            "STOP"
                            ]
        elif "821" in id_dev:
            self.updateSignal.emit(id_dev, '821', self.name_thread)
            ddate_command = [f'"AT^SYSCFGEX="03",1\r"',
                            f'"AT^SYSCFGEX="01",2\r"', "AT^NETSCAN=0\r",
                            f'"AT^SYSCFGEX="01",3\r"', "AT^NETSCAN=0\r",
                            f'"AT^SYSCFGEX="02",4\r"', "AT^NETSCAN=1\r",
                            f'"AT^SYSCFGEX="03",5\r"', "AT^NETSCAN=3\r",
                            "STOP"
                            ]

        for i in date_command:
            if "SYSCFGEX" in i:
                i = i.strip('"')
                self.msleep(1000 * 2)  # 2 сек.
            while scan.send_comm(opn_srl_prt, i) == "STOP":
                Thread.message_handler(self, id_dev, msg=date_command)
                self.msleep(1000 * 2)  # 2 сек.
            if scan.send_comm(opn_srl_prt, i) == "STOP":
                Thread.message_handler(self, id_dev, msg="Сканирование завершено")

    def message_handler(self, id_dev, msg):
        """ Функция "message_handler" обрабатывает поступающие сообщения
            и выводит их в ui.textEdit
        """

        if "120" in id_dev:
            if "AT^NETSCAN=20,-110,0" in msg:
                self.updateSignal.emit(
                    id_dev, "Начинаю сканирование 2!", self.name_thread)
            if "AT^NETSCAN=20,-110,1" in msg:
                self.updateSignal.emit(
                    id_dev, "Начинаю сканирование 3!", self.name_thread)
            if "AT^NETSCAN=20,-110,3" in msg:
                self.updateSignal.emit(
                    id_dev, "Начинаю сканирование 4!", self.name_thread)
            if "Начат" or "Закончен" in msg:
                self.updateSignal.emit(
                    id_dev, f"{msg}", self.name_thread)

        if "821" in id_dev:
            if "AT^NETSCAN=20,-110,0" in msg:
                self.updateSignal.emit(
                    id_dev, "Начинаю сканирование 2!", self.name_thread)
            if "AT^NETSCAN=20,-110,1" in msg:
                self.updateSignal.emit(
                    id_dev, "Начинаю сканирование 3!", self.name_thread)
            if "AT^NETSCAN=20,-110,3" in msg:
                self.updateSignal.emit(
                    id_dev, "Начинаю сканирование 4!", self.name_thread)
            if "Начат" or "Закончен" in msg:
                self.updateSignal.emit(
                    id_dev, f"{msg}", self.name_thread)

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

        self.pushButton_start.clicked.connect(self.run_th)
        self.pushButton_stop.clicked.connect(self.stop_th)

    def run_th(self):
        """ Функция "run_th" запускает потоки с экземплярами класса """

        device_port = self.scan_ttyusb()
        plate1 = device_port[0]  # scan_ttyusb()[0]
        plate2 = device_port[1]  # scan_ttyusb()[1]

        self.thread_1 = Thread(plate1, 'Plate 1')
        self.thread_1.updateSignal.connect(self.update_thread)
        self.thread_1.start()

        self.thread_2 = Thread(plate2, 'Plate 2')
        self.thread_2.updateSignal.connect(self.update_thread)
        self.thread_2.start()

    def stop_th(self):
        self.thread_1.finished
        self.thread_2.finished

    def update_thread(self, id_dev, plate, name_thread):
        if name_thread == 'Plate 1':
            if '821' in plate:
                self.label_plate_1.setText(f"{id_dev}")
            else:
                self.label_plate_1.setText(f"{id_dev}")
        if name_thread == 'Plate 2':
            if '120' in plate:
                self.label_plate_2.setText(f"{id_dev}")
            else:
                self.label_plate_2.setText(f"{id_dev}")

    def scan_ttyusb(self):
        """ Функция "scan_ttyusb" сканирует порты и возвращает номера портов
            к которым подключены нужные устройства
        """

        ports = list(serial.tools.list_ports.comports())
        result = ""
        for text in ports:
            if 'Pcui' in text[1]:
                txt = text[0]
                result = result + txt + ','
                device_port = result

        return device_port.split(",")

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

    main_window = MainWindow()
    main_window.setFixedSize(680, 572)
    # main_window.resize(680, 572)
    main_window.show()

    #     # Создание формы диалога внесения адреса и инициализация uid dialog_adress
    #     dialog = QtWidgets.QWidget()
    #     uid = Ui_Form_dialog_adress()
    #     uid.setupUi(dialog)
    #     dialog.show()
    #     dialog.setFixedSize(440, 161)

    sys.exit(app.exec_())

Вот часть кода scanclass.py:

class ScanningReo:
    def __init__(self, serial_port, date_from_cmd, date_command, name_freq, name_dev):
        self.serial_port = serial_port
        self.date_from_cmd = date_from_cmd
        self.date_command = date_command
        self.name_freq = name_freq
        self.name_dev = name_dev
    def send_comm(self, serial_port, date_command):
        print(date_command)
        if "NETSCAN" in str(date_command):
            time.sleep(2)
            result = ""
            for i in range(3):  # количество проходов от 0 до 2
                serial_port.write(date_command.encode())
                state_cycle = True
                print(f"Начат круг № '{i+1}'")    #Эти сообщения дожны сыпаться в QtextEdit каждого из потоков.
                prev_comm = ''
                start_cycle = time.time()
                while state_cycle:
                # main3.Thread.message_handler(id_dev=self.name_dev, msg=f"Начат круг № '{i + 1}'")
               ....
               ....
               ....
                print(f"Закончен проход № '{i+1}'")
                # main2.message_handler(msg=f"Закончен круг № '{i + 1}'", id_dev=self.name_dev)

С предыдущими проблемами, мне помог пользовать @S. Nick, за что ему выражаю отдельную огромную благодарность.

Ваш вопрос должен касаться ОДНОЙ проблемы.
Я попробую предложить вам один из возможных вариантов, который должен вам помочь в решении ПЕРВОЙ вашей проблемы. Помните, что я не могу проверить работу вашего приложения.
main.py
<code>
import sys
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.Qt import *

from reo_main_window import Ui_MainWindow
from dialog_adress import Ui_Form_dialog_adress

# !
from scanclass import ScanningReo                                         # !

import serial
import serial.tools.list_ports

class Thread(QThread):
    updateSignal = QtCore.pyqtSignal(object, str, str)

    def __init__(self, plate, name_thread):
        super().__init__()
        self.number_port = plate
        self.name_thread = name_thread
        print(f'number_port = {self.number_port}; {self.name_thread}')

    def run(self):
# !
        scan = ScanningReo(                                                  # !
            "serial_port", "date_from_cmd",
            "date_command", "name_freq", "name_dev")
        opn_srl_prt = scan.open_serial_port(self.number_port)
        opn_srl_prt.close()
        opn_srl_prt = scan.open_serial_port(self.number_port)
        id_dev = scan.device_identification(opn_srl_prt)

        print(id_dev)
        if "120" in id_dev:
            self.updateSignal.emit(id_dev, '120', self.name_thread)
            date_command = [f'"AT^SYSCFGEX="03",1\r"',
                            f'"AT^SYSCFGEX="01",2\r"', "AT^NETSCAN=0\r",
                            f'"AT^SYSCFGEX="01",3\r"', "AT^NETSCAN=0\r",
                            f'"AT^SYSCFGEX="02",4\r"', "AT^NETSCAN=1\r",
                            f'"AT^SYSCFGEX="03",5\r"', "AT^NETSCAN=3\r",
                            "STOP"
                            ]
        elif "821" in id_dev:
            self.updateSignal.emit(id_dev, '821', self.name_thread)
            ddate_command = [f'"AT^SYSCFGEX="03",1\r"',
                            f'"AT^SYSCFGEX="01",2\r"', "AT^NETSCAN=0\r",
                            f'"AT^SYSCFGEX="01",3\r"', "AT^NETSCAN=0\r",
                            f'"AT^SYSCFGEX="02",4\r"', "AT^NETSCAN=1\r",
                            f'"AT^SYSCFGEX="03",5\r"', "AT^NETSCAN=3\r",
                            "STOP"
                            ]

        for i in date_command:
            if "SYSCFGEX" in i:
                i = i.strip('"')
                self.msleep(1000 * 2)  # 2 сек.
            while scan.send_comm(opn_srl_prt, i) == "STOP":
                Thread.message_handler(self, id_dev, msg=date_command)
                self.msleep(1000 * 2)  # 2 сек.
            if scan.send_comm(opn_srl_prt, i) == "STOP":
                Thread.message_handler(self, id_dev, msg="Сканирование завершено")

    def message_handler(self, id_dev, msg):
        """ Функция "message_handler" обрабатывает поступающие сообщения
            и выводит их в ui.textEdit
        """

        if "120" in id_dev:
            if "AT^NETSCAN=20,-110,0" in msg:
                self.updateSignal.emit(
                    id_dev, "Начинаю сканирование 2G", self.name_thread)
            if "AT^NETSCAN=20,-110,1" in msg:
                self.updateSignal.emit(
                    id_dev, "Начинаю сканирование 3G", self.name_thread)
            if "AT^NETSCAN=20,-110,3" in msg:
                self.updateSignal.emit(
                    id_dev, "Начинаю сканирование 4G", self.name_thread)
            if "Начат" or "Закончен" in msg:
                self.updateSignal.emit(
                    id_dev, f"{msg}", self.name_thread)

        if "821" in id_dev:
            if "AT^NETSCAN=20,-110,0" in msg:
                self.updateSignal.emit(
                    id_dev, "Начинаю сканирование 2G", self.name_thread)
            if "AT^NETSCAN=20,-110,1" in msg:
                self.updateSignal.emit(
                    id_dev, "Начинаю сканирование 3G", self.name_thread)
            if "AT^NETSCAN=20,-110,3" in msg:
                self.updateSignal.emit(
                    id_dev, "Начинаю сканирование 4G", self.name_thread)
            if "Начат" or "Закончен" in msg:
                self.updateSignal.emit(
                    id_dev, f"{msg}", self.name_thread)

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
# +++
        self.thread_1 = None                                              # +++
        self.thread_2 = None                                              # +++

        self.pushButton_start.clicked.connect(self.run_th)
#-        self.pushButton_stop.clicked.connect(self.stop_th)

    def run_th(self):
        """ Функция "run_th" запускает потоки с экземплярами класса """

        device_port = self.scan_ttyusb()
        plate1 = device_port[0]
        plate2 = device_port[1]

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        if self.thread_1 is None and self.thread_2 is None:
            self.thread_1 = Thread(plate1, 'Plate 1')
            self.thread_1.updateSignal.connect(self.update_thread)
            self.thread_1.start()

            self.thread_2 = Thread(plate2, 'Plate 2')
            self.thread_2.updateSignal.connect(self.update_thread)
            self.thread_2.start()

            self.pushButton_start.setText("Stop Thread`s")
        else:
            reply = QMessageBox.question(
                self,
                'ВНИМАНИЕ !',
                "Вы уверены, что хотите прервать выполнение программы?",
                 QMessageBox.Yes, QMessageBox.No
            )
            if reply == QMessageBox.Yes:
                self.thread_1.terminate()
                self.thread_1 = None
                self.thread_2.terminate()
                self.thread_2 = None

                self.pushButton_start.setText("Start Thread`s")

#
#    def stop_th(self):
#        self.thread_1.finished
#        self.thread_2.finished

# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    def update_thread(self, id_dev, plate, name_thread):
        if name_thread == 'Plate 1':
            if '821' in plate:
                self.label_plate_1.setText(f"{id_dev}")
            else:
                self.label_plate_1.setText(f"{id_dev}")
        if name_thread == 'Plate 2':
            if '120' in plate:
                self.label_plate_2.setText(f"{id_dev}")
            else:
                self.label_plate_2.setText(f"{id_dev}")

    def scan_ttyusb(self):
        """ Функция "scan_ttyusb" сканирует порты и возвращает номера портов
            к которым подключены нужные устройства
        """

        ports = list(serial.tools.list_ports.comports())
        result = ""
        for text in ports:
            if 'Pcui' in text[1]:
                txt = text[0]
                result = result + txt + ','
                device_port = result

        return device_port.split(",")

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    def closeEvent(self, event):
        reply = QMessageBox.question(
            self,
            'Информация',
            "Вы уверены, что хотите закрыть приложение?",
             QMessageBox.Yes, QMessageBox.No
        )
        if reply == QMessageBox.Yes:
            if self.thread_1:
                self.thread_1.quit()
            del self.thread_1
            if self.thread_2:
                self.thread_2.quit()
            del self.thread_2

            super(MainWindow, self).closeEvent(event)
        else:
            event.ignore()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    main_window = MainWindow()
    main_window.setFixedSize(680, 572)
    main_window.show()
    sys.exit(app.exec_())
</code>

Если у вас есть другие проблемы - задайте НОВЫЙ вопрос.


Как найти все повторяющиеся последовательности из трёх цифр, которые идут друг за другом?
Необходимо найти все повторяющиеся последовательности из трёх цифр, которые идут друг за другом.
Пример
696696 878878 Вывести
696696 878878
Вход
534535345377777753453 Выход
777777
Мое регулярное выражение

import re
s=input()
res = re.findall(r'(?P<test>\d{3})(?P=test)', s)
print(res)

При вводе
696696 878878 выводит
['696', '878'], а надо
696696 878878
Как исправить?

а такой вариант подойдет?

(\d{3})\1+

\d{3} - любые 3 цифры

(\d{3}) - группа из любых 3 цифр (группа нужна, чтобы потом ее в регулярке использовать)

\1+ - от одного и больше повторений найденной ранее группы


Отключить автоматическое разбиение длинных строк при сохранении файла
Недавно начал писать бота на python в vscode и возник такой вопрос.
При написании длинной команды vscode при сохранении разбивает её и переносит.
Как это убрать/отменить?
Как пример:
До

dispatcher.register_message_handler(next, lambda message: message.text == 'Следующий▶', state='*')
dispatcher.register_message_handler(previous, lambda message: message.text == '◀Предыдущий', state='*')
dispatcher.register_message_handler(main_menu, lambda message: message.text == 'Главное меню', state='*')

После

dispatcher.register_message_handler(
    next, lambda message: message.text == 'Следующий▶', state='*')
dispatcher.register_message_handler(
    previous, lambda message: message.text == '◀Предыдущий', state='*')
dispatcher.register_message_handler(
    main_menu, lambda message: message.text == 'Главное меню', state='*')

Если я правильно понял то это происходит из-за стандарта pep8(ограничение длинны строки). Мне нужно только это отключить, ну или расширить не затрагивая остальных элементов.

Полностью отключить форматирование при сохранении:

Меню Файл -> Настройки -> Параметры (File -> Prefences -> Settings), в поиске вводите
format on save, убираете галку в пункте "Editor: Format On Save";
в файле settings.json это соответствует параметру
"editor.formatOnSave" (нужно удалить этот параметр или заменить
true на
false)

Отключить автоперенос для длинных строк можно задав очень большое ограничение на длину строки (например, 1000 символов). Как конкретно - зависит от выбранного форматтера.
Какой форматтер у вас включен нужно смотреть там же в настройках в "Python > Formatting: Provider"
Для autopep8 (форматтер для Python по умолчанию) в настройках vscode ищите "Autopep8 Args", добавляете элемент
--max-line-length 1000 (см. параметры командной строки autopep8)


как асинхронную функцию поставить в очередь aiograma
есть функция которая выполняется не в хендлере, и надо ее добавить в асинхронный поток aiograma, просто функция выполняется 10 минут, и весь процесс стоит, я ее переписал на асинхроную но как добавить в поток ?

Вот пример:
<code>
import asyncio
import aiogram

bot = aiogram.Bot("token")
dp = aiogram.Dispatcher(bot)

async def my_func():
    while True:
        print(1)
        await asyncio.sleep(1)

async def on_startup(dp):
    asyncio.create_task(my_func())

@dp.message_handler(commands=["start"])
async def start(message: aiogram.types.Message):
    await message.answer("Hello")

if __name__ == "__main__":
    aiogram.executor.start_polling(dispatcher=dp, on_startup=on_startup)
</code>
Аргумент on_startup отвечает за запуск асинхронной функции при старте бот, а уже метод create_task библиотеки asyncio запустит вашу задачу


Ошибка с базой данных sqlite flask (python)
Писал по видео Гоши Дудраря и не понимаю где ошибка?

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///shop.db'
db = SQLAlchemy(app)

class Item(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(30), nullable=False)
    price = db.Column(db.Integer, nullable=False)
    isActive = db.Column(db.Boolean, default=True)
    amount = db.Column(db.Integer, nullable=False)
    description = db.Column(db.Text(500), nullable=True)

@app.route('/')
def index():
    return render_template("index.html")

@app.route('/about')
def about():
    return render_template("about.html")

if __name__ == "__main__":
    db.create_all()
    app.run(debug=True)

выводит ошибку:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\user\miniconda3\lib\site-packages\flask_sqlalchemy\extension.py", line 868, in create_all
    self._call_for_binds(bind_key, "create_all")
  File "C:\Users\user\miniconda3\lib\site-packages\flask_sqlalchemy\extension.py", line 839, in _call_for_binds
    engine = self.engines[key]
  File "C:\Users\user\miniconda3\lib\site-packages\flask_sqlalchemy\extension.py", line 628, in engines
    app = current_app._get_current_object()  # type: ignore[attr-defined]
  File "C:\Users\user\miniconda3\lib\site-packages\werkzeug\local.py", line 513, in _get_current_object
    raise RuntimeError(unbound_message) from None
RuntimeError: Working outside of application context.

This typically means that you attempted to use functionality that needed
the current application. To solve this, set up an application context
with app.app_context(). See the documentation for more information.

Проблема в том, что метод create_all объекта db будет работать только в контексте приложения. Поэтому вместо этого:

if __name__ == "__main__":
    db.create_all()
    app.run(debug=True)

Напишите это:

if __name__ == "__main__":
    with app.app_context():
        db.create_all()
    app.run(debug=True)


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

def litres(time):
    rounded_time = round(time)
    return((rounded_time // 2))

>>> Passed: 106 Failed: 1 Exit Code: 1
>>> should return 5 litres: 6 should equal 5

Задание:

Натан любит кататься на велосипеде.
Поскольку Натан знает, как важно поддерживать гидрацию, он выпивает 0,5 литра воды за час езды на велосипеде.
Вам даётся время в часах, и вам нужно вернуть количество литров, которые выпьет Натан, округлённое до наименьшего значения.

округление до наименьшего значения - это отбрасывание дробной части, что легко делает
int()
а вы именно округляете по правилам округления через
round()


Удаление дублей строк в результате парсинга
Часть кода.
<code>
 with open("parse.txt", "a") as file:
        if file.tell():
         file.write('\n')
    file.write('\n'.join(map(str, (item.get("Id") for item in x if item.get("Id")))))

    with open("parse.txt") as input_:
        result = dict.fromkeys(input_).keys()

    with open("parse.txt", "w") as output:
        print(*result, file=output, sep="")
</code>
Я не уверен что правильно использую witch open. Как следует оптимизировать код чтобы не обращаться к файлу несколько раз?

Посмотрите, этот вариант кода делает то, что вам нужно?
<code>
with open("parse.txt", "a+") as file:
    if file.tell():
        file.write('\n')
    file.write('\n'.join(map(str, (item.get("Id") for item in x if item.get("Id")))))
    file.seek(0)  # Не уверен, что это здесь надо, протестируйте
    result = dict.fromkeys(file).keys()
    file.seek(0)  # Здесь тоже
    print(*result, file=file, sep="")
</code>


Как уменьшить размер кода?
Длина кода без пробелов, табуляций и символов перевода строки = 117
Как еще можно скомкать код?

a = [[int(a) for a in input().split()] for _ in range(int(input()))] #Ввод (массив в массиве)
for elem in a:
    print(19*elem[1] + (elem[0] + 239)*(elem[0] + 366) // 2) #Формула

Ввод:

4 #Кол-во подмассивов
2 0
13 20
5 23
18 6

Массив после ввода:

[[2, 0], [13, 20], [5, 23], [18, 6]]

Вывод (элементы подмассива проходят через формулу и выводятся):

44344
48134
45699
49458

119 символов

a=[[*map(int, input().split())] for _ in range(int(input()))]
for e in a:
    print(19*e[1]+(e[0]+239)*(e[0]+366)//2)

114 символов

a=[[*map(int,input().split())][:2]for _ in range(int(input()))]
for x,y in a:
    print(19*y+(x+239)*(x+366)//2)

на случай, если пользователь вводит больше, чем 2 числа на строку иначе убираем
[:2] и получаем 110 символов
108 символов

a=[[*map(int,input().split())][:2]for _ in range(int(input()))]
for x,y in a:print(19*y+(x+239)*(x+366)//2)

102 символа

for x,y in[[*map(int,input().split())][:2]for _ in range(int(input()))]:print(19*y+(x+239)*(x+366)//2)

98 символов

for x,y in[[*map(int,input().split())][:2]for _ in'a'*int(input())]:print(19*y+(x+239)*(x+366)//2)


Запись в список из файла
Есть текстовый файл, следующего вида:
0 0 0 0
3 3 3 3
Необходимо считать все значения и выдать их в следующем виде:
[[0, 0, 0, 0], [3, 3, 3, 3]]
В текущей версии кода вывод следующий:
[['0', '0', '0', '0'], ['3', '3', '3', '3']]
Как сформировать список с объектами типа int, а не str не прибегая к использованию сторонних библиотек? (с помощью numpy всё работает, однако он начинает ругаться если во входном файле списки разной длинны, а для корректной работы программы списки ДОЛЖНЫ быть разной длинны)
<code>
deg_seqs = []

with open("graph.txt") as file:
    lines = file.readlines()
for item in lines:
    temp = item.split()
    deg_seqs.append(temp)
print(deg_seqs)
</code>

Вот так:

with open('graph.txt', 'r') as file:
    deg_seqs = [list(map(int, line.split())) for line in file]

Тут используется
map, который применяет выбранную функцию к переданному списку:

list(map(int, line.split())) делает из
['1', '1', '1'] ->
[1, 1, 1]


Действие, при пустой таблице Python
Всем привет! Есть цикл, который строит и обрабатывает таблицы свеч бинанса по каждой паре. По окончанию каждого цикла выдает название монеты и ее цену с данными из таблицы:

print(use_coin)
print(use_klines['Open_time'].tolist())
print(use_klines['Open_time'].tolist())

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

OMGUSDT
[]
[]
THETAUSDT
[]
[]
ENJUSDT
[1668194460000]
[0.3438]
MITHUSDT
[]
[]

Как внутри цикла задать условие, чтобы при пустой таблице команды ptint не выполнялись?
PS ну и подскажите, пожалуйста, как преобразовать значения столбца Open_time в привычный вид)) Заранее спасибо!

Попробуйте сравнивать длину списка с нулем, т.е. :
<code>
if len(use_klines) > 0:
   #ваш print
else:
    pass
</code>


Помогите с решением задачи. Циклы
Доброй ночи.
Второй день пытаюсь решить поставленную задачу. Сам я новичок, практикуюсь ежедневно по несколько часов, но случилась какая-то напасть, не могу решить и все. Не сплю практически, все думаю над решением.
Прошу сердечно помочь, растолкуйте пожалуйста, я в тупике.
Задача:
Посчитайте произведение всех чисел последовательности, заканчивающейся нулем. Если чисел в последовательности нет – выведите нейтральное для произведения число – 1.
Ввод:
Последовательность чисел, каждое в новой строке
Вывод:
res – произведение всех чисел
Sample Input: 1 2 -1 0
Sample Output: -2
<code>
tasks = [1]
n = int(input())
while n:
    tasks.append(n)
    n = int(input())
if len(tasks) == 1:
    print(*tasks)
else:
    del tasks[0]
    print(abs(int(*tasks[:1])) - abs(int(*tasks[1:(len(tasks))-1])) - abs(int(*tasks[(len(tasks))-1:(len(tasks))])))
</code>
Неверное решение #806248107
Python 3.10
Failed test #2 of 3. Runtime error
Error:
Traceback (most recent call last):
File "/sandbox/main.py", line 10, in
print(abs(int(*tasks[:1])) - abs(int(*tasks[1:(len(tasks))-1])) - abs(int(*tasks[(len(tasks))-1:(len(tasks))])))
TypeError: int() takes at most 2 arguments (5 given)

Список здесь не нужен, поскольку он усложняет вычисления и не выводится как результат - достаточно одной переменной для формирования произведения.
Если чисел в последовательности нет, то выводится
1 как нейтральное число для произведения, то есть то число, которое не меняет произведение.

m = 1
while True:
    x = int(input('Число: '))
    if x:
        m *= x
    else:
        break

print(f'Произведение:{m}')

Число: 1
Число: 2
Число: -1
Число: 0
Произведение:-2


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

response = requests.request("POST", url, headers=headers, params=querystring)
x = response.json()

x['result']['Info'] = list(filter(lambda y: y['country'] in ('Br', 'It'), x['result']['Info']))

with open('parse.txt', 'a') as file:
    for item in x['result']['Info']:
        if item.get("Id"):
             file.write(f'{item.get("Id")}\n')

with open("parse.txt") as input_:
             result = dict.fromkeys(input_).keys()

with open("parse.txt", "w") as output:
             print(*result, file=output, sep="")

Из явной проблемы в текстовом файле записывается пустая строка(после повторного запуска).
Пример из вывода парсера

184355
624267
267537
476245
945637

При повторном запуске такой вид:

184355
624267
267537
476245
945637

930285
937583

x = list(filter(lambda y: y['country'] in ('Br', 'It'), x['result']['Info']))

with open('parse.txt', 'a') as file:
# 1
    if file.tell():
        file.write('\n')
    file.write('\n'.join(map(str, (item.get("Id") for item in x if item.get("Id")))))

# 2
    if file.tell():
        file.seek(file.tell()-1)
    for item in x['result']['Info']:
        if item.get("Id"):
             file.write(f'{item.get("Id")}\n')


Почему break не останавливает выполнение кода?
<code>
dict = 'АКРУ'
k=0
for p1 in dict:
    for p2 in dict:
        for p3 in dict:
            for p4 in dict:
                for p5 in dict:
                    slovo = p1+p2+p3+p4+p5
                    k+=1
                    if p1=='К':
                        print(k)
                        break
</code>

насколько я знаю, в питоне break не может прервать несколько уровней. Приходится делать сложно
<code>
class BreakLoop(Exception):
    pass

try:
    dict = 'АКРУ'
    k = 0
    for p1 in dict:
        for p2 in dict:
            for p3 in dict:
                for p4 in dict:
                    for p5 in dict:
                        slovo = p1 + p2 + p3 + p4 + p5
                        k += 1
                        if p1 == 'К':
                            print(k)
                            raise BreakLoop
except BreakLoop:
    pass
</code>


Извлечь массивы в которых есть нужный ключ в значении

{
  "result": {
    "list": [
      {
        "info": "Спорт",
        "county": "fr"
      },
      {
        "info": "Спорт",
        "country": "fr"
      },
      {
        "info": "Спорт",
        "country": "br"
      },
      {
        "info": "Спорт",
        "country": "it"
      }
    ]
  }
}

Есть задача, массивы у которых есть значения с ключами "country": "it", и "country": "br" вывести в переменную удалив массивы у которых есть "country": "fr"
В результате нужно получить такой json

{
  "result": {
    "list": [
      {
        "info": "Спорт",
        "country": "br"
      },
      {
        "info": "Спорт",
        "country": "it"
      }
    ]
  }
}

Пробовал использовать jq. Через него получается правильный результат, но через питон не могу понять как это сделать.

.result.list[]? |select(.country == "it",.country=="br")

import json
js = """{
  "result": {
    "list": [
      {
        "info": "Спорт",
        "country": "fr"
      },
      {
        "info": "Спорт",
        "country": "fr"
      },
      {
        "info": "Спорт",
        "country": "br"
      },
      {
        "info": "Спорт",
        "country": "it"
      }
    ]
  }
}
"""
x = json.loads(js)
x['result']['list'] = list(filter(lambda y: y['country'] in ('it', 'br'), x['result']['list']))
js=json.dumps(x,indent=2,ensure_ascii=False)
print(js)

{
  "result": {
    "list": [
      {
        "info": "Спорт",
        "country": "br"
      },
      {
        "info": "Спорт",
        "country": "it"
      }
    ]
  }
}


не печатается результат
Есть задание
Создать 2 класса
truck и
car, которые являются наследниками класса
auto
Класс
truck имеет:

Дополнительный обязательный атрибут
max_load.
Переопределённый метод
move, перед появлением надписи
«move» выводит надпись
«attention», его реализацию сделать при помощи оператора
super.
А так же дополнительный метод
load. При его вызове происходит пауза 1 сек., затем выдаётся сообщение
«load» и снова пауза 1 сек.

Класс
car имеет

дополнительный обязательный атрибут
max_speed и при вызове метода
move, после появления надписи
«move» должна появиться надпись
«max speed is <max_speed>».
Вместо
<max_speed> должно выводится значение обязательного атрибута
max_speed.

Создать по 2 объекта для каждого из классов
truck и
car, проверить все их методы и атрибуты.

class auto:
    brand = 'audi'
    age = 5
    color = 'red'
    mark = 'a8'
    weight = 5000

    def __init__(self, brand, age, mark):
        self.brand = brand
        self.age = age
        self.mark = mark

    def move(self):
        print(self.brand, self.mark, 'move')

    def birthday(self):
        self.age +=1
        print(self.age)

    def stop(self):
        print(self.brand, self.mark, 'stop')

class truck(auto):
    max_load = 3000
    def __init__(self, max_load = 2000):
        self.max_load = max_load
        super().__init__('attention', self.move(), self.stop())

a = truck
a.truck(auto)

В общих чертах как-то так. Метод
load() сделайте сами

class Auto:
    def __init__(self, brand, age, mark):
        self.brand = brand
        self.age = age
        self.mark = mark

    def move(self):
        print(self.brand, self.mark, 'move')

class Truck(Auto):
    def __init__(self, brand, age, mark, max_load=2000):
        super().__init__(brand, age, mark)
        self.max_load = max_load

    def move(self):
        print('attention')
        super().move()

class Car(Auto):
    def __init__(self, brand, age, mark, max_speed=300):
        super().__init__(brand, age, mark)
        self.max_speed = max_speed

    def move(self):
        super().move()
        print(f'max speed is{self.max_speed}')

truck = Truck('SCANIA', 10, '"s 770"')
truck.move()

car = Car('VW', 3, 'Touran', 320)
car.move()