В Tkinter привязать действие к виджету
Реализую игру "Магический шар", используя библиотеку Tkinter в стандартном пакете Python. Написал код окна и виджетов в нем:

область для написания вопросов (на основе tk.Text) + кнопка "Спросить"
область для вывода ответов (также tk.Text)
область tk.Text для написания новых вариантов ответов (здесь мы как бы "обучаем" шар).

Функционал простой и, конечно, следом потребует доработки (выход из игры, обновление области вопросы и ответов, простой анализ на основе регулярных выражений - скажем, чтобы игра видела знак вопроса в конце вопросительного предложения).
Функции (обработчики событий):

список ответов
приглашение задать вопрос и его "обдумывание" + случайный ответ (пока так, но следом случайный ответ перенесу в отдельную функцию для области ответов)
далее напишу функцию обработки новых вопросов.

Работаю в среде Jupyter Notebook. Испытал проблемы:

если ставлю обработку ввода текста
print(event.char), то вывод полученного от пользователя текста осуществляется в консоль Jupyter, а не в окно программы. Как сделать обратное? Причем если пишу функцию просто для вывода текста с одной приведенной строкой, то вывод идет туда и туда, но тогда дальнейшая логика в обработчике отсутствует.
заданный функцией диалог с пользователем ("Задайте свой вопрос: ") также отправляется в консоль.

Таким образом, питон tkinter видит события в виджете текста, но после их обработки результат дает в консоль.
Код:

# Функция задает вопрос пользователю, а затем возвращает случайные результаты из ответов
def answerQuery(event):
#     print(event.char)
    question = input("Прошу Вас - задайте свой вопрос: ")
    print("Я заглядываю за повороты судьбы, чтобы узнать о грядущем")
    time.sleep(2)
    print("Хмм...")
    time.sleep(2)
    print(random.choice(responses))  # responses - список ответов

# Связывает событие нажатия клавиши с answerQuery()
# text_box_question - область tk.Text для написания вопросов
text_box_question.bind('<Key>', answerQuery)

Читайте текст из вашего виджета:

question = text_box_question.get("1.0", END)

И выводите в другой:

text_box_answer.insert(END, "Хмм..." + "\n")
wnd.update_idletasks()
time.sleep(2)
text_box_answer.insert(END, random.choice(responses) + "\n")

Но лучше
sleep() не использовать. Этим вы заблочите весь UI (будет казаться, что программа 'зависла'). Вместо этого можно использовать метод
after() (отложенное исполнение кода). Например так:

wnd.after(2000, lambda: text_box_answer.insert(END, random.choice(responses) + "\n"))


Как Selenium подключить к запущенному профилю chrome?
Вот есть браузер. Хром.
Вот в браузере хроме есть целиком настроенный под меня профиль. Закладки там, расширения и.т.п.
Вот есть я, который сидит и работает в запущенном браузере хроме в моем профиле.
Вот есть я, который хочет написать программу, которая по нажатию кнопки в гуе будет делать в нужной мне вкладке запущенного хрома нужные мне действия.
Может ли такое селениум? Или дядя иди гуляй?

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


python наследование, проектирование
У меня есть класс ChromeDriver для работы с вебдрайвером, который в конструкторе содержит его инициализацию. Есть еще класс SomeSite, который наследует класс ChromeDriver и все его методы для работы с движком, типа открытие ссылки + обработка возможной ошибки и тд. Объект класса SomeSite создается в цикле несколько раз, при этом происходит и инициализация самого вебдрайвера, т.е. создается много окон, что мне не нужно. То есть, я хочу создавать объекты класса SomeSite, чтобы при этом инициализация (ChromeDriver.init(self)) происходила только один раз.
<code>
class ChromeDriver:
    def __init__(self):
        try:
            self.__driver = webdriver.Chrome()
        except WebDriverException:
            pass

class SomeSite(ChromeDriver):
    def __init__(self):
        ChromeDriver.__init__(self)
</code>

Организуйте какой-нибудь флаг, что ChromeDriver уже инициализирован, и не дёргайте init второй раз. Например:

class SomeSite(ChromeDriver):
    initialised = False
    def __init__(self):
        if not SomeSite.initialised:
            SomeSite.initialised = True
            ChromeDriver.__init__(self)

Если не хотите явно указывать имя класса для доступа к статической переменной, то можно обратиться к ней как
self.__class__.initialised.


