Задать вопрос
  • Возможно ли окно у окна отключить взаимодействие?

    Vindicar
    @Vindicar
    RTFM!
    Не знаю, есть ли решение через PyQT, но точно есть решение через WinAPI.
    SetWindowRgn() позволяет задать активный регион для окна. Точки, не входящие в этот регион, не будут обрабатываться ни при рисовании, ни при кликах.

    Пример

    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 и kernel32.dll
    kernel32 = ctypes.windll.kernel32
    user32 = ctypes.windll.user32
    gdi32 = ctypes.windll.gdi32
    # описываем используемые функции, типы и константы 
    kernel32.GetConsoleWindow.argtypes = []
    kernel32.GetConsoleWindow.restype = w.HWND
    kernel32.GetConsoleWindow.check = ErrorIfZero
    
    user32.GetWindowRect.argtypes = [w.HWND, w.LPRECT]
    user32.GetWindowRect.restype = w.BOOL
    user32.GetWindowRect.check = ErrorIfZero
    
    user32.SetWindowRgn.argtypes = [w.HWND, w.HRGN, w.BOOL]
    user32.SetWindowRgn.restype = w.INT
    user32.SetWindowRgn.check = ErrorIfZero
    
    gdi32.DeleteObject.argtypes = [w.HANDLE]
    gdi32.DeleteObject.restype = w.BOOL
    gdi32.DeleteObject.check = ErrorIfZero
    
    gdi32.CreateRectRgnIndirect.argtypes = [w.LPRECT]
    gdi32.CreateRectRgnIndirect.restype = w.HRGN
    gdi32.CreateRectRgnIndirect.check = ErrorIfZero
    
    gdi32.CombineRgn.argtypes = [w.HRGN, w.HRGN, w.HRGN, w.INT]
    gdi32.CombineRgn.restype = w.INT
    gdi32.CombineRgn.check = ErrorIfZero
    RGN_AND  = 1
    RGN_OR   = 2
    RGN_XOR  = 3
    RGN_DIFF = 4
    RGN_COPY = 5
    
    
    hWnd = kernel32.GetConsoleWindow()
    r = w.RECT()
    user32.GetWindowRect(hWnd, ctypes.byref(r))
    r.left, r.right = 0, r.right - r.left
    r.top, r.bottom = -50, r.bottom - r.top #почему-то есть косяк с заголовком окна
    hole = w.RECT(r.right // 4, r.bottom // 4, 3 * r.right // 4, 3 * r.bottom // 4)
    
    hRgn = gdi32.CreateRectRgnIndirect(ctypes.byref(r))
    hHole = gdi32.CreateRectRgnIndirect(ctypes.byref(hole))
    gdi32.CombineRgn(hRgn, hRgn, hHole, RGN_DIFF)
    gdi32.DeleteObject(hHole)
    
    user32.SetWindowRgn(hWnd, hRgn, True)
    
    input('Press Enter to fix the hole.')
    
    user32.SetWindowRgn(hWnd, 0, True)
    gdi32.DeleteObject(hRgn)

    Ответ написан
    Комментировать
  • Как сделать динамическую slash команду disnake?

    Vindicar
    @Vindicar
    RTFM!
    Т.е. ты хочешь чтобы в команде автоматически предлагался список доступных серверов и т.п.?
    Никак. Особенно с учётом того что команда (а значит, и её параметры) регистрируется при старте бота, а со временем этот список всё равно может измениться и потерять актуальность.
    Ответ написан
    4 комментария
  • Как сделать ответ на "/start" на aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Как купить роль по "айди"?

    Vindicar
    @Vindicar
    RTFM!
    У тебя противоречия в запросах к БД. Для начала ответь на такие вопросы:
    1. Сколько серверов будет обслуживать бот - один или несколько?
    2. Сколько ролей можно покупать на сервере?
    3. Баланс пользователя будет свой на каждом сервере или общий?
    Исходя из этого и нужно проектировать БД.
    Ответ написан
  • Как один цикл прерывает другой цикл?

    Vindicar
    @Vindicar
    RTFM!
    А что тут непонятного?

    Внешний цикл выполняет своё тело раз за разом. При этом пока тело не выполнится до конца, новое выполнение тела не начнётся.
    Соответственно, внутренний цикл задерживает выполнение кода в теле внешнего цикла, и тем самым задерживает весь внешний цикл.
    Ответ написан
    Комментировать
  • Как по написанной функции в python отобразить ее на графике с помощью matplotlib.pyplot, установив при этом шаг по оси х 0.1?

    Vindicar
    @Vindicar
    RTFM!
    Если в arange() не указать третий параметр, то она вернёт значения в указанном интервале от a до b с шагом 1.
    Если указать, то этот параметр будет желаемым значением шага.
    Так что просто генерируй массивы x с другим шагом, и всё.
    Ответ написан
    3 комментария
  • Получение текста между заголовкми?

    Vindicar
    @Vindicar
    RTFM!
    Тривиально. Держи в памяти буфер строк и переменную для текущего заголовка.
    Если строка является заголовком - отправляешь на вывод текущий заголовок и текущее содержимое буфера строк, потом очищаешь буфер и запоминаешь текущую строку как заголовок.
    Если строка не является заголовком - добавляешь её в буфер строк.
    Когда перебрал все строки, отправляешь на вывод последний заголовок и то, что сейчас в буфере.
    Ответ написан
    Комментировать
  • Как узнать 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) показывать только этот канал.
    По вводу капчи давать пользователю роль, роль настроить так, чтобы этот канал им не был виден, но были видны все остальные.
    Ответ написан
    Комментировать