• Как подключить ui файл к python?

    @bbkmzzzz
    Ответ написан
    Комментировать
  • Подключение клиета к серверу не по локалке, как сделать?

    @bbkmzzzz
    Бежать читать про открытие/перенаправление портов, различия между серым/белым ip адресом, NAT и vpn, скорее всего
    Ответ написан
    Комментировать
  • Как отслеживать для каждой кнопки её зажатие и отпускание?

    @bbkmzzzz
    Ловить события mousePressEvent(QMouseEvent *event) и mouseReleaseEvent(QMouseEvent *event) наследника QWidget, коим и является QPushButton
    Ответ написан
    4 комментария
  • Как создать из списка подсписки и посчитать частоту повторения?

    @bbkmzzzz
    В лоб, еще можно крутить, но работает. Вроде)
    def get_list_part_count(lst: list, start_divider):
        # ищем наименьшее количество частей списка
        ln = len(lst)
        while True:
            if ln % start_divider != 0:
                start_divider += 1
            else:
                break
        return start_divider
    
    
    def find_max_item_val_in_dict(dc: dict):
        # ищем максимальное значение элемента словаря
        # предполагаем, что отрицательных чисел в наших списках не будет
        max_val = -1
        result_item = None
        for key in dc:
            if dc[key] > max_val:
                max_val = dc[key]
                result_item = key
        return result_item
    
    
    def split_list_to_parts(lst, part_count):
        # делим список на части, заданные в параметре part_count
        part_len = int(len(lst) / part_count)  # длина одной части
        y = []  # результирующий список
        for multiplier in range(1, part_count + 1):
            #  заполняем наш список срезами исходного
            y.append(lst[(part_len * multiplier) - part_len:part_len * multiplier])
        return y
    
    
    def find_periodic_seq(seq, start_divider):
        #  получаем наш разделенный список
        splitted_list = split_list_to_parts(seq, get_list_part_count(seq, start_divider))
        #  тут будут храниться наши последовательности
        counters = []
    
        # нужно больше циклов!!!
        # пробегаем по нашему расщепенцу
        for sub_list in splitted_list:
    
            dc = {}
            for element in sub_list:
                #  заполняем словарь dc данными, сколько раз каждый элемент встречается в последовательности
                #  count намеренно не использовал
                try:
                    dc[element] += 1
                except KeyError:
                    dc[element] = 1
            # находим элемент, котрый максимально часто встречается в последовательности
            max_item = find_max_item_val_in_dict(dc)
    
            lst = []
            #  собираем индексы, на которых находятся наши элементы и запихиваем в список lst
            for pos, element in enumerate(sub_list):
                if element == max_item:
                    lst.append(pos)
            #  список со списками индексов максимально часто повторяющихся элементов, предварительно разбитого списка!
            counters.append(lst)
    
        #  если длина списка == количеству повторений первого элемента -> наш список содержит одинаковые элементы
        if len(counters) == counters.count(counters[0]):
            return counters[0]
        else:
            return None
    
    
    if __name__ == '__main__':
        #  не улетаем в небеса и ограничиваем бесконечный цикл
        stop_cycles = 10
        current_cycles = 1
    
        #  исходный список
        lst = [0, 1, 1, 2, 1, 3, 4, 4, 5, 4, 5, 6, 6, 3, 6]
    
        #  минимальное количество элементов в каждой части при дроблении списка на части
        start_divider = 3
        while True:
            if current_cycles > stop_cycles:
                print(f'Can not find sequence with {current_cycles} cycles, stopping :(')
                break
            
            #  вызываем нашу основную функцию
            result = find_periodic_seq(lst, start_divider)
            if not result:
                #  если ничего не нашлось - увеличиваем минимальную длину части на 1
                start_divider += 1
            else:
                print(f'seq was founded with {current_cycles} cycles! {result}')
                break
    Ответ написан
  • В чем суть ошибки TypeError?

    @bbkmzzzz
    Суть ошибки в не подходящих типах, например:
    x = '1'
    y = 2
    z = x + y  # нельзя сложить число и строку
    
    Traceback (most recent call last):
      File "main.py", line 3, in <module>
        z = x + y
    TypeError: can only concatenate str (not "int") to str

    в вашем случае TypeError: 'NoneType' object is not callable означает, что ваш объек - None, а есть попытка вызвать его, что невозможно.
    Проверяйте, что там за данные, сломалось, и в результате None.
    Ответ написан
    Комментировать
  • Как работает модель/представление. в PyQt5?

    @bbkmzzzz
    Офф C++ доки - Все нормально расписано, язык не должен смущать, методы\сигналы такие-же
    На вики кратко описана концепция MVC
    В двух словах:
    MVC - про разделение бизнес логики и интерфейса, представление показывает данные, контроллер реагирует и обрабатывает действия пользователя, модель оперирует данными и логикой, передает данные в представление.
    В Qt представление и контроллер совмещены в одно, контроллер находится в представлении. Представление(вьюшка) обрабатывает события ввода, контроллер шлет сигналы, модель реагирует на сигналы.

    Разберитесь с работой QTableWidget, например. Это виджет, который совмещает QTableView и QAbstractTableModel. Разберетесь, как оно работает, можно переходить непосредственно на вьюшку и модель, и тыкать их
    Ответ написан
    Комментировать
  • Как располагать виджеты сверху в QGridLayout?

    @bbkmzzzz
    Добавить QSpacerItem в самый низ
    import sys
    from PySide2.QtWidgets import QApplication, QMainWindow, QGridLayout, QPushButton, QWidget, QSpacerItem, QSizePolicy
    
    
    class Main(QMainWindow):
        def __init__(self):
            super(Main, self).__init__()
            centralWidget = QWidget(self)
            self.setCentralWidget(centralWidget)
            
            # добавляем компоновщик-сетку
            self.v_grid = QGridLayout(centralWidget)
    
            # добавляем кнопки
            for i in range(5):
                self.v_grid.addWidget(QPushButton(f"Button {i}"))
            
            # Добавляем QSpacer, политики размера нужны, так как по умолчанию они Fixed
            self.v_grid.addItem(QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding))
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = Main()
        ex.show()
        sys.exit(app.exec_())

    А вообще, потыкайте Qt Designer, он идет в поставке Qt оберток
    тут поискать для Pyside2: $PyInterpreterDirectory$\Lib\site-packages\PySide2\designer.exe
    Он даст возможность поглядеть на виджеты, и накидать простенькие формы\части форм. Как это все потом использовать можно поискать тут, на тостере
    Ответ написан
    Комментировать
  • Как добиться видимости объектов созданных в формах Qt Designer при разработке кода в PyCharm?

    @bbkmzzzz
    Заведите в классе отдельное поле для форм, будет удобнее.
    import labaa2
    
    class Laba2(QMainWindow):
        def __init__(self):
            super().__init__()
            self.ui = self.setupUi(self)


    Тогда вся форма будет в ui
    self.ui.button # например

    Дело в том, что QtDesigner создает файлы в "своем формате" (xml, если правильно помню), попробуйте открыть ui файл блокнотом, увидите. Питон ни сном ни духом, что там такое находится и как с этим взаимодействовать, вот тут на сцену и выходит uic. Он преобразует дерево виджетов ui в валидный питоновский класс, который использует установленную питоновскую библиотеку-обертку над Qt.
    С uic 2 подхода:
    1. uic.loadUi('TEST.ui', self)
    (есть смысл запихнуть это в отдельное поле класса, например, self.ui = uic.loadUi('TEST.ui', self), дабы не возникло не нужных пересечений имен, да и, на мой взгляд, аккуратнее получиться, мало ли еще одну форму в этот же класс грузить будете.)
    uic парсит ui файл, и создает сущности. Каждый раз, при запуске программы это будет происходить.
    + Не требует промежуточных звеньев
    - Не работает автодополнение IDE
    - Парсинг и формирование питон класса при каждом запуске.
    2. Конвертация заранее.
    - Требует промежуточное действие между формой и программой. (преобразование в ui в py)
    + Работает автодополнение
    + Не тратится время на преобразование при запуске программы.
    + В PyCharm можно настроить конвертацию на горячую клавишу.

    Не надо наследовать класс сразу от двух классов, в 99.9% Вам это не надо, а странных для вас эффектов можете огрести.
    С использованием предварительной конвертации
    Импортируйте сконвертированную форму в самом начале, дайте ей понятное название, потом подключите
    import labaa2
    from labaa2.Ui_Laba2 import Ui_что_там_у_вас as MainForm_UI
    
    class Laba2(QMainWindow,):
        def __init__(self):
            super().__init__()
            self.ui = MainFormUI()
            self.ui.setupUi(self)

    теперь вся форма будет в ui, автодополнение работает, Pycharm скорее всего не увидит сигналов, но это нормально, работать они, естественно, будут.

    P.S. Pycharm и External tools
    Картинки

    5f8caa995f6ff805437661.png
    5f8cad28bb2ce085833759.png
    Для такой организации формочек
    5f8cadf60e0e2969686885.png
    Правой кнопкой по файлу - то, как Вы назовете external tool.
    5f8caefc48637441580438.png
    # импорт
    import labaa2
    from forms.py.temp_ui import Ui_MainWindow as MainForm
    
    
    class Laba2(QMainWindow,):
        def __init__(self):
            super().__init__()
            self.ui = MainForm()
            self.ui.setupUi(self)


    Добавление хоткея
    5f8cafbe07d7f009801572.png
    Ответ написан
    1 комментарий
  • Как определить имя переменной передаваeмой в min(), max() в python?

    @bbkmzzzz
    Вам это не надо. Вы работаете с данными, а не с именами переменных.

    Дичь, но это "то, что надо":
    a = 0
    b = 1
    c = 2
    d = 3
    
    alls = min(a, b, c, d)
    
    globs = globals().copy()
    for i in globs:
      if id(globs[i]) == id(alls):
        print("имя переменной, у которой самый маленький int:", i)
        break

    all - зарезервированное имя, не используйте его.
    Ответ написан
    Комментировать
  • Как сделать кд?

    @bbkmzzzz
    Например, сохранять время наступления события (прием сообщения), при наступлении следующего - вычислять разницу во времени и выполнять\не выполнять действия
    Ответ написан
    Комментировать
  • Создание динамических кнопок python и pyqt5?

    @bbkmzzzz
    QTableView\QTableWidget, в зависимости от желания разбираться с моделями, от объема, и QTableWidgetItem для кнопки в ячейку таблицы
    Ответ написан
    Комментировать
  • Как перехватывать информацию из консоли?

    @bbkmzzzz
    from subprocess import Popen, PIPE
    
     # запускаем команду, вывод перенаправляем в PIPE
    proc = Popen('cmd /c ping 8.8.8.8', stdout=PIPE)
    
    #  по завершении работы proc, прочитать данные из
    # stdout (и отправить ввод, если надо), результат не декодирован (bytes)
    res = proc.communicate()[0]  # <- communicate возвращает кортеж (stdout_data, stderr_data)
    
    print(res.decode('cp866')) # выводим на печать декодированные данные
    Ответ написан
    Комментировать
  • Как вывести несколько значений переменных с новой строки?

    @bbkmzzzz
    Строки
    model = 1
    color = "black"
    year = 2010
    number_of_doors = 6
    
    print(str(model) + "\n" + color + "\n" + str(year) + "\n" + str(number_of_doors))
    print('####')
    
    print("%d\n%s\n%d\n%d" % (model, color, year, number_of_doors))
    print('####')
    
    print(f"{model}\n" \
            f"{color}\n" \
            f"{year}\n" \
            f"{number_of_doors}")
    print("####")
    
    print(f"{model}\n{color}\n{year}\n{number_of_doors}")
    Ответ написан
    Комментировать