Может ли бот тегать 2 участников в сообщении?
Здраствуйте. Вот такой вопрос у меня появился. Я хочу сделать развлекательного бота для беседы со своими друзьями. Так вот, во многих ботах присутствует функция "Ролевых команд". К примеру участник пишет в ответ на сообщение другому участнику "обнять". А бот в свою очередь должен будет ответить
@ТегПервогоЮзера обнял @ТегВторогоЮзера
Я смог сделать первый тег, но не знаю как сделать второй. Вот мой код. Если есть вопросы, я готов ответить
<code>
def rrrr(message):
    if message.text.lower() == 'обнять':
        tag = message.from_user.username
        bot.send_message(message.chat.id, f"@{tag} обнял")```
</code>

Да, можно. Для того, чтобы сделать такую возможность пользователь должен ответить на сообщение того, к кому конкретное действие применяется.
Проблем в том, что у одного из пользователей юзернейм может быть не установлен, что делать в таком случае? :)
<code>
def rrrr(message):
    if message.text.lower() != 'обнять' or message.reply_to_message is None:
        return

    from_user = message.from_user # Тот, кто обнимает
    replied_user = message.reply_to_message.from_user # Тот, кого обняли

    if from_user.username is None:
        author = f"{from_user.first_name} {from_user.last_name}"
    else:
        author = f"@{from_user.username}"

    if replied_user.username is None:
        target = f"{replied_user.first_name} {replied_user.last_name}"
    else:
        target = f"@{replied_user.username}"

    bot.send_message(message.chat.id, f"{author} обнял {target}")
</code>
Можно придумать что-то лучше...


Не выполняет блок кода после цикла while в приложении для Виндоус "Python 3.9". Через коммандную строку все работает
Только начал учить Python. При запуске данного кода с файла в Python, цикл while выполняется и программа вылетает, не выводя последнюю часть "print" c "for". Пробовал делать цикл независимым от булевой переменной и прекращал его break, но эффект тот же... Пробовал добавлять к if фнкцию else, но не достиг успеха. Помогите пожалйста разобраться, в чем дело, чтобы после завершения цикла выполнялся следующий блок кода.
Обновлено:
Запустил с коммандной строки, все получилось.
Не правильно исполняется в приложении Python 3.9.
Буду рад помощи, если кто с таким сталкивался)
<code>
#Учусь заполнять словарь с помощью цикла while
responses = {}

# Создаю булевую переменную
polling_active = True

#сам цыкл
while polling_active:
    #задаю вопросы для создания ключа и значения для словаря
    name = input("\nWhat your name? ")
    response = input("Which mountain would you like to climb someday? ")

    #сохраняю результат в словарь
    responses[name] = response

    #спрашиваю про продолжение
    repeat = input("\nWould you like to let another person respond? (yes/no) ")

    #условие прекращения работы цикла
    if repeat == 'no':
        polling_active = False

# Вивод конечного результата после завершения цикла
# Который и не работает, программа завершается после смены переменной polling_active = False
print("\n--- Poll Results ---")
for name, response in responses.items():
    print(f"{name.title()} would like to climb {response.title()}.")
</code>

попробуй просто поставить в условие цикла true, а в условии отмены просто break


Python. Нестандартная фильтрация списка
Есть вот такой список строк, включая пустые:
<code>
lst = [
'* авто / ауто',
'! автомат .СеИ неод мI1 мнII1',
'автостоп 2 .СеИ неод мI1 мнII1 * устройство',
'! автомобиль 2 .СеИ неод мI3 мнI4',
'автостоп 3* .СеИ неод м!I1 * использование попутных машин',
'',
'антон .СеИ одуш м!I1 *??',
'! антон .СеИ одуш м!I1 *??',
'антонов .ПмИ III1',
'антонов .ПмИ IIIф о',
'',
'аукцион .СеИ неод мI1 мнII1 * <= augere',
'! август .СеИ одуш м!I1',
'август .СеИ одуш м!I1',
'! август .СеИ неод мI1 мнII1',
'август .СеИ неод мI1 мнII1',
]
</code>
То есть список строк делится на группы. Группы разделены пустой строкой.
Как по-быстрому удалить только первые строки из каждой группы?

x = [a[i] for i in range(len(a)) if a[i-1] != ''][1:]


Чем отслеживать открытие новых вкладок chrome и по условию закрывать?
Подскажите пожалуйста, с чего начать, в каком направлении копать:
Есть сайт. С весьма изуверски реализованным открытием страниц (кликаешь на ссылку, там переадресация, и в итоге открывшаяся страница имеет совершенно другой адрес) и кучей вариантов попасть на одну и ту же страницу.
Хочу накатать себе такую штуку, которая будет делать такой алгоритм:

Отслеживаю открытия новых вкладок;
Дожидаюсь загрузки вкладки (все переадресации и.т.п.);
Проверяю адрес загрузившейся страницы по бд;
Если адрес уже есть в бд - закрываю вкладку.

Вроде слышал чего то про Selenium, но не уверен может ли он такое? А в многоподключение и многопоточность (если я открою 2ю вкладку до того как 1я загрузится)? Или есть другие инструменты?
И, собственно, если Селениум то где про него лучше почитать про актуальные версии?

Если надо просто отслеживать открытие вкладки, то subprocess и команда tasklist тебе в помощь.
<code>
mas_not_formated = [line.decode('cp866', 'ignore') for line in Popen('tasklist', shell=True, stdout=PIPE).stdout.readlines()]
mas_not_formated = [value for value in mas_not_formated if len(value.split()) != 0]
mas = [i.split()[1] for i in mas_not_formated]
</code>
И проверяешь в цикле, если нету в изначальном, тогда действие, однако в случае с твоей задачей, тебе необходим Selenium.


Получение файла GET запросом в python
Сервер по GET запросу формирует csv в теле ответа на запрос, которую нужно сохранить в файл. При первом обращении, когда запрос сформирован верно, сервер отправляет код 200, после чего начинается формирование тела запроса. При последующем отправке запроса с одинаковым содержанием параметров возможны два варианта:

файл еще формируется, код 200 и текстовое содержимое в виде процентов сформированной части ответа
файл сформирован, код 202 и полный csv.
Задача - сохранить csv в файл. Реализовал следущий скрипт на питоне.

import requests

def create_file(response):
    with open('file', 'w') as f:
        f.write(response.text)

def create():

    url = '....csv'

    headers = {
        'Authorization': f'OAuth {token}',
        'content-disposition': 'attachment',
        'content-encoding': 'gzip',
        'content-type': 'text/csv'

    }
    params = {...
    }
    response = requests.get(url=url, params=params, headers=headers)
    if response.status_code == 202:
        create_file(response)

if name == '__main__':
    create()

Такой код отрабатывает, проблема в том, что этот скрипт нужно запускать до тех пор, пока ответ
response.status_code будет равен 202. Полагаю, что можно завернуть логику в бесконечный генератор и запускать его в цикле до тех пор, пока не придет нужный ответ. Думаю, что более изысканным будет решение с потоками.
Как можно решить такую задачу?

Ну просто ждите в бесконечном цикле, пока файл на сервере сформируется:

while True:
    response = requests.get(url=url, params=params, headers=headers)
    if response.status_code == 202:
        create_file(response)
        break

Можно ещё
time.sleep(сколько-нибудь) в цикл добавить, чтобы не дёргать сервер слишком часто.


Как записать в .xlsx файл таблицы с заголовком?
Использую такой код:
<code>
df = pd.DataFrame.from_dict(self.table)
df.sort_values(by=['id'], ascending=False)
df.style.set_caption("Заголовок таблицы")
df.to_excel(path+"test.xlsx", sheet_name="sheet111", index=False)
</code>
Но заголовок не появляется.

В документации явно указано, что объект
Styler.style.set_caption устанавливает текст в HTML элементе
<caption>:

Set the text added to a
<caption> HTML element.

Соответственно этот метод не будет работать для Excel файла.


TypeError: 'ReplyKeyboardMarkup' object is not callable telebot
Всем привет.
Есть у меня такая часть функции в телеботе.

@bot.message_handler(content_types=['text'])
def start_text(message):
    if message.text == 'Игры🎮':

            markup = telebot.types.ReplyKeyboardMarkup(resize_keyboard=True)
            markup("GTA V Premium","RDR 2", "Watch Dogs 2") #bug
            markup.row("🔙Назад в меню")
            bot.send_message(message.chat.id,'Какую игру вы хотите преобрести?:\n1. GTA V Premium\n2. Red Dead Redemtion 2\n3. Watch Dogs 2 (Deluxe)',reply_markup=markup)

            harlos = types.InlineKeyboardMarkup(row_width=2)
            harlos_button = types.InlineKeyboardButton("Еще продукты",callback_data="next1")
            harlos.add(harlos_button)
            opt_buttons = telebot.types.ReplyKeyboardMarkup(resize_keyboard=True)
            opt_buttons.row("Ghostrunner", "Cyberpunk 2077")
            opt_buttons.row("Обратно""🔙Назад в меню")
            bot.send_message(message.chat.id,f"Хорошо, вот второй список\nЧто здесь ты хочешь преобрести?:\n1.Ghostrunner - {ghostrunner_price} рублей\n2. Cyberpunk 2077 - {ghostrunner_price} рублей",reply_markup=harlos_button)
    elif message.text == "🔙Назад в меню":
        info(message)
    elif message.text == "GTA V Premium":

        markup111 = types.InlineKeyboardMarkup(row_width=2)
        mm = types.InlineKeyboardButton("Да!✅",callback_data="yes")
        #mm2 = types.InlineKeyboardButton("Нет❌",callback_data='no')
        markup111.add(mm)

        bot.send_message(message.chat.id,f"Хороший выбор! GTA V Premium стоит {gtav_price} рублей. Перейдем к оплате?",reply_markup = markup111)

При срабатывании этой части функции, у меня ошибка на 4 строке.
Сама ошибка:

markup("GTA V Premium","RDR 2", "Watch Dogs 2") #bug
TypeError: 'ReplyKeyboardMarkup' object is not callable

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

Вы неправильно добавляете кнопки в клавиатуру, должно быть так:
<code>
markup.add("GTA V Premium")
markup.add("RDR 2")
markup.add("Watch Dogs 2")
</code>


Как я могу пройти по всем файлам в папке?
Есть заданный путь, допустим, диск D:, как я могу пройти по всем папкам и подпапкам, доходя до файлов?

Воспользуйтесь стандартным модулем pathlib:
<code>
from pathlib import Path

p = Path("D:/")
for x in p.rglob("*"):
    print(x)

</code>


Поиск индекса слова в строке
у меня к вам вопрос, у меня задание найти позицию проверочного слова "кот".
Длина строки - 50 символов, когда я разбивал строку при помощи split, кот стоит на 6 позиции.
Я не понимаю как можно найти слово "кот", т.к. перед ним слово "который".
Я ввожу искомое слово, но данный код работает только для слова "кот". Вопрос как его найти, в результате индекс должен быть равен 23. Благодарю Вас.
<code>
x = "У нас который год есть кот которого Васькой зовут."
y = input()
print("Слово началось с " + str(len(x) - x.rindex(y)) + " позиции" if y in x else "Слово не найдено")введите сюда код сюда код
</code>

x = "У нас который год есть кот которого Васькой зовут."
print(x.find(' кот ')+1)
print(x.index(' кот ')+1)

Результат:

23
23

Рекомендация: Перед тем, как задавать вопрос, откройте любой учебник по Python. Раздел со строками (ну, или с той темой, по которой вы вопрос задать хотите).


Неправильный вывод функции python

def generatePaths():
    p = [0,0,0,0,0,0,0,0]
    r = []

    p[-1] += 1 # Увеличиваем последний элемент массива на 1
    r.append(p)# Добавляем этот массив к r
    p[-1] += 1 # Увеличиваем последний элемент массива на 1
    r.append(p)# Добавляем этот массив к r

    return r

Вывод получается:

[[0, 0, 0, 0, 0, 0, 0, 2], [0, 0, 0, 0, 0, 0, 0, 2]]

Почему так?

Потому что это один и тот же список
p два раза лежит внутри списка
r. Т.е. фактически у вас список
r выглядит так:

r = [p, p]

Когда вы меняете список
p, эти изменения отражаются в том, что вы видите в списке
r (два раза).
Хотите, чтобы эти вложенные в
r списки стали независимыми (разными) списками - делайте копию списка:

r.append(p.copy())

Хотя это поможет только с одномерными списками. Если там будет больше вложенность, то копировать нужно будет с помощью
deepcopy.


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

Как написал пользователь в комментариях, нужно импортировать файл таким путем:
<code>
from .folder.file import VAR
</code>
С текстовым файлом повторить нельзя, как я и предполагал


Deploy fastapi в docker контейнере
Пытаюсь запустить тестовый проект на
fastapi на
ubuntu 20.04 c
docker.
Пользуюсь оф доками.

Dockerfile

FROM python:3.8

RUN pip install fastapi uvicorn

EXPOSE 8000

COPY ./app /app

CMD ["uvicorn", "app.main:app", "--host", "127.0.0.1", "--port", "8000"]

main.py

from typing import Optional

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

Создаю Docker image так
sudo docker build -t myimage . . Потом запускаю в контейнере
sudo docker run -d --name mycont -p 8000:8000 myimage.
Контейнер создается. В списке активных контейнеров вижу

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
333ad5104b9f myimage "uvicorn app.main:ap…" 13 seconds ago Up 12 seconds 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp mycont

в логах докера

INFO: Started server process [1]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on 127.0.0.1:8000 (Press CTRL+C to quit)

Но при переходе по ссылке 127.0.0.1:8000/docs страница не открывается. Подскажите пожалуйста, в чем моя ошибка

Попробуйте поменять на:

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

Это происходит потому, что вы явно привязываетесь к локальному адресу внутри контейнера (в данном случае его лучше воспринимать как независимую компьютер находящийся в некой сети), тогда как у контейнера есть несколько сетей, нужная нам это
172.x.x.x. Поэтому мы и указываем
--host 0.0.0.0 чтобы запусть сервер на всех доступных адресах на порту
8000, чтобы при публикации порта через
-p 8000:8000 наше приложение было доступно.
Ну и пример из документации.


Что нужно сделать, чтобы из переменной None сделать другую в Python?
Я не понимаю, как код переделать, чтобы он работал...
test.py

import lang
import time

time.sleep(1)

lang.ru = 1

lang.up()

print(lang.ru)
print(lang.start)

lang.py

ru = None
start = None

def up():
    if(ru == 0):

        # Eng

        start = "Hello"

    else:

        # Rus

        start = "Привет"

Как сделать чтобы оно работало?

<code>
def up():
    nonlocal start
    nonlocal ru
    ....
</code>
Или через global
Питон думает что старт это новая локальная переменная и не перезаписывает глобальную.


Discord.py бот выдает что я угадал,даже если я не угадал
Я новичок в discord.py да и в целом в Python.
Написал я команду,все выполняется,но когда я угадываю число,бот все равно пишет что я не угадал. Почему так?
Вот мой код:
<code>
@client.command()
async def roll(ctx, a1number):
    botnumber = random.randint(0, 6)
    if a1number == botnumber:
        await ctx.send('You guessed! The number is: ' + str(botnumber)  +  '🎲')
    else:
        await ctx.send('You didnt guessed :( The number is: ' + str(botnumber)  +  '🎲')
</code>
это выдает что я не угадал даже при том что я угадал

это выдает что я не угадал даже при том что я угадал

Вы отправляете боту строку, а не целочисленное число.
А
random.randint(0, 6) возвращает целочисленное число. Вам нужно сравнить либо
str с
str, либо
int с
int.
Попробуйте сделать так:

if a1number == str(botnumber) :

или

if int(a1number) == botnumber:

Или можно сразу принимать аргумент
a1number в виде числа:

async def roll(ctx, a1number: int):


Как установить права пользователей к создаваемому каналу discord.py
Я хочу при создании текстового канала изменить права пользователей для него, а конкретно запретить всем участникам видеть этот канал за исключением одного, который так же может в него писать.
Код:
<code>
    guild = bot.get_guild(880008097370865706)
    category = discord.utils.get(guild.categories, name="Фермы")

    overwrites = {

    }
    channel = await guild.create_text_channel(f'⛏{member.name}-{farm}', category=category, overwrites=overwrites)
</code>
Что должно быть в словаре overwrites? В документации я не нашел параметров для этих целей.

Попробуйте так:
<code>
guild = bot.get_guild(880008097370865706)
category = discord.utils.get(guild.categories, name="Фермы")

overwrites = {

}
channel = await guild.create_text_channel(f'⛏{member.name}-{farm}', category=category, overwrites=overwrites)
await channel.set_permissions(ctx.guild.default_role, read_messages=False) # это установит роле @everyone запрет на просмотр чата
user=bot.fetch_user(id пользователя, которому надо дать права)
await channel.set_permissions(user, read_messages=True, send_messages=True)
</code>


Как каждую вторую букву сделать заглавной в Python
Есть строка, например - привет как дела
И мне надо чтобы эта строка стала вот такой:
ПрИвЕт КаК ДеЛа

while True:
    words = input()
    words = list(words)

    end_list = []

    letter = words[::2]

    for i in letter:
        words.remove(i)

    string = ''.join(letter).upper()
    list_string = list(string)

    for i in range(len(words)):
        end_list.append(list_string[i])
        end_list.append(words[i])

    print(''.join(end_list))

Мой вариант на больших строках начинает некорректно работать!

Привет как дела у меня все хорошо #input

ПрИвЕт кАк дЕлАеУяМ Нв еС  хОрОш #output

import re

text = "Привет!!11 Как дела? У меня - все хорошо."
new_text = re.sub(r'(\b|\w)(\w)', lambda x: x.group(1).lower()+x.group(2).upper(), text)

print(new_text)

ПрИвЕт!!11 КаК ДеЛа? У МеНя - ВсЕ ХоРоШо.


Как получать одинаковые индексы и менять их местами?
Всем привет.
Кратко о проекте: Django-проект, есть элементы Item при добавлении каждого нового - создаётся order_index по порядку (+1 от общего числа), для сортировки.
Реализованы 2 функции: up_item которая прибавлеят +1 к order_index, и down_item которая отнимает -1 от order_index.
Проблема: Совпадение индексов order_item. Может получится несколько индексов, например, со значением 2.
Функция выглядит так:
<code>
def up_item(request, id):
    item = Item.objects.get(id=id)
    item.order_index +=1
    item.save()
    return redirect('/')
</code>
Нужно: сделать так, чтобы индексы не повторялись (при добавлении +1, отнимался -1 у другого).
Чтоб при функции up_item прибавлялся +1 к order_index и отнимался -1 у order_index другого item с таким же значением индекса.
И при down_item отнимался -1, но прибавлялся +1 у item с таким же индексом order_index.
Например: item_bb имеет индекс 1, а item_cc имеет индекс 2.
При нажатии на функцию up_item - у обоих получится одинаковые индексы 2, и это проблема! Нужно чтоб функция не только прибавляля +1 у item_bb, но и отнимала -1 у item_cc!

сделать так, чтобы индексы не повторялись - поставить
unique столбцу :)

менять их местами - что-то такое:

def set_order_index(item: Item, distinction: int) -> None:
    items_to_swap = Item.objects.filter(
        order_index=item.order_index + distinction
    )
    if len(items_to_swap) > 0:
        item_to_swap = items_to_swap[0]
        item_to_swap.order_index = item.order_index
        item_to_swap.save()
    item.order_index += distinction
    item.save()

def up_item(request, id):
    item = Item.objects.get(id=id)
    set_order_index(item, 1)
    return redirect('/')

Для
down_item вторым аргументом передавать
-1. Также изначально не должно быть одинаковых индексов, существующие ошибки функция не правит.


Как округлить число до двух первых значащих цифр после запятой?
К своему стыду никак не могу найти способ округлять числа так (до двух первых значащих цифр после запятой):
<code>
0,0003658313517468447045911834644229 -> 0,00037
0.15 -> 0.15
0.156 -> 0.16
0.006 -> 0.006
0.0066 -> 0.0066
</code>
Есть способ делать это из коробки?

У меня получилась такая функция:

import math

def round_to(num, digits=2):
    if num == 0: return 0
    scale = int(-math.floor(math.log10(abs(num - int(num))))) + digits - 1
    if scale < digits: scale = digits
    return round(num, scale)

# ну или оно же в виде однострочной лямбды
_round_to = lambda num, digits: 0 if num == 0 else round(num, max(int(-math.floor(math.log10(abs(num - int(num))))) + digits - 1, digits))

nums = [0.0003658313517468447045911834644229, 0.15, 0.156, 0.006, 0.0066]
print(*[(x, round_to(x)) for x in nums], sep="\n")

Результат:

(0.0003658313517468447, 0.00037)
(0.15, 0.15)
(0.156, 0.16)
(0.006, 0.006)
(0.0066, 0.0066)


Как разбить значения-списки CSV на строки, используя разделитель?
Условно есть DataFrame:

А   Б
1 | 2,3
2 | 3,5
3 | 8,9

В котором значение CSV из столбца Б надо разбить по строкам используя разделитель, чтобы получилось такое:

1 | 2
1 | 3
2 | 3
2 | 5
3 | 8
3 | 9

Воспользуйтесь методами Series.split() и Series.explode()
Пример:
<code>
In [63]: df
Out[63]:
   val
1  2,3
2  3,5
3  8,9

In [64]: res = df["val"].str.split(",").explode()

In [65]: res
Out[65]:
1    2
1    3
2    3
2    5
3    8
3    9
Name: val, dtype: object
</code>


Как сделать асинхронный цикл?
Всем привет! Возможно я плохо ищу, потому что я не нашел конкретно того, что мне нужно. Буду благодарен, если кто-то скинет документацию. Я хотел сделать асинхронный цикл, который будет вечно спустя 10 секунд проверять наличие меньше 99 монет на балансе пользователя, но как сказал ранее - не знаю как. Вот кусочек кода, который нужно обернуть.
<code>
                await asyncio.sleep(10)
            if balance < 99:
                await ctx.author.remove_roles(rolecreate)
                await ctx.send(embed = timesup)
            else:
                cursor.execute("UPDATE users SET cash = cash - 99 WHERE id = {}".format(ctx.author.id))
</code>

обернули

def balancetask(ctx,cursor):
    while True:
        await asyncio.sleep(10)
        if balance < 99:
            await ctx.author.remove_roles(rolecreate)
            await ctx.send(embed = timesup)
        else:
            cursor.execute("UPDATE users SET cash = cash - 99 WHERE id = {}".format(ctx.author.id))

и запускаем

 asyncio.get_running_loop().create_task(balancetask(ctx,cursor))

но курсор лучше получать новый на каждой итерации.


Как задать возможность кикать участников боту? [закрыт]

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

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

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

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

Здраствуйте, я хочу научить бота выполнять команду кика, как это сделать? Могу написать примерную команду
kick @ТегЮзера

Кикать по юзернейму идея не очень, лучше всего ответом на сообщение. Команда будет выглядеть примерно так:
<code>
@bot.message_handler(commands=["kick"])
def kick_user_handler(message):
    chat_id = message.chat.id

    if message.type not in ("group", "supergroup"):
        # Команда используется не в чате
        return None

    member = bot.get_chat_member(chat_id, message.from_user.id)
    if not member.can_restrict_members:
        # У пользователя нет прав банить пользователя
        return None

    if message.reply_to_message is None:
        # Команда используется не ответом на сообщение
        return bot.reply_to(message, "Эту команду нужно использовать ответом на сообщение...")

    bot.ban_chat_member(chat_id, message.reply_to_message.from_user.id, 3600)
</code>
Вместо 3600 установите свою длительность.


Разница в хранении данных с помощью бд и с помощью текстовых файлов [закрыт]

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

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

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

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

У меня есть потребность в хранении довольно большого количества данных о пользователе, притом иметь как можно меньше время доставания\изменения этих данных. Вопрос в том, каким способом эти данные хранить при таких условиях? Довольно очевидный вариант - базы данных, но судя по моим тестам(проводились они на sqlite, но не думаю, что дело в бд), их вес получается довольно большой и время отклика у них примерно такое же, как если бы просто сохранять данные в txt файл.
И теперь у меня встал вопрос в том, какие могут быть проблемы в случае, если будет использоваться именно вариант с файлами кроме того, что это просто звучит очень непрофессионально и странно?

Файловая система обычно не расчитанна на хранение миллиона файлов в одном каталоге. Если файлов больше 10000 уже могут начаться( а могут не начаться) проблемы с откликом. Чтоб избежать этого эти файлы распределяют по подпапкам, но это усложняет поиск нужного файла. Файловый вариант хорош пока его только читаешь. При копировании большого количества мелких файлов начинается ад.
Хранение данных в бд оправданно если часто делается поиск по содержимому текста или есть какое-то измерение кроме имени файла ( например связи, таги, свойства). Данные в базе занимают больше места, но это компенсируется скоростью поиска нужного свойства по индексу. Также возможность построения полнотекстового индекса дает возможность найти слова в тексте не читая этот текст совсем.


Python как узнать, что человек вошел в голосовой канал в Дискорде?
Подскажите, как узнать, что человек вошел в голосовой канал Дискорде? и как узнать, кто этот человек? Спасибо.
Я нашел вот такой код, чтобы скинуть имена всех, кто в голосовых чатах и перекинуть их в один. Может быть, можно как-то доработать этот код?
<code>
@bot.command()
@commands.has_permissions(administrator=True)
async def mtm(ctx):
    c = 1
    for channel in ctx.guild.voice_channels:
        for member in channel.members:
            await member.move_to(ctx.author.voice.channel)
            await ctx.author.create_dm()
            await ctx.author.dm_channel.send(
                f'{c}) {member.name}'
            )
            c += 1
</code>
Главная проблема в том, чтобы проверять наличие людей постоянно, а не при вызове команды.

Вот вам полностю рабочий код, пользуйтесь)
<code>
import logging

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

class PrivateChannel(commands.Cog):
    def __init__(self, bot: commands.Bot) -> None:
        super().__init__()
        self.bot = bot
        self.all_channel = []

    @commands.Cog.listener()
    async def on_voice_state_update(self, member: discord.Member, before: discord.VoiceState, after: discord.VoiceState):

        category = int(config.category_id) # здесь айди категори в которой находиться канал с которого создается новый канал

        if after.channel is not None and member.voice.channel.id == int(config.voice_id) and member.voice.channel is not None: # тут int(config.voice_id) надо указать айди канала с которого будет создаваться новый канал и в него переноситься пользователь

            try:
                category_main: discord.CategoryChannel = get(member.guild.categories, id = category)
                channel: discord.VoiceChannel = await member.guild.create_voice_channel(name = f'Приватный ({member.display_name})', category = category_main)

                await channel.set_permissions(member, connect = True, mute_members = True, move_members = True, manage_channels = True, manage_roles = True)
                await member.move_to(channel)

                self.all_channel.append(channel.id)

            except Exception as e:
                logging.exception(e)

        elif after.channel is None and before.channel.id in self.all_channel and len(before.channel.members) == 0:

            try:

                del_channel: discord.VoiceChannel = get(member.guild.voice_channels, id = before.channel.id)
                await del_channel.delete()

            except Exception as e:
                logging.exception(e)

def setup(bot: commands.Bot):
    bot.add_cog(PrivateChannel(bot))
</code>


Как преобразовать строку в дату?
Есть строка text = "20170505151338", а на выходе хочу получить 2017-05-05 15:13:38
Использую библиотеку datetime, но у меня получается.

Использую библиотеку datetime, но у меня получается.

Если вы имели ввиду не получается с помощью
datetime, то вариант решения:

import datetime

text = "20170505151338"

date = datetime.datetime.strptime(text, '%Y%m%d%H%M%S')

print(date)

Если вам необходимо без
datetime:

text = "20170505151338"

date = (text[:4] + '-' + text[4:6] + '-' +
        text[6:8] + ' ' + text[8:10] +
        ':' + text[10:12] + ':' + text[12:])

print(date)


Работает только одна кнопка telebot
Пишу шоп-бота одноразак в Telegram, но работает только одна кнопка
<code>
import telebot
import config

from telebot import types

bot = telebot.TeleBot(config.TOKEN)

@bot.message_handler(commands=['start'])
def welcome(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    item1 = types.KeyboardButton("Арбуз 🍉")
    item2 = types.KeyboardButton("Виноград 🍇")
    item3 = types.KeyboardButton("Дыня 🍈")
    item4 = types.KeyboardButton("Персик 🍑")
    item5 = types.KeyboardButton("Манго 🥭")
    item6 = types.KeyboardButton("Ледяная Мята 🥶")

    markup.add(item1, item2, item3, item4, item5, item6)

    bot.send_message(message.chat.id, "Привет, {0.first_name}!😜\nВижу ты хочешь себе однаразку?🚬\nТогда тебе повезло с выбором магазина!🏬\n\nМы только начинаем свой бизнес, но надеюсь тебе понравится наш ассортимент🤑\n\nВыбирай вкус😋".format(message.from_user, bot.get_me()), reply_markup=markup)

@bot.message_handler(content_types=["text"])
def mes(message):
    if message.text == "Арбуз 🍉":
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        item1 = types.KeyboardButton("Проверить ✅")
        item2 = types.KeyboardButton("Отмена ❌")
        markup.add(item1, item2)
        bot.send_message(message.chat.id, "Вкус: Арбуз 🍉\nЦена: 200 руб\n------------------------\nОтправляй деньги на QIWI - AVITU611\nВ комментариях напиши свой ник TG\nДальше мы спросим у тебя как тебе отправить и куда\nА после уже отправим", reply_markup=markup)

@bot.message_handler(content_types=['text'])
def mes1(message):
    if message.text == "Дыня 🍈":
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        item1 = types.KeyboardButton("Проверить ✅")
        item2 = types.KeyboardButton("Отмена ❌")
        markup.add(item1, item2)
        bot.send_message(message.chat.id, "Вкус: Дыня 🍈\nЦена: 200 руб\n------------------------\nОтправляй деньги на QIWI - AVITU611\nВ комментариях напиши свой ник TG\nДальше мы спросим у тебя как тебе отправить и куда\nА после уже отправим", reply_markup=markup)
</code>

Попробуйте добавить обработчик кнопок по 'ключу', а также замените
ReplyKeyboardMarkup на
InlineKeyboardMarkup:

@bot.message_handler(commands=['start'])
def welcome(message):
    markup = types.InlineKeyboardMarkup()
    item1 = types.InlineKeyboardButton(text="Арбуз 🍉", callback_data='Арбуз')
    item2 = types.InlineKeyboardButton(text="Виноград 🍇",  callback_data='Виноград')
    # и т.д.
    markup.add(item1, item2)

    bot.send_message(message.chat.id, "Привет, {0.first_name}!😜\nВижу ты хочешь себе однаразку?🚬\nТогда тебе повезло с выбором магазина!🏬\n\nМы только начинаем свой бизнес, но надеюсь тебе понравится наш ассортимент🤑\n\nВыбирай вкус😋".format(message.from_user), reply_markup=markup)

Также лучше обработчик кнопок записать в одну функцию:

@bot.callback_query_handler(func = lambda call: True)
def mes(call):
    if call.data == "Арбуз":
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        item1 = types.KeyboardButton("Проверить ✅")
        item2 = types.KeyboardButton("Отмена ❌")
        markup.add(item1, item2)
        bot.send_message(call.message.chat.id, "Вкус: Арбуз 🍉\nЦена: 200 руб\n------------------------\nОтправляй деньги на QIWI - AVITU611\nВ комментариях напиши свой ник TG\nДальше мы спросим у тебя как тебе отправить и куда\nА после уже отправим", reply_markup=markup)
    elif call.data == "Дыня":
       print('Дыня')
    elif call.data == "Виноград":
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        item1 = types.KeyboardButton("Проверить ✅")
        item2 = types.KeyboardButton("Отмена ❌")
        markup.add(item1, item2)
        bot.send_message(call.message.chat.id, "Вкус Винограда и т.д.", reply_markup=markup)
    #И т. д.
    bot.answer_callback_query(callback_query_id=call.id)

Далее обрабатывайте нажатия из функции
@bot.callback_query_handler(func = lambda call: True):

@bot.message_handler(content_types=['text'])
def mes1(message):
    if message.text == "Проверить ✅":
        bot.send_message(message.chat.id, "ok")
    elif message.text == "Отмена ❌":
        bot.send_message(message.chat.id, 'no')

bot.polling()


Вывод словаря по индексу из списка
Имеется такой словарь и список:

groups = {
    "group1" : [
        77, 88, 99
    ],
    "group2" : [
        11, 22, 33, 44, 55, 66
    ],
    "group3" : [
        1, 2, 3, 4, 5
    ]
}
types = [True, False, True]
...
list = []

Как в
list записать все значения словаря по индексу, который соответствует значению
True из списка
types
В данном примере должно получиться
list = [77, 88, 99, 1, 2, 3, 4, 5]
У меня получается пока что только через if-ы реализовать

Если буквально по вопросу:

result = []

for add, value in zip(types, groups.values()):
    if add:
        result += value
# В одну строку:
# result = sum((value for add, value in zip(types, groups.values()) if add), [])

print(result)

Вариант, когда нужные ключи просто перечислены в списке (из комментариев к вопросу):

keys = ['group1', 'group3']

result = []

for key in keys:
    result += groups[key]
# В одну строку:
# result = sum((groups[key] for key in keys), [])

print(result)


Создание персональной роли при покупке
qq all! Я хочу реализовать покупку персональной роли за внутрисерверную валюту, которую в дальнейшем покупатель может изменить как хочет (цвет и название), но не знаю как реализовать ее привязывание к конкретному пользователю (нужно чтобы каждый, кто купил мог изменять свою роль, а не чужую).
Вот код, который я имею в данный момент.
<code>
@client.command(aliases= ['купить'])
async def __buy(ctx, product_number: int = None, member: discord.Member = None):
balance = cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]
customrole_successful_buy = discord.Embed(description =f"Вы успешно купили товар под номером 2 — <@&881981146588676166>. Чтобы кастомизировать свою роль — используйте команду .кастомизировать", timestamp=ctx.message.created_at)
customrole_successful_buy.colour = discord.Colour.from_rgb(r=52, g=203, b=35)
customrole_successful_buy.set_author(name=ctx.author.name, icon_url=ctx.author.avatar_url)
timesup = discord.Embed(description =f"@{ctx.author.name}, ваша кастомная роль истекла.", timestamp=ctx.message.created_at)
timesup.colour = discord.Colour.red()
timesup.set_author(name=ctx.author.name, icon_url=ctx.author.avatar_url)
if product_number is None:
    await ctx.send(embed = error)
else:
    if product_number == 2:
        if balance < 99:
            await ctx.send(embed = money)
        else:
            rolecreate = await ctx.guild.create_role(name="custom role")
            await ctx.author.add_roles(rolecreate)
            cursor.execute("UPDATE users SET cash = cash - 99 WHERE id = {}".format(ctx.author.id))
            connection.commit()
            await ctx.send(embed = customrole_successful_buy)

            await asyncio.sleep(32400)
            await ctx.author.remove_roles(rolecreate)
            await ctx.send(embed = timesup)

@client.command(aliases= ['кастом', 'кастомизировать'])
async def __custom(ctx, name, color, member: discord.Member = None):
тут должна быть проверка на существование роли у пользователя, но ее пока нет, потому что я не знаю как сделать привязку купленной роли к пользователю
</code>

Рабочая версия, которая мне нужна была.
<code>
@client.command(aliases= ['купить'])
async def __buy(ctx, product_number: int = None, member: discord.Member = None):
balance = cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]
    if product_number == 2:
        if balance < 99:
            await ctx.send(embed = money)
        else:
            rolecreate = await ctx.guild.create_role(name="custom role")
            await ctx.author.add_roles(rolecreate)
            cursor.execute("UPDATE users SET cash = cash - 99 WHERE id = {}".format(ctx.author.id))
            cursor.execute("INSERT INTO roles VALUES ({}, {})".format(ctx.author.id, rolecreate.id))
            connection.commit()
            await ctx.send(embed = customrole_successful_buy)

            await asyncio.sleep(10)
            if balance < 99:
                await ctx.author.remove_roles(rolecreate)
                await ctx.send(embed = timesup)
            else:
                cursor.execute("UPDATE users SET cash = cash - 99 WHERE id = {}".format(ctx.author.id))

@client.command(aliases= ['кастом', 'кастомизировать'])
async def __custom(ctx, name, color, member: discord.Member = None):
role_doesnt_exist = discord.Embed(description =f"У вас нет кастомной роли. Чтобы купить ее - используйте команду .купить 2 ", timestamp=ctx.message.created_at)
role_doesnt_exist.colour = discord.Colour.from_rgb(r=52, g=203, b=35)
role_doesnt_exist.set_author(name=ctx.author.name, icon_url=ctx.author.avatar_url)
roleexist = cursor.execute("SELECT roleid FROM roles WHERE id = {}".format(ctx.author.id)).fetchone()[0]
if roleexist == None:
    await ctx.send(embed = role_doesnt_exist)
else:
    roletake = discord.utils.get(ctx.guild.roles, id = (roleexist))
    await roletake.edit(colour=discord.Colour(int(color, 16)), name=name)
    roleid = roletake.id
    role_successful_changed = discord.Embed(description = f"Вы успешно изменили свою роль на <@&{roleid}>", timestamp=ctx.message.created_at)
    role_successful_changed.colour = discord.Colour.from_rgb(r=52, g=203, b=35)
    role_successful_changed.set_author(name=ctx.author.name, icon_url=ctx.author.avatar_url)
    await ctx.send(embed = role_successful_changed)
</code>


Как установить модуль android на python?
Делаю программу для андроидов с веб интерфейсом(использую eel + html/css/js), мне надо было узнать геолокацию пользователя, нашел рабочий код с модулем android. Установить не получилось(использую pip), сама ошибка:
<code>
ERROR: Could not find a version that satisfies the requirement android (from versions: none)
ERROR: No matching distribution found for android
</code>
Android устанавливается автоматически с kivy, но kivy я не использую и не собираюсь использовать. Есть ли возможность установить android через pip?

Способ уcтановить модуль
android есть:

pip install python-for-android

Но я пошел обходным путем: я использую
javascript (так как работаю с веб интерфейсом) и в
javascript есть встроенный модуль
navigator, а в нем функция:
geolocation.getCurrentPosition, который как раз и решает мою проблему. Спасибо всем, кто мне помог


Аналог root.after() в PyQt
Есть ли аналог функции
root.after() в библиотеке PyQt?
Если есть, то какой?
Если же нет, то как можно осуществить циклический вызов определенной функции?

Класс
QTimer предоставляет повторяющиеся и однократные таймеры.

...
    self.timer = QTimer()
    self.timer.setInterval(1000)                # Миллисекунды
    self.timer.timeout.connect(self.onClicked)
    self.timer.start()

def onClicked(self):
    ...


Какие есть способы преобразовать строку в список? [закрыт]

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

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

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

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

У меня есть строка:

'[1 , 2, 3, 4]'

как я могу преобразовать ее в список?

arr=[1,2,3,4]

Я бы сделал через
ast.literal_eval
Пример:

import ast

text = '[1 , 2, 3, 4]'
items = ast.literal_eval(text)
print(type(items), items)
# <class 'list'> [1, 2, 3, 4]


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

file.write(datetime.day)

TypeError: write() argument must be str, not getset_descriptor

import random
from datetime import datetime

norm_words = ["Хорошо", "хорошо" "Нормально", "нормально", "Прикольно", "прикольно", "Классно", "класно"]
norm_otvet = ["☆Это отлично! Я рада за вас", "☆Отличненько! У меня тоже всё хорошо", "☆Окей, это хорошо", "☆Поздравляю.", "☆Отлично, у меня тоже всё хорошо", "☆Молодец, а мне вот грустно("]

text = ''
while text != "stop":
    start = input("")

    if start in norm_words:
        print(random.choice(norm_otvet))
        with open("norm.txt", "a") as file:
            file.write(datetime.day)
    else:
        print("Что?")

import random
from datetime import datetime

norm_words = ["Хорошо", "хорошо" "Нормально", "нормально", "Прикольно", "прикольно", "Классно", "класно"]
norm_otvet = ["☆Это отлично! Я рада за вас", "☆Отличненько! У меня тоже всё хорошо", "☆Окей, это хорошо", "☆Поздравляю.", "☆Отлично, у меня тоже всё хорошо", "☆Молодец, а мне вот грустно("]

text = ''
while text != "stop":
    start = input("")
    now = datetime.now() # current date and time
    day = now.strftime("%d") # current day as string
    if start in norm_words:
        print(random.choice(norm_otvet))
        with open("norm.txt", "a") as file:
            file.write(day)
    else:
        print("Что?")


Не показываются кнопки vk_api
Пишу бота на Python, использую библиотеку vk_api
Столкнулся с проблемой - кнопки не показываются у пользователя (клавиатура бота). Подумал, что проблема в том, что я не включил возможности ботов в настройках группы VK, но после их включения кнопки всё равно не работают.
Что можно сделать и в чём может быть проблема?
<code>
import random
import time

import sqlite3

import vk_api
from vk_api import keyboard
from vk_api.longpoll import VkLongPoll, VkEventType

def write_msg(user_id, message):
    vk.method("messages.send", {"user_id": user_id, "message": message, "random_id":random.randint(1000000, 9000000000000)})

token = "token_for_vk_group"
vk = vk_api.VkApi(token=token)
longpoll = VkLongPoll(vk)
    #SE FUNCS
vkkeyboard = keyboard.VkKeyboard(one_time=False)
data = []
existcheck = []
allusers = []

sqlite_connection = sqlite3.connect("db.sqlite")
sqlite_cursor = sqlite_connection.cursor()
sqlite_cursor.execute("""CREATE TABLE IF NOT EXISTS'users' ( 'vkid' text );""")
for event in longpoll.listen():
   if event.type == VkEventType.MESSAGE_NEW and event.to_me:
      existcheck = sqlite_cursor.execute("""SELECT * FROM users WHERE vkid = ? ;""" , [event.user_id]).fetchone() or []
      if len(existcheck) > 0:
            write_msg(event.user_id, "Вы уже зарегистрировались")
            vkkeyboard.add_line()
            vkkeyboard.add_button("Картошка!", color='secondary', )

      if len(existcheck) == 0:
            sqlite_cursor.execute("""INSERT INTO users (vkid) VALUES (?);""", [event.user_id])
            sqlite_connection.commit()
            write_msg(event.user_id, "Вы зарегистрировались")

</code>

Вы не передавали
vkkeyboard в сообщении
Поменял функцию и явно передаю клавиатуру, пример:

def write_msg(user_id, message, keyboard=None):
    vk.method("messages.send", {"user_id": user_id, "message": message, "keyboard": keyboard, "random_id": random.randint(1000000, 9000000000000)})

...

vkkeyboard = keyboard.VkKeyboard(one_time=False)
vkkeyboard.add_line()
vkkeyboard.add_button("Картошка!", color='secondary')

...

      if len(existcheck) > 0:
          write_msg(event.user_id, "Вы уже зарегистрировались", vkkeyboard)


Интеграция liqpay-python
Решил попробовать изучить
liqpay-python, мне необходимо сгенерировать qr-код для оплаты и попытавшись выполнить код по оф. документации понял, что там мало подробностей да и возможно код вообще не рабочий, если кто знает прошу помочь мне.

Я попытался выполнять этот код взяв его же с оф. документации:

from liqpay import LiqPay

public_key = 'sandbox_i4...'
private_key = 'sandbox_h9...'

liqpay = LiqPay(public_key, private_key)
res = liqpay.api("request", {
"action"         : "payqr",
"version"        : "3",
"amount"         : "1",
"currency"       : "USD",
"description"    : "description text",
"order_id"       : "order_id_1"
})

При выполнении у меня произошла ошибка:

Возникло исключение: ImportError
cannot import name 'LiqPay' from 'liqpay' (C:\Users\Maxim\AppData\Local\Programs\Python\Python39\lib\site-packages\liqpay\__init__.py)
  File "C:\Users\Maxim\Desktop\g.py", line 1, in <module>
    from liqpay import LiqPay

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

Возникло исключение: NameError
name 'LiqPay' is not defined
  File "C:\Users\Maxim\Desktop\g.py", line 6, in <module>
    liqpay = LiqPay(public_key, private_key)

С использованием этого кода:

import liqpay

public_key = 'sandbox_'
private_key = 'sandbox_'

liqpay = LiqPay(public_key, private_key)
res = liqpay.api("request", {
"action"         : "payqr",
"version"        : "3",
"amount"         : "1",
"currency"       : "USD",
"description"    : "description text",
"order_id"       : "order_id_1"
})

Писать в поддержку LiqPay не имеет смысла ( так как они сами в этом не разбираются ), может кто знает как мне помочь?
Для тех кто попытается мне помочь, ссылка на документацию по использованию liqpay api - сслыка, ссылка на исходный код liqpay api в python - ссылка

Проблема, похоже, в том, что через
pip ставится не та версия, которая доступна через
GitHub, а урезанная, которая для
Python 2.x на самом деле.

> ls cp /usr/local/lib/python3.7/dist-packages/liqpay/

/usr/local/lib/python3.7/dist-packages/liqpay/:
__init__.py  liqpay.py  __pycache__/  test.py

> cat /usr/local/lib/python3.7/dist-packages/liqpay/liqpay.py

"""
LiqPay Python SDK
~~~~~~~~~~~~~~~~~
supports python 2.7.x version
requires requests module
"""
...

Но там вообще исходники маленькие, вы можете просто скачать их к себе из GitHub, выберите там версию, соответствующую вашей версии питона:

liqpay.py для Python 2
liqpay3.py для Python 3

И можете тогда либо попробовать подгрузить библиотеку из скачанного локального файла, либо прямо всё содержимое файла к себе закопипастить, оно довольно небольшое. При копипасте
LiqPay удаётся инстанциировать без вопросов, я пробовал в
Google Colab.


Как останавить telegram бота (aiogram) при любой ошибке?
Telegram бот написан на python при помощи библиотеки aiogram. Есть необходимость останавливать самого бота и закрывать программу при возникновении ошибок, которые касаются непосредственно библиотеки aiogram.
В качестве примера ошибки можно рассмотреть (
или любую другую которая возникает внутри библиотеки aiogram):

aiogram.utils.exceptions.TerminatedByOtherGetUpdates: Terminated by other getupdates request; make sure that only one bot instance is running
Если вкратце вот код:

from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
from config import TOKEN

if __name__ == '__main__':
    bot = Bot(token=TOKEN)
    dp = Dispatcher(bot)

    executor.start_polling(dp)

Пробовал оборачивать
executor.start_polling(dp) в конструкцию
try, except. Однако это не помогло ибо ошибка возникала внутри
executor.start_polling(dp) и тем самым не имела никакого влияния на
try, except главной функции.
Что необходимо сделать для остановки бота в случаем ошибки и закрытием самой программы?

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

Первым делом вам необходимо найти файл
exceptions.py в папке
utils с
aiogram, сделать это можно просто, к примеру создать специально какую-либо ошибку в боте, вам отобразится путь, найдете этот путь либо просто перейдете по нему ( нажав на подобную строчку в VS Code или в ином редакторе, если там имеется такая возможность ), у меня этот путь:

C:\Users\Maxim\AppData\Local\Programs\Python\Python39\Lib\site-packages\aiogram\utils

Открываете файл
exceptions.py затем изменяете вашу функцию
detect, которая по умолчанию будет иметь такой код:

def detect(cls, description):
        description = description.lower()
        for err in cls.__subclasses:
            if err is cls:
                continue
            if err.check(description):
                raise err(cls.text or description)
        raise cls(description)

Изменить свою функцию вы должны на этот код:

def detect(cls, description):
        description = description.lower()
        for err in cls.__subclasses:
            if err is cls:
                continue
            if err.check(description):
                os._exit(0)
                raise err(cls.text or description)
        os._exit(0)
        raise cls(description)

Также не стоит забывать, что необходимо импортировать и сам
os,

import os, для примера я решил написать такой вот код:

from aiogram import Bot, Dispatcher, executor

telegram_bot_token = 'YOUR TOKEN'

bot = Bot(token=telegram_bot_token)
dp = Dispatcher(bot)

@dp.message_handler(commands=['start'])
async def ff(message):
    await message.answer(
        text=''  # для создания ошибки, здесь не должно быть текста
    )

if __name__ == '__main__':
    executor.start_polling(dp)

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

raise err(cls.text or description)
aiogram.utils.exceptions.MessageTextIsEmpty: Message text is empty

Однако от этого появляется один минус, так как вы не знаете где именно произошла ошибка и на какой строке она была допущена, поэтому вы можете дописать перед двумя
os._exit(0) вот эту строку
print(cls.text or description), так вы и сможете понять с чем была связана ошибка и почему ваш код / бот перестал выполняться, дальше остается найти только саму строку и изменить её.
В итоге ваша функция
detect должна выглядеть следующим образом:

def detect(cls, description):
        description = description.lower()
        for err in cls.__subclasses:
            if err is cls:
                continue
            if err.check(description):
                print(cls.text or description)
                os._exit(0)
                raise err(cls.text or description)
        print(cls.text or description)
        os._exit(0)
        raise cls(description)


Разбираю пример кода, подскажите пожалуйста как поправить чтобы найти только красные LED с фото?
Разбираю пример кода, хочу его изменить чтобы искать красные источники света, с open cv опыта нет. Помогите пожалуйста куда вписать дополнительный фильтр цвета, если это возможно.
<code>
import numpy as np
import argparse
import cv2
import imutils
from imutils import contours
import skimage
from skimage import measure
import argparse

image = cv2.imread("2.jpg")

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (11, 11), 0)
thresh = cv2.threshold(blurred, 200, 255, cv2.THRESH_BINARY)[1]
thresh = cv2.erode(thresh, None, iterations=2)
thresh = cv2.dilate(thresh, None, iterations=4)

labels = measure.label(thresh, connectivity=1, background=0)
mask = np.zeros(thresh.shape, dtype="uint8")

for label in np.unique(labels):

    if label == 0:
        continue

    labelMask = np.zeros(thresh.shape, dtype="uint8")
    labelMask[labels == label] = 255
    numPixels = cv2.countNonZero(labelMask)

    if numPixels > 300:
        mask = cv2.add(mask, labelMask)

cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
    cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
cnts = contours.sort_contours(cnts)[0]

for (i, c) in enumerate(cnts):

    (x, y, w, h) = cv2.boundingRect(c)
    ((cX, cY), radius) = cv2.minEnclosingCircle(c)
    cv2.circle(image, (int(cX), int(cY)), int(radius),
        (0, 0, 255), 3)
    cv2.putText(image, "#{}".format(i + 1), (x, y - 15),
        cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)

cv2.imshow("Image", image)
cv2.waitKey(0)
</code>
Заранее спасибо!

Я так понимаю, что вы выделили контуры неких объектов в сером изображении. Если красное нужно искать среди этих объектов, то обойдите boundingRect каждого объекта попиксельно - в ИСХОДНОМ ЦВЕТНОМ изображении, конечно. Суммируйте R, G, B компоненты их каждой точки, в конце разделите на количество пикселов в прямоугольнике - так получите грубое усреднение цвета.
После этого посмотрите на соотношение среднего R и G, B компонентов в усреднённом цвете - красного должно быть больше. Для уверенности переведите RGB в HSV и проверьте, что оттенок H находится в красном диапазоне, и при этом величина S (насыщенность) не слишком мала


Error Code: 400 unsupported parse_mode, хотя тег закрыт
Возможно, дубль, но у меня, в отличие от оригинала тег закрыт. Дело в том, что когда я нажимаю на кнопку бота Telegram (код предоставлю ниже) появляется вот такая ошибка:

(__init__.py:652 MainThread) ERROR - TeleBot: "A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request: unsupported parse_mode"

Сам код кнопки:

    elif message.text == "McAfee 1 год":
        bot.send_message(message.chat.id,"Хороший выбор! McAfee 1 год стоит ",mcafee_price," рублей\nОписание: McAfee - это хороший антивирус, который сможет защитить как ваши мобильные устройства так и ваш ПК. У нас вы смоежете приобрести этот антивирус на один год и с безлимитным подключением устройств всего за ",mcafee_price," деревянных!")

У кнопки было вообще другое название изначально и все хорошо работало. Другие кнопки вполне хорошо работают.
Сам код, где храниться parse_mode:

bot.send_message(message.chat.id,"Добро пожаловать, {0.first_name}!\nЯ - <b>{1.first_name}</b>, бот для покупки софта, игр и различных подписок на разные сервисы".format(message.from_user, bot.get_me()),parse_mode='html',reply_markup=markup)

Вы в функцию отправки сообщения через запятую передаёте аргументы. Правильно так:
<code>
text = f"Хороший выбор! McAfee 1 год стоит {mcafee_price} рублей\n" \
       f"Описание: McAfee - это хороший антивирус, который сможет защитить как ваши " \
       f"мобильные устройства так и ваш ПК. У нас вы смоежете приобрести этот антивирус на " \
       f"один год и с безлимитным подключением устройств всего за {mcafee_price} деревянных!"
bot.send_message(message.chat.id, text)

</code>


преобразовать строку в int
У меня есть строка

s = "text"

я ее преобразовываю в hex

":".join("{:02x}".format(ord(c)) for c in s)

получаю строку

74:65:78:74

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

116:101:120:116

Конструктор класса
int позволяет передать вторым аргументом (
base) основание системы счисления. Вы можете воспользоваться этим, чтобы получить объект числа, а затем его строковое представление в десятичной системе.
Пример:

text = '74:65:78:74'

print(':'.join(str(int(h, 16)) for h in text.split(':')))

stdout:

116:101:120:116


Ошибка opencv python "label() got an unexpected keyword argument 'neighbors'" 'это стандратная строка, библиотека тоже работает почему у меня ошибка?
Работаю над кодом с использованием Open CV. Не понимаю почему у меня ошибка в стандартной строке
labels = measure.label(thresh, neighbors=8, background=0),
а именно

"Exception has occurred: TypeError label() got an unexpected keyword argument 'neighbors'"

import numpy as np
import argparse
import cv2
import imutils
from imutils import contours
import skimage
from skimage import measure
import argparse

ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", help = "path to the image file")
ap.add_argument("-r", "--radius", type = int,
    help = "radius of Gaussian blur; must be odd")
args = vars(ap.parse_args())
# load the image and convert it to grayscale
#image = cv2.imread(args["image"])
image = cv2.imread("2.jpg")

#image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (11, 11), 0)
thresh = cv2.threshold(blurred, 200, 255, cv2.THRESH_BINARY)[1]
thresh = cv2.erode(thresh, None, iterations=2)
thresh = cv2.dilate(thresh, None, iterations=4)
#print(image)

labels = measure.label(thresh, neighbors=8, background=0)
mask = np.zeros(thresh.shape, dtype="uint8")
# loop over the unique components
for label in np.unique(labels):
    #if this is the background label, ignore it
    if label == 0:
        continue
    # otherwise, construct the label mask and count the
    # number of pixels
    labelMask = np.zeros(thresh.shape, dtype="uint8")
    labelMask[labels == label] = 255
    numPixels = cv2.countNonZero(labelMask)
    # if the number of pixels in the component is sufficiently
    # large, then add it to our mask of "large blobs"
    if numPixels > 300:
        mask = cv2.add(mask, labelMask)
        cv2.imshow("Image", image)
        cv2.waitKey(0)

Заранее спасибо

Заходим в документацию и видим, что
neighbors устарел и нужно использовать
connectivity.


Как сделать так, чтобы бот телеграм отправлял значение переменной только мне
Всем привет. У меня есть генератор кода:
<code>
                payid = ''.join(random.choice(chars) for _ in range (15)) #генерируем сам код, который состоит из 15 символов
                print (payid) #пока оставлю для отладки
                bot.send_message(call.message.chat.id, 'Вот твоя ссылка на оплату: [ссылка позже].\nОбязательно в комментариях к оплате укажи этот код: ')
                bot.send_message(call.message.chat.id, payid)
</code>
хочу, чтобы бот отправлял сам код не только пользователю, а еще и мне.
Пример:
"Пользователь first_name сгенерировал вот такой payid: {payid}

Как я понял, надо после генерации кода добавить примерно так:
<code>
bot.send_message(мой ид, 'мой текст')
</code>
Работает.


как сделать, чтобы при закрытии окна готовой exe программы на Python c использованием eel при создании GUI убить процесс консольный? остаётся висеть
Сама суть вопроса в заголовке, добавлю только что консоль при создании через pyinstaller я скрыл(если это имеет значение)
Но впоследствии в процессах в диспетчере задач после закрытия окна программа остаётся висеть..
Как прописать в коде, чтобы при закрытии Gui окна, закрывался весь процесс программы?
Библиотеки используемые в коде:
<code>
import pyautogui as pg
import keyboard, eel, time
from threading import Thread
</code>
в процессе работы открываются потоки, есть предположение, что они остаются висеть после закрытия окна..
если да, то как сделать, чтобы при закрытии Windows окна программы они полностью закрывались?

необходимо в потоках указывать
daemon=True.
пример:

potok=Thread(target=f1,daemon=True)


Выводится только последняя буква переменной в с помощью random.choice
Проблема очень глупая, так как очень давно не программировал. Надеюсь, поможете, хоть проблема реально очень глупая.
Итак, есть у меня такой фрагмент кода:
<code>
chars = 'abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
        if call.message:
            if call.data == 'yes':
                for generatekey in range (15):
                    payid = random.choice(chars)
                    print (payid)
                bot.send_message(call.message.chat.id, 'Вот твоя ссылка на оплату: [ссылка позже].\nОбязательно в комментариях к оплате укажи этот код:' + payid)
</code>
Сам бот выдает только последнюю букву переменной payid, а компилятор выдает все буквы, но каждая буква через новую строку. Как можно исправить?

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

for generatekey in range (15):
    payid = random.choice(chars)
    print (payid)

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

payid = ''.join(random.choice(chars) for _ in range (15))
print (payid)


Как скачать изображения через rest api в папку
Таким запросом скачиваю изображение
<code>
os.mkdir(path+"files")
response = requests.get(".../rest/files/photos/1?token=" + str(to_python["token"]))
</code>
в response я так понимаю находится файл в двоичном формате. Как в созданную папку скачать или переместить файл?

Если в ответе на запрос приходит файл, тогда скачать его можно так:

open('file.jpg', 'wb').write(response.content)

А лучше так:

with open('file.jpg', 'wb') as f:
    f.write(response.content)


Изменение консольного вывода print() без использования cls
Такая проблема, в программе есть цикл ожидания определенных действий от пользователя. Пока программа ожидает выполнение этих действий, на экран выводится "Ожидание..."
print("Ожидание...")
чтобы пользователь не подумал, что программа зависла, надпись должна циклично изменяться, от
Ожидание... до
Ожидание.. и так по кругу. Понятное дело, что это можно реализовать через
os.system("cls"), но в таком случая вся надпись неприятно "мигает". Как сделать, чтобы перезаписывался не весь текст, а только точка в конце?

Можно использовать для этого символ
\r "возврат каретки". Вот в таком варианте, когда он в начале строки, это работает и в Google Colab. А так то если просто в терминале, то можно использовать и вариант с
end='\r':

import time

text = "Ожидание.."
flag = False

while True:
    print('\r' + text + ('.' if flag else ' '), end='')
    flag = not flag
    time.sleep(1)


Flask: ошибка при добавлении в модель зарузки картинок
Всем привет! Добавил в модель возможность загрузки файлов:
<code>
def picture_validation(form, field):
    if field.data:
    filename = field.data.filename
    if filename[-4:] != '.jpg':
        raise ValidationError('file must be .jpg')
    if imghdr.what(field.data) != 'jpeg':
        raise ValidationError('file must be a valid jpeg image.')
  field.data = field.data.stream.read()
  return True

form_columns = ['id','url_pic', 'pic']
column_labels = dict(id='ID', url_pic="Picture's URL", pic='Picture')

def pic_formatter(view, context, model, name):
    return 'NULL' if len(getattr(model, name)) == 0 else 'a picture'

column_formatters =  dict(pic=pic_formatter)
form_overrides = dict(pic= FileUploadField)
form_args = dict(pic=dict(validators=[picture_validation]))
</code>
Выдает такую ошибку:
File "/home/cyberz/projects/new_personal_site/nikitaklimov/app/app.py", line 96
filename = field.data.filename
^ IndentationError: expected an indented block
В чем проблема?
Спасибо.

Flask тут не при чём.

if field.data:
filename = field.data.filename

В следующей строке после
if должен быть отступ:

if field.data:
    filename = field.data.filename

Если в ошибке есть слово
indent,
indented,
indentation или ещё что-то однокоренное, то значит проблема в отступах - их или много, или мало, что-то не сходится.
В Питоне отступы обозначают блоки кода, они не могут быть произвольными.


Не выводится ascii_letters в telebot
Бот должен выдавать рандомное значение из ascii_letters, но почему-то этого не делает. Пытался вывести еще просто в print, но тоже не выходит. Несколько вариантов попробовал, но ничего не получается. Пока что остановился на:
<code>
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call, payid= (random.choice(ascii_letters))):
        if call.message:
            if call.data == 'yes':
                #payid += random.choice(ascii_letters)
                bot.send_message(call.message.chat.id,'Вот твоя ссылка на оплату: [ссылка позже].\nОбязательно в комментариях к оплате укажи этот код: ', payid)
            elif call.data == 'no':
                bot.send_message(call.message.chat.id,'Хорошо, заказ отменен')
</code>
Если есть ошибка в функции, то прошу прощения, так как больше ничего не смог придумать.

Чтобы получить случайную букву с
string
ascii_letters:

from string import ascii_letters
from random import choice

random_letter = choice(ascii_letters)
print(random_letter) # OUTPUT: P

Вы передаёте
payid= (random.choice(ascii_letters)) в качестве принимающего параметра функции
callback_inline

Чтобы получить менее желаемый результат необходимо написать:

@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
        if call.message:
            if call.data == 'yes':
                payid = choice(ascii_letters)  # Letter in payid
                bot.send_message(call.message.chat.id, f'Вот твоя ссылка на оплату: [ссылка позже].\nОбязательно в комментариях к оплате укажи этот код: {payid}')
            elif call.data == 'no':
                bot.send_message(call.message.chat.id,'Хорошо, заказ отменен')

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

from random import randint

random_digit = randint(0, 999)
print(random_digit) # OUTPUT: 105

Подробнее о string и random читайте в оф. документациях..


Как в этом блоке скрыть кнопки после нажатия?
Как в этом блоке скрыть кнопки после нажатия одной из них?
<code>
@bot.message_handler(commands=['start'])
def start_command(message):
    markup = types.InlineKeyboardMarkup(row_width=1)

    item1 = types.InlineKeyboardButton('CV', callback_data='CV')
    item2 = types.InlineKeyboardButton('Vacancy', callback_data='Vacancy')

    markup.add(item1)
    markup.add(item2)

    bot.send_message(message.chat.id, "What would you like to create:", reply_markup=markup)

обработчик

@bot.callback_query_handler(func=lambda call: call.data in ['CV', 'Vacancy'])
def callback_inline(call):
    try:
        if call.message:
            if call.data == 'CV':
                markup = types.InlineKeyboardMarkup(row_width=4)

                item1 = types.InlineKeyboardButton('Development (Frontend, backend, full-stack, mobile, web, gamedev)',callback_data='Development')
                item2 = types.InlineKeyboardButton('Testing ',callback_data='Testing')
                item3 = types.InlineKeyboardButton('DevOps/Admin',callback_data='DevOps')
                item4 = types.InlineKeyboardButton('Data Science ',callback_data='Data Science')
                item5 = types.InlineKeyboardButton('TOP Management (CTO, CIO, Director) ',callback_data='TOP')
                item6 = types.InlineKeyboardButton('Support, Helpdesk',callback_data='Support')
                item7 = types.InlineKeyboardButton('PR, marketing, advertising',callback_data='PR')
                item8 = types.InlineKeyboardButton('Project/Product manager,HR',callback_data='Project')
                item9 = types.InlineKeyboardButton('Design',callback_data='Design')

                markup.add(item1)
                markup.add(item2,item3,item4)
                markup.add(item5)
                markup.add(item6,item7,item9)
                markup.add(item8,item8)

                bot.send_message(call.message.chat.id, "CV - Choose a specialization :", reply_markup=markup)

            elif call.data == 'Vacancy':
                markup = types.InlineKeyboardMarkup(row_width=1)

                item1 = types.InlineKeyboardButton('less then $1000', callback_data='less')

                markup.add(item1)

                bot.send_message(call.message.chat.id, "Your budget($):", reply_markup=markup)
                bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="What would you like to create")
    except Exception as e:
        print(repr(e))
</code>

Решений два: либо при отправке сообщения не передавать клавиатуру вовсе (reply_markup), либо удалять сообщение, на которое кликнули, целиком.


Как запретить отправлять определенные типы смс telebot Python?
Как можно запретить отправлять любой тип сообщений кроме текста?
Просто у меня есть форма регистрации которая при отправке любого вида сообщения кроме текста крашит бота. Ну и мне приходится его вручную поднимать. Хотел бы просто запретить любые типы кроме текста, так как всё равно ничего кроме текста в бот отправляться не будет.
Если интересно, то вот код регистрации:
<code>
@bot.message_handler(content_types=['text'])
def register(message):
    if message.text == '/reg':
        global userID
        global username
        userID = message.from_user.id
        username = message.from_user.username
        bot.send_message(message.from_user.id, "Введите Ваше имя.")
        bot.register_next_step_handler(message, get_name)  # следующий шаг – функция get_name

def get_name(message):  # Получаем имя
    global name
    name = message.text
    bot.send_message(message.from_user.id, 'Введите Вашу фамилию.')
    bot.register_next_step_handler(message, get_surname)

def get_surname(message):  # Получаем фамилию
    global surname
    surname = message.text
    bot.send_message(message.from_user.id, 'Введите Ваш возраст.')
    bot.register_next_step_handler(message, get_age)

def get_age(message):  # Получаем возраст
    global age
    age = message.text
    if age.isnumeric():
        bot.send_message(message.from_user.id, 'Введите Ваш дискорд.')
        bot.register_next_step_handler(message, get_discord)
    else:
        bot.send_message(message.from_user.id, 'Цифрами, пожалуйста!')
        bot.register_next_step_handler(message, get_age)

def get_discord(message):  # Получаем дискорд
    global discord
    discord = message.text
    keyboard = types.InlineKeyboardMarkup()
    key_yes = types.InlineKeyboardButton(text='Да', callback_data='yes')
    keyboard.add(key_yes)
    key_no = types.InlineKeyboardButton(text='Нет', callback_data='no')
    keyboard.add(key_no)
    question = "Подведем итоги. Вас зовут " + name + " " + surname + ", Вам " + str(
        age) + " лет. Ваш дискорд: " + discord + ". Если всё верно, то подтвердите это нажав 'ДА' снизу."
    bot.send_message(message.from_user.id, text=question, reply_markup=keyboard)    ```
