• Как узнать id роли?

    Vindicar
    @Vindicar
    RTFM!
    Задай параметру команды type hint discord.Role, и discord.py автоматически заменит его на объект Role. У этого объекта есть параметр id.
    Ответ написан
    Комментировать
  • Выдаёт ошибку в боте для тг, не получается вызвать функцию, как это починить?

    Vindicar
    @Vindicar
    RTFM!
    Уф. Тут очень много проблем. В первую очередь с пониманием того, как выполняется скрипт на питоне, и областей видимости.
    Для начала:
    if call.data == "yes":
          bot.send_message(call.message.chat.id, "Отлично")
          game = True

    Ты присваиваешь значение локальной переменной game, а не глобальной, которую ты описал выше.
    Далее:
    if game == True:
      def play(message):
        ...
    else:
      bot.send_message(message.from_user.id, "Напиши /reg")

    Ты понимаешь, что этот код объявлен вне функции? Как следствие, он выполнится один раз, при старте скрипта. У тебя game в этот момент не будет равно True, и функция play() не будет определена.

    Боты - это не простая тема, а боты с автоматами состояний - тем более. Поучи Питон сначала, кроме шуток.
    Ответ написан
    Комментировать
  • Python, OpenCV, tkinter все окна в одном, как реализовать?

    Vindicar
    @Vindicar
    RTFM!
    Ну так собери изображения в одно, в чём проблема?
    Пусть ты хочешь сделать такую сетку:
    A B
    C D

    Тогда ширина итогового изображения R будет max(A.shape[1]+B.shape[1], C.shape[1]+D.shape[1]), а высота max(A.shape[0]+C.shape[0], B.shape[0]+D.shape[0])
    Отступ по X для изображений B и D будет max(A.shape[1], C.shape[1]), отступ по Y для C и D будет max(A.shape[0], B.shape[0]).
    Ну а перенос прямоугольной области из массива в массив в numpy делается тривиально.
    R[0:A.shape[0], 0:A.shape[1]] = A
    R[0:B.shape[0], X:X+B.shape[1]] = B
    R[Y:Y+C.shape[0], 0:C.shape[1]] = C
    R[Y:Y+D.shape[0], X:X+D.shape[1]] = D
    Ответ написан
    Комментировать
  • Python exception, какой будет правильным?

    Vindicar
    @Vindicar
    RTFM!
    Ничерта не понял, но попробую ответить.
    1. не используй except без указания исключения, используй хотя бы except Exception - исключение по Ctrl-C (KeyboardInterrupt) не наследуется от Exception и не будет поймано. Указывать pass тоже не лучшая идея - логгируй возникающие исключения, чтобы ты мог потом устранить их причины.
    1а. waitKey() возвращает код нажатой клавиши. Сравнивай его с кодом Esc (27) и выходи из цикла так.
    2. Если нужно оперировать соседними элементами коллекции, загони её в список (если это не список) и итерируйся по индексам, а не по коллекции.
    Или for i in range(len(spisok_csv)): или for i, s in enumerate(spisok_csv):
    Ответ написан
  • Почему при нажатий Enter просто нет ответа?

    Vindicar
    @Vindicar
    RTFM!
    Гуглить не пробовал? "html submit form on enter" быстренько выводит на нужный код.
    <input type="submit" hidden />
    Причина - форма отправится без JS только если в ней есть элемент с типом submit. Но эта кнопка может быть и скрытой, на нажатие Enter это не повлияет - лишь бы она присутствовала.
    К слову, исходник формы ты не привел.
    Ответ написан
    Комментировать
  • Python Почему sqlite3 дублирует запрос?

    Vindicar
    @Vindicar
    RTFM!
    Если ту не установил первичный ключ для таблицы, в ней могут быть одинаковые записи.
    Ответ написан
  • Можно ли зделать свою команду в командной строке linux?

    Vindicar
    @Vindicar
    RTFM!
    1. Добавь в начало файла шебанг, т.е. строку вида
    #!/usr/bin/env python
    Чтобы при запуске файла было понятно, чем его открывать
    2. Переименуй файл в add (без расширения) и сделай его исполняемым командой chmod +x add
    3. Либо помести файл в один из каталогов в переменной окружения PATH, либо добавь каталог, в котором файл лежит, в PATH.
    Загляни в скрытый файл .profile в твоём домашнем каталоге, он как раз этим занимается. Он может быть настроен так, чтобы автоматически добавлять в PATH каталог bin в твоем домашнем каталоге, тогда просто создай этот каталог и закинь файл туда.
    Ответ написан
    Комментировать
  • Flask - как получить последнюю запись из БД?

    Vindicar
    @Vindicar
    RTFM!
    Ты неправильно ставишь вопрос. Тебе нужно найти запись для car_id, у которой time_end - NULL.
    Такая запись всё равно должна быть максимум одна, иначе у тебя БД содержит противоречивую информацию.
    Это можно попробовать предотвратить unique-индексом по полям car_id, time_end. Тогда у тебя не получится создать ещё одну запись с time_end = NULL, если одна уже существует для такого car_id.
    Ответ написан
  • Есть ли библиотека на Go позволяющая добавить значок на панель задач Windows 10?

    Vindicar
    @Vindicar
    RTFM!
    Роман Денискин, так, набросал пример на Питоне, так как Go не владею. Надеюсь, покажет, какие функции WinAPI использовать. Проблема в том, что твоё окно на панели задач придётся позиционировать вручную, а уж чтобы пользователь мог его таскать по панели задач... дикая морока.

    Можно покопаться в COM-интерфейсах панели задач. DeskBands вроде ближе к твоим потребностям, но по-моему от них отказались.

    код

    # -*- coding: utf-8 -*-
    import typing as t
    import tkinter as tk
    import ctypes
    import ctypes.wintypes as w
     
    def ErrorIfZero(result, func, args):
        if not result:
            raise ctypes.WinError(ctypes.get_last_error())
        return result
     
    # используем user32.dll
    user32 = ctypes.windll.user32
    # описываем используемые функции, типы и константы 
    WNDENUMPROC = ctypes.WINFUNCTYPE(w.BOOL, w.HWND, w.LPARAM)
     
    user32.EnumWindows.argtypes = [WNDENUMPROC, w.LPARAM]
    user32.EnumWindows.restype = w.BOOL
    user32.GetClassNameW.argtypes = [w.HWND, w.LPWSTR, w.INT]
    user32.GetClassNameW.restype = w.INT
    user32.GetClassNameW.errcheck = ErrorIfZero
    user32.GetWindowLongW.argtypes = [w.HWND, w.INT]
    user32.GetWindowLongW.restype = w.DWORD
    user32.SetWindowLongW.argtypes = [w.HWND, w.INT, w.LONG]
    user32.SetWindowLongW.restype = w.DWORD
    user32.SetWindowPos.argtypes = [w.HWND, w.HWND, w.INT, w.INT, w.INT, w.INT, w.UINT]
    user32.SetWindowPos.restype = w.BOOL
    user32.SetWindowPos.errcheck = ErrorIfZero
    user32.SetParent.argtypes = [w.HWND, w.HWND]
    user32.SetParent.restype = w.HWND
    user32.GetParent.argtypes = [w.HWND]
    user32.GetParent.restype = w.HWND
     
    GWL_STYLE = w.INT(-16)
    WS_CHILD = 0x40000000
    SWP_NOACTIVATE = 0x0010
    SWP_NOZORDER = 0x0004
    SWP_SHOWWINDOW = 0x0040
     
     
    # определяем дескриптор окна панели задач
    def get_taskbar_window() -> w.HWND:
        class_buf = ctypes.create_unicode_buffer(256)
        handle: w.HWND = 0
        
        #callback - функция будет проверять каждое окно
        def process_window(hWnd: w.HWND, lParam: w.LPARAM) -> w.BOOL: 
            length = user32.GetClassNameW(hWnd, class_buf, len(class_buf))
            name = ''.join(class_buf[:length])
            if 'Shell_TrayWnd' == name: # имя класса окна панели задач всегда "Shell_TrayWnd"
                nonlocal handle
                handle = hWnd
                return 0 # нашли, стоп
            return 1 # не нашли, идём дальше
        # перебираем окна верхнего уровня
        user32.EnumWindows(WNDENUMPROC(process_window), 0)
        if handle == 0:
            raise ValueError('Taskbar not found')
        return handle
     
     
    def make_attachment() -> tk.Tk: #создаём простое окно
        root = tk.Tk()
        
        def button_command():
            print('Bye!')
            root.destroy()
        
        item = tk.Button(root, text='Hello, World!', command=button_command)
        item.pack(expand=True, fill='both')
        return root
     
     
    def attach(root: tk.Tk, hTaskbar: w.HWND):
        hTop: w.HWND = user32.GetParent(w.HWND(root.winfo_id())) #дескриптор окна верхнего уровня для нашего приложения
        user32.SetParent(hTop, hTaskbar) #задаём родителем панель задач
        user32.SetWindowLongW(hTop, GWL_STYLE, WS_CHILD) #говорим, что наше окно на самом деле дочернее, а не верхнего уровня
        user32.SetWindowPos(hTop, 
            0, #z-order - после какого окна должно идти наше. 0 - наверху
            500, 0, # положение окна, пикселей
            100, 40, # рамер окна, пикселей
            SWP_NOACTIVATE | SWP_NOZORDER | SWP_SHOWWINDOW) # позиционируем и показываем окно
     
     
    hTaskbar = get_taskbar_window()
    root = make_attachment()
    # откладываем вызов attach(root, hTaskbar)
    # так как ткинтер некоторые настройки задаёт не сразу же
    root.after(1, attach, root, hTaskbar) 
    root.mainloop()
    Ответ написан
    7 комментариев
  • Not saving data to .db in python?

    Vindicar
    @Vindicar
    RTFM!
    if len(keys) > 0:
        id = int(keys[-1]) + 1
        students[str(id)] = self #you actually save the data here
    else:
        id = 1
        # where is the save operation if the db is empty?


    You should conditionally determine the id value, then UNconditionally assign it to self.id and save the entire instance to shelve.
    Ответ написан
    2 комментария
  • Как вынести обработчик сообщений в отдельный модуль?

    Vindicar
    @Vindicar
    RTFM!
    О, мой старый ответ. С тех пор я нашел, как его улучшить. Выглядит довольно коряво, но зато просто.
    def init_bot(bot):
        # и прямо тут и описываешь все обработчики. Они получат доступ к параметру bot через замыкание.
        @bot.message_handler(commands=['start'])
        def start(message):
            msg = bot.send_message(message.chat.id, f'_Введи имя:_', parse_mode='markdown')
            bot.register_next_step_handler(msg, step1)
    Ответ написан
  • Как преобразовать одномерный массив в двумерный?

    Vindicar
    @Vindicar
    RTFM!
    Ну. Код у тебя почти правильный.
    Всё что тебе осталось - это найти формулу соответствия между индексами двухмерного массива r, c и индексом одномерного массива k.
    Подсказка: значения k для массива размером 2 x 4.
    k   c=0 1 2 3
        +---------
    r=0 | 0 1 2 3 
    r=1 | 4 5 6 7
    Ответ написан
    Комментировать
  • Как создать 'фиктивный' канал для captcha.not?

    Vindicar
    @Vindicar
    RTFM!
    Сделать канал, назначить его каналом по умолчанию.
    Пользователям по умолчанию (@everyone) показывать только этот канал.
    По вводу капчи давать пользователю роль, роль настроить так, чтобы этот канал им не был виден, но были видны все остальные.
    Ответ написан
    Комментировать
  • Функция open(), не видит файл «all.json». Код пишу на Python. Как это исправить?

    Vindicar
    @Vindicar
    RTFM!
    Ты используешь относительный путь, а этот путь отсчитывается не от расположения скрипта, а от текущей директории. Она может совпадать или не совпадать с расположением скрипта, в зависимости от того, как его запускать.
    Если тебе прямо очень нужен файл именно в директории скрипта, надёжнее сделать вот так:
    import sys
    import os
    
    script_dir = os.path.dirname(sys.argv[0])
    with open(os.path.join(script_dir, 'all.json'), 'rt') as jsonfile:
        data = json.load(jsonfile)
    Ответ написан
    2 комментария
  • В чём моя ошибка?

    Vindicar
    @Vindicar
    RTFM!
    Чтобы проверить, что имя начинается и заканчивается на одну букву:
    name[0] == name[-1]

    Чтобы проверить целый список, что есть хотя бы одно такое имя:
    for name in names:
        if name[0] == name[-1]:
            print('YES')
            break
    else: # это else относится к for, а не к if!
        print('NO')

    Ну или более кратко:
    if any(name[0] == name[1] for name in names):
        print('YES')
    else:
        print('NO')


    Ввод имён в список ты уже вроде как делаешь, даже с учётом регистра.
    Ответ написан
    Комментировать
  • Не могу описать суть вопроса?

    Vindicar
    @Vindicar
    RTFM!
    Либо передавать bot как отдельный параметр в целевую функцию.
    Либо прятать целевую функцию в класс, сделав её методом, передавать bot в конструктор этого класса, и сохранять в атрибуте. Тогда внутри целевого метода можно будет достучаться до атрибута через self.
    Ответ написан
    Комментировать
  • Как сделать, чтобы бот в Дискорде автоматически выдавал роль только что зашедшему участнику?

    Vindicar
    @Vindicar
    RTFM!
    > Нужно сделать
    Делай. Разрешаю.

    А если серьёзно, то в чём конкретно проблема? Читаешь документацию на discord.js, находишь событие входа пользователя, пишешь реакцию на него, в которой даёшь роль.
    Ответ написан
  • Как зафиксировать на каком окне фокус в Питоне?

    Vindicar
    @Vindicar
    RTFM!
    Используй WinAPI, GetForegroundWindow()
    Для вызова функций WinAPI из питона используй ctypes.
    Ответ написан
    Комментировать
  • Пишу тг бота но код не работает хотя вчера все было хорошо почему он не работает ???

    Vindicar
    @Vindicar
    RTFM!
    Согласно ошибке, у тебя косяк в отступах. Либо лишний, либо недостаточно, либо ты смешал табы с пробелами.

    А вообще-то async - ключевое слово, его нельзя использовать как имя функции.
    Ответ написан
  • Путь к самой новой папке на Python, Datetime, как реализовать?

    Vindicar
    @Vindicar
    RTFM!
    1. glob.glob() чтобы выбрать папки по шаблону.
    2. Немного str.split() и datetime.datetime.strptime() для извлечения даты. Превращаешь дату в unix timestamp (целое число). Заворачиваешь это всё в функцию вида def keyfunc(folder: str) -> int:
    3. max() с именованным параметром key.
    4. PROFIT
    Ответ написан
    1 комментарий