</code>

Очень просто. Перед обработкой поставьте условие на проверку текста в сообщении.
<code>
def get_name(message):  # Получаем имя
    global name
    if message.text is None:
        bot.send_message(message.from_user.id, 'Сообщение должно быть текстом!')
        return None

    ...

</code>


как увести все кнопки в 1 сообщение
Пишу бота и возник вопрос как сделать так чтобы по нажатию любой из кнопок меня перекидывало в одно сообщение чтобы не расписывать его так. Если кто знает как изменить цвет этим кнопкам?
<code>
def callback_inline(call):
    try:
        if call.message:
            if call.data == 'CV':
                markup = types.InlineKeyboardMarkup(row_width=4)

                item1 = types.InlineKeyboardButton('Development (Frontend, backend, full-stack, mobile, web, gamedev)',callback_data='Development')
                item2 = types.InlineKeyboardButton('Testing ',callback_data='Testing')
                item3 = types.InlineKeyboardButton('DevOps/Admin',callback_data='DevOps')
                item4 = types.InlineKeyboardButton('Data Science ',callback_data='Data Science')
                item5 = types.InlineKeyboardButton('TOP Management (CTO, CIO, Director) ',callback_data='TOP')
                item6 = types.InlineKeyboardButton('Support, Helpdesk',callback_data='Support')
                item7 = types.InlineKeyboardButton('PR, marketing, advertising',callback_data='PR')
                item8 = types.InlineKeyboardButton('Project/Product manager,HR',callback_data='Project')
                item9 = types.InlineKeyboardButton('Design',callback_data='Design')

                markup.add(item1)
                markup.add(item2,item3,item4)
                markup.add(item5)
                markup.add(item6,item7,item9)
                markup.add(item8,item8)

                bot.send_message(call.message.chat.id, "CV - Choose a specialization :", reply_markup=markup)

            elif call.data == 'Vacancy':
                markup = types.InlineKeyboardMarkup(row_width=1)

                item1 = types.InlineKeyboardButton('less then $1000', callback_data='less')

                markup.add(item1)

                bot.send_message(call.message.chat.id, "Your budget($):", reply_markup=markup)
                bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="What would you like to create")
    except Exception as e:
        print(repr(e))

@bot.callback_query_handler(func=lambda call: call.data in ['Development','Testing','DevOps','Data Science','TOP','Support','PR','Project','Design'])
def callback(call):
    try:
        if call.message:
            if call.data == 'Development':
                markup = types.InlineKeyboardMarkup(row_width=4)

                item1 = types.InlineKeyboardButton('Junior',callback_data='Junior')
                item2 = types.InlineKeyboardButton('Middle',callback_data='Middle')
                item3 = types.InlineKeyboardButton('Senior',callback_data='Senior')
                item4 = types.InlineKeyboardButton('Teamlead',callback_data='Teamlead')

                markup.add(item1,item2)
                markup.add(item3,item4)

                bot.send_message(call.message.chat.id, "Role (Level):", reply_markup=markup)
                bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="CV - Choose a specialization")

            if call.data == 'Testing':
                markup = types.InlineKeyboardMarkup(row_width=4)

                item1 = types.InlineKeyboardButton('Junior',callback_data='Junior')
                item2 = types.InlineKeyboardButton('Middle',callback_data='Middle')
                item3 = types.InlineKeyboardButton('Senior',callback_data='Senior')
                item4 = types.InlineKeyboardButton('Teamlead',callback_data='Teamlead')

                markup.add(item1,item2)
                markup.add(item3,item4)

                bot.send_message(call.message.chat.id, "Role (Level):", reply_markup=markup)
                bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="CV - Choose a specialization")

            if call.data == 'DevOps':
                markup = types.InlineKeyboardMarkup(row_width=4)

                item1 = types.InlineKeyboardButton('Junior',callback_data='Junior')
                item2 = types.InlineKeyboardButton('Middle',callback_data='Middle')
                item3 = types.InlineKeyboardButton('Senior',callback_data='Senior')
                item4 = types.InlineKeyboardButton('Teamlead',callback_data='Teamlead')

                markup.add(item1,item2)
                markup.add(item3,item4)

                bot.send_message(call.message.chat.id, "Role (Level):", reply_markup=markup)
                bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="CV - Choose a specialization")

            if call.data == 'Data Science':
                markup = types.InlineKeyboardMarkup(row_width=4)

                item1 = types.InlineKeyboardButton('Junior',callback_data='Junior')
                item2 = types.InlineKeyboardButton('Middle',callback_data='Middle')
                item3 = types.InlineKeyboardButton('Senior',callback_data='Senior')
                item4 = types.InlineKeyboardButton('Teamlead',callback_data='Teamlead')

                markup.add(item1,item2)
                markup.add(item3,item4)

                bot.send_message(call.message.chat.id, "Role (Level):", reply_markup=markup)
                bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="CV - Choose a specialization")

            if call.data == 'TOP':
                markup = types.InlineKeyboardMarkup(row_width=4)

                item1 = types.InlineKeyboardButton('Junior',callback_data='Junior')
                item2 = types.InlineKeyboardButton('Middle',callback_data='Middle')
                item3 = types.InlineKeyboardButton('Senior',callback_data='Senior')
                item4 = types.InlineKeyboardButton('Teamlead',callback_data='Teamlead')

                markup.add(item1,item2)
                markup.add(item3,item4)

                bot.send_message(call.message.chat.id, "Role (Level):", reply_markup=markup)
                bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="CV - Choose a specialization")

            if call.data == 'Support':
                markup = types.InlineKeyboardMarkup(row_width=4)

                item1 = types.InlineKeyboardButton('Junior',callback_data='Junior')
                item2 = types.InlineKeyboardButton('Middle',callback_data='Middle')
                item3 = types.InlineKeyboardButton('Senior',callback_data='Senior')
                item4 = types.InlineKeyboardButton('Teamlead',callback_data='Teamlead')

                markup.add(item1,item2)
                markup.add(item3,item4)

                bot.send_message(call.message.chat.id, "Role (Level):", reply_markup=markup)
                bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="CV - Choose a specialization")

            if call.data == 'PR':
                markup = types.InlineKeyboardMarkup(row_width=4)

                item1 = types.InlineKeyboardButton('Junior',callback_data='Junior')
                item2 = types.InlineKeyboardButton('Middle',callback_data='Middle')
                item3 = types.InlineKeyboardButton('Senior',callback_data='Senior')
                item4 = types.InlineKeyboardButton('Teamlead',callback_data='Teamlead')

                markup.add(item1,item2)
                markup.add(item3,item4)

                bot.send_message(call.message.chat.id, "Role (Level):", reply_markup=markup)
                bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="CV - Choose a specialization")

            if call.data == 'Project':
                markup = types.InlineKeyboardMarkup(row_width=4)

                item1 = types.InlineKeyboardButton('Junior',callback_data='Junior')
                item2 = types.InlineKeyboardButton('Middle',callback_data='Middle')
                item3 = types.InlineKeyboardButton('Senior',callback_data='Senior')
                item4 = types.InlineKeyboardButton('Teamlead',callback_data='Teamlead')

                markup.add(item1,item2)
                markup.add(item3,item4)

                bot.send_message(call.message.chat.id, "Role (Level):", reply_markup=markup)
                bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="CV - Choose a specialization")

            if call.data == 'Design':
                markup = types.InlineKeyboardMarkup(row_width=4)

                item1 = types.InlineKeyboardButton('Junior',callback_data='Junior')
                item2 = types.InlineKeyboardButton('Middle',callback_data='Middle')
                item3 = types.InlineKeyboardButton('Senior',callback_data='Senior')
                item4 = types.InlineKeyboardButton('Teamlead',callback_data='Teamlead')

                markup.add(item1,item2)
                markup.add(item3,item4)

                bot.send_message(call.message.chat.id, "Role (Level):", reply_markup=markup)
                bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="CV - Choose a specialization")

    except Exception as e:
        print(repr(e))

</code>

Основная проблема в том, что у Вас много ненужного и повторяющегося кода, который лучше вывести в отдельные функции, например.
Вы можете передать в функцию edit_text клавиатуру, и Вам не нужно по новой её отправлять.
Вот, оптимизировал Ваш код и все изменения будут по нажатию на кнопку будут происходить в одном сообщении, вместо отправки каждый раз нового.
От себя советую посмотреть и понять, что изменено, чтобы в следующий раз сэкономить лишние строки.
<code>
def get_positions_keyboard() -> types.InlineKeyboardMarkup:
    markup = types.InlineKeyboardMarkup(row_width=4)

    item1 = types.InlineKeyboardButton(
        'Development (Frontend, backend, full-stack, mobile, web, gamedev)',
        callback_data='Development')
    item2 = types.InlineKeyboardButton('Testing ', callback_data='Position:Testing')
    item3 = types.InlineKeyboardButton('DevOps/Admin', callback_data='Position:DevOps')
    item4 = types.InlineKeyboardButton('Data Science ', callback_data='Position:Data Science')
    item5 = types.InlineKeyboardButton('TOP Management (CTO, CIO, Director) ',
                                       callback_data='Position:TOP')
    item6 = types.InlineKeyboardButton('Support, Helpdesk', callback_data='Position:Support')
    item7 = types.InlineKeyboardButton('PR, marketing, advertising',
                                       callback_data='Position:PR')
    item8 = types.InlineKeyboardButton('Project/Product manager,HR',
                                       callback_data='Position:Project')
    item9 = types.InlineKeyboardButton('Design', callback_data='Position:Design')

    return markup.add(item1, item2, item3, item4, item5, item5, item6, item7, item8, item9)

def get_vacancies_keyboard() -> types.InlineKeyboardMarkup:
    markup = types.InlineKeyboardMarkup(row_width=1)
    return markup.add(types.InlineKeyboardButton('less then $1000', callback_data='less'))

def get_levels_keyboard() -> types.InlineKeyboardMarkup:
    markup = types.InlineKeyboardMarkup(row_width=4)

    item1 = types.InlineKeyboardButton('Junior', callback_data='Junior')
    item2 = types.InlineKeyboardButton('Middle', callback_data='Middle')
    item3 = types.InlineKeyboardButton('Senior', callback_data='Senior')
    item4 = types.InlineKeyboardButton('Teamlead', callback_data='Teamlead')

    return markup.add(item1, item2, item3, item4)

@bot.callback_query_handler(func=lambda call: call.data == 'CV')
def cv_handler(call: types.CallbackQuery):
    keyboard = get_positions_keyboard()

    bot.send_message(call.message.chat.id, "CV - Choose a specialization :", reply_markup=keyboard)

@bot.callback_query_handler(func=lambda call: call.data == 'Vacancy')
def vacancy_handler(call: types.CallbackQuery):
    keyboard = get_vacancies_keyboard()
    text = "What would you like to create\n" \
           "Your budget($):"
    bot.edit_message_text(chat_id=call.message.chat.id,
                          message_id=call.message.message_id,
                          text="What would you like to create")

@bot.callback_query_handler(func=lambda call: call.data.startswith('Position:'))
def position_handler(call: types.CallbackQuery):
    position_data = call.data.split(':')[0]  # Development, Testing, DevOps, etc.
    text = "CV - Choose a specialization\n" \
           "Role (Level):"
    keyboard = get_levels_keyboard()
    bot.edit_message_text(chat_id=call.message.chat.id,
                          message_id=call.message.message_id,
                          text=text)
</code>


Python. Цикл for. где ошибка в коде?
'''Задача «Потерянная карточка»
Условие
Для настольной игры используются карточки с номерами от 1 до N. Одна карточка потерялась.
Найдите ее, зная номера оставшихся карточек.
Дано число N, далее N − 1 номер оставшихся карточек (различные числа от 1 до N).
Программа должна вывести номер потерянной карточки.
есть иное решение в интернете, но я пытался делать по своему. А так не работает'''
<code>
sum1=0
sum2=0
n = int(input())
for j in range(int(input())):
    sum2 += j
for i in range(1, n + 1):
    sum1 += i
print(sum1-sum2)
</code>

Данный фрагмент кода верный, то есть вы складываете числа в промежутке от 1 до
n + 1

for i in range(1, n + 1):
    sum1 += i

Но:

for j in range(int(input())):
    sum2 += j

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

for i in range(n - 1):
    num = int(input()) # вводим известные числа до n - 1

Чтобы найти неизвестное число, можно вычитать
sum1 (все числа в промежутке до n включительно) из известных чисел и получить потерянное число:

sum1 = 0

n = int(input())

for j in range(1, n + 1):
    sum1 += j # складываем значения итераций от 1 до n включительно

for i in range(n - 1):
    sum1 -= int(input()) # вычитаем из вводимых чисел значения в промежутке n - 1, так как потерянного числа нет

print(sum1)


Почему не хочет загружаться библиотека pyautogui?
Хотел написать программу, которая сама будет запускать приложение Discord, но при попытке запустить код выдаёт ошибку:
D:\python.exe D:/pythonProject2/main.py
Traceback (most recent call last):
File "D:\pythonProject2\main.py", line 1, in
import pyautogui
ModuleNotFoundError: No module named 'pyautogui'
Process finished with exit code 1
Вот моя программа:
<code>
import pyautogui
pyautogui.hotkey('Win')
pyautogui.typewrite('Discord')
pyautogui.PAUSE = 5
pyautogui.keyDown('Enter')
</code>

Надо скачать саму библиотеку. Открой cmd и введи:
pip install pyautogui
Или же можно нажать в Pycharm’е (если им пользуешься) кнопку Terminal снизу прям и ввести то же самое


Программа выдает ошибку TypeError: load_model() takes 0 positional arguments but 1 was given
в pycharm при вызове

from tensorflow.python.keras.models import load_model

mod = load_model('C:\project\detected_trend.h5')

выдает ошибку TypeError: load_model() takes 0 positional arguments but 1 was given
при аналогичном запуске в anaconda navigator все работает нормально.

Оформлю, пожалуй, ответом, вдруг кому пригодится.
Если вы видите странную ошибку, говорящую вам, что вы вызываете библиотечную или встроенную функцию как-то неправильно, хотя согласно документации вы должны её вызывать именно так - с тем набором аргументов, с которым вы её вызываете, то проверьте ваш код, возможно, вы описали в нём свою функцию (или переменную, но тогда ошибка будет другая) с точно таким же названием.
В питоне это довольно типичная проблема, вы можете перекрыть своей функцией или переменной встроенную или загруженную из библиотеки функцию и узнаете об этом только по странной ошибке в момент вызова этой функции. В компилируемых языках такие проблемы обычно выявляются уже на этапе компиляции, компилятор вам так просто не даст назвать одинаково разные сущности.


Поиск подстроки в начале и конце строки с помощью регулярного выражения
Задача:
Имеется игра «Саймон говорит». Инструктор «Саймон» говорит, что должны делать игроки в инструкции. Напишите функцию, которая принимает строку с инструкциями:

Если она начинается или заканчивается словами "Simon says";

Ваша функция должна возвращать строку "I" плюс то, что вы бы сделали: сами инструкции;

В противном случае верните "I won't do it!" .

Вы НЕ должны обрабатывать ввод или вызывать свою функцию, просто реализуйте ее.
С помощью regex101.com я описала первую часть функции:

^\s*(Simon says)

фраза начинается с "Simon says";

(Simon says)\s*$

фраза заканчивается "Simon says"

Но...я не знаю, как их вместе слепить😆😆😆 Как мне их объединить, чтоб корректно работали?!
Код целиком с корявым регулярным выражением:

import re
phrase = r"^\s*(Simon says)(тут должно что-то быть) (Simon says)\s*$"
def what_to_do(instructions):
    if bool(re.fullmatch(phrase, instructions)):
        return("I" + instructions)
    else:
        return("I won't do it!")

Вам не обязательно использовать регулярные выражения, чтобы выполнить эту задачу. Вы можете использовать методы строк
.startswith() и
.endswith():

def what_to_do(instructions):
  if instructions.startswith("Simon says"):
    return("I " + instructions[10:])
  elif instructions.endswith("Simon says"):
    return("I " + instructions[:-10])
  else:
      return("I won't do it!")

print(what_to_do("Simon says jump!"))
print(what_to_do("Please, jump!"))

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

import re

r = "(Simon says .*)|(.* Simon says)"

def what_to_do(instructions):
    if bool(re.fullmatch(r, instructions)):
        return("I " + re.sub("\s*Simon says\s*", "", instructions))
    else:
        return("I won't do it!")

print(what_to_do("Simon says jump!"))
print(what_to_do("Please, jump!"))

Объяснение регулярного выражения:

(Simon says .*)|(.* Simon says)

Структура
()|() - выполняется условие либо в первой скобке, либо во второй.

*. - Любое количество любых символов, в том числе и пробельных.