• Почему зависают всплывающие окна, вызванные в потоке?

    @bbkmzzzz
    если использовать QThred, то зависать не будет? или проблема не в этом?

    Нельзя вызывать методы виджетов из другого потока, таков путь.
    Испускаете сигнал, ловите его в основном потоке графики, реагируете показом окна.

    но если из потока threading.Thread - то всё зависает

    В Qt есть QThread и QThreadPool + QRunnable
    Ответ написан
    5 комментариев
  • Почему когда импортирую пакет из модуля с помощью importlib, импортируется весь модуль?

    @bbkmzzzz
    да, импортируется весь модуль. Импорт идет в определенное пространство имен
    import time
    time.time()
    
    from time import time
    time()
    
    from time import *
    time()

    более того - импорт это выполнение, для этого и стоит использовать конструкцию
    if __name__ == '__main__':
        pass

    в __name__ содержится имя текущего модуля, но если это модуль, который был запущен изначально, то в __name__ содержится "__main__"

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

    сохраните нижний код как модуль и импортируйте его.
    print('модули выполняются при импорте')
    if __name__ == '__main__':
        print('а это выполнено не будет')
    Ответ написан
  • Можно ли ограничить частоту нажатия на кнопку Inline - Telegram bot?

    @bbkmzzzz
    Запоминайте время последнего доступа к функции от пользователя, при следующем запросе - сравнивайте время и делайте\не делайте действия
    Ответ написан
  • Как в python и PyQt5 делать так, что бы при работе с zmq или сокетами не происходило "блокировки" окна?

    @bbkmzzzz
    Цикл событий Qt тоже должен как-то работать)
    1 - выносить сервер в отдельный QThread
    2 - Использовать Qt
    Ответ написан
    2 комментария
  • Почему не привязываются функции на кнопки на создаваемом виджете из моего класса?

    @bbkmzzzz
    class Task:
        def __init__(self, параметры):
            super().__init__()

    От чего наследован класс? Как запускается приложение?
    clicked сигнал испускается при нажатии на кнопку. Сигналы могут испускать и принимать только объекты-наследники QObject и только в основном цикле событий. Task таковым не является.

    Либо дополняем код, либо идем читать про Qt.
    Ответ написан
    23 комментария
  • Как удалить объект, связанный с удаляемой вкладкой?

    @bbkmzzzz
    Хранить где-то сопоставления вкладки и связанных данных.
    Завести менеджера вкладок, который (и только он) будет добавлять, удалять вкладки и управлять данными на этих вкладках
    Ответ написан
  • Как удалить item из QListWidget?

    @bbkmzzzz
    А где та часть кода, которая отвечает за удаление? Как она вызывается?
    takeItem(row) - takeItem удаляет итем с виджетом из списка и возвращает его

    import sys
    # import requests
    from PyQt5 import QtCore, QtWidgets, QtGui
    from PyQt5.Qt import *
    
    # Картинка для заполнения
    IMAGE = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa7\xea\x00\x00\x00\x02sBIT\x08\x08U\xecF\x04\x00\x00\x00\tpHYs\x00\x00\x00v\x00\x00\x00v\x01N{&\x08\x00\x00\x00\x19tEXtSoftware\x00www.inkscape.org\x9b\xee<\x1a\x00\x00\x01\x03IDAT(S}\xd1\xb1jS\x01\x14\xc6\xf1\x1fvi\xda\xc5*\x18\x93!\t\x82\x98-\x84\xd6\xe2\xe0+\xd8\xa1\x04\xbd\x08\xc1\'s0f\x11|\x02!q\xb8\xd0\xa1\xc1L\x9dj\xbaT\xe2\x94w\xf8:\xdc\xf4\xb6\x0e\x96\xb3}\xfc\xf9\xce\x9fs\xc4\xdd(\xac\xfdq\xf2O\x16\xa1\xe1\xbd\x83p\xa1\xe9\x85\xb3p\xe0\x83\xbd-`O\xe9\xbb\x95\x85Yx\xe4\xa7s\xbf}UjT\xc0[_B\xdfq];\xf02L\xbc\xa9\x80\xa6+\x9d\x08mcc\xed\x08=+\xcfn\x1d~9\x0c\xa76\xa6\xa66N\xc3\xd0"\x82w\xce\x94\xa1e\xb3\xed\xe9\xd8h\x87\xb9\xa5\x11\xd7^\xd9\t\x85i\xed05\x8e\xd0\xb5\xe6\xaff<\x04|t\xe1\xc7\x03+",\xbc\xfe\xafdxl\xa5\x1f\xa1\xa5PhE\xe8\xb9\xf4\xa4\x02\x86\xbe\x85\x8eA\xed0\xd4\x0b\x13G\x15\xb0\xab\xf4\xd9\x95\xa5Y\x84\xb9\x85K\x93\xfa\xd4a\xdf\'\xcf\xc3RW\xd72<U\xd4\xcf\xba\x1b#kk\xa3\xfb\xd9\ru"\xad\xb2\x11\xa2\xcfy\x00\x00\x00\x00IEND\xaeB`\x82'
    
    
    class Widget(QWidget):
        def __init__(self, urls):
            super().__init__()
    
            self.grid = QGridLayout(self)
    
            for i, url in enumerate(urls):
                lbl = QLabel()
                image = QImage()
                image.loadFromData(IMAGE)
    
                if i == 0:
                    lbl.setPixmap(QPixmap(image).scaled(210, 210))
                    self.grid.addWidget(lbl, i + 1, 0, 4, 1)
                else:
                    lbl.setPixmap(QPixmap(image).scaled(70, 70))
                    self.grid.addWidget(lbl, i, 1, 1, 1)
    
    
    class ListWidget(QListWidget):
        def __init__(self, *args, **kwargs):
            super(ListWidget, self).__init__(*args, **kwargs)
            self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
            self.setEditTriggers(self.NoEditTriggers)
            self.setFlow(self.LeftToRight)
            self.setWrapping(True)
            self.setResizeMode(self.Adjust)
            self.setSpacing(10)
            # Резиновая лента (для эффекта выбора рамки)
            self._rubberPos = None
            self._rubberBand = QRubberBand(QRubberBand.Rectangle, self)
    
        def makeItem(self, lb):
            item = QtWidgets.QListWidgetItem(self)
            item.setSizeHint(QtCore.QSize(300, 300))
            self.setItemWidget(item, lb)
    
    
    class MyWindow(QtWidgets.QWidget):
        def __init__(self):
            super().__init__()
            self.setWindowTitle('ListWidget')
            self.resize(1100, 670)
            self.show()
    
            self.listWidget = ListWidget()
    
            # кнопка
            self.push_button = QPushButton('del 0 item')
    
            box = QtWidgets.QVBoxLayout(self)
    
            # добавляем кнопку
            box.addWidget(self.push_button)
    
            box.addWidget(self.listWidget)
    
            self.urls = [
                "https://img.icons8.com/ios/452/phone.png",
                "https://img.icons8.com/ios/452/phone.png",
                "http://www.google.com/favicon.ico",
                "https://www.imgonline.com.ua/examples/random-pixels-wallpaper-big.jpg",
                "https://laguna-akul.ru/upload/003/u379/f4/61/8f68d93a.jpg",
            ]
    
            num = 5
            for i in range(num):
                art = Widget(self.urls)
                self.listWidget.makeItem(art)
    
            # связываем сигнал нажатия на кнопку с методом
            self.push_button.clicked.connect(self._on_push_button_clicked)
    
        # метод-обработчик кнопки
        def _on_push_button_clicked(self):
            # takeItem удаляет итем с виджетом из списка и возвращает его
            removed = self.listWidget.takeItem(0)
            print(removed)
    
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        w = MyWindow()
        sys.exit(app.exec_())
    Ответ написан
    1 комментарий
  • Как с помощью pymysql работать в многопотоке?

    @bbkmzzzz
    еще один поток, который работает с базой, и слушает очередь, потоки воркеры пишут в очередь, поток с базой пишет в базу
    Ответ написан
  • Pyqt5 как сделать адаптивный размер виджетов внутри окна, чтобы они изменялись вместе с размером основного окна?

    @bbkmzzzz
    Компоновщики позволят автоматически регулировать размеры своих областей и виджетов.
    Но у нас такая компоновка виджетов, которую, я полагаю, очень проблематично можно будет перенести в грид. Что-то ещё видел про св-во sizePolicy, но что-то так и не разобрался.
    - элементом компоновщика может быть другой компоновщик

    Но тут у Вас по вертикали много места используется, возможно подойдет вариант с QScrollArea, это добавит прокрутку, но вся область станет достижима

    Еще из моментов, не надо наследоваться от двух классов, можно огрести)
    class Laba2(QMainWindow, laba2.Ui_Laba2):
    выносите весь сгенеренный гуй в self.ui
    class Laba2(QMainWindow):
        """Класс лабы 2, инициализирует форму и
            заполняет её элементами
        """
        def __init__(self):
            super().__init__()
            self.ui = laba2.Ui_Laba2()
            self.ui.setupUi(self)

    таким образом, все, связанное с сгенеренными формами будет в своем пространстве
    self.map_left_pos_key = QPixmap("..\\images\\laba_2\\key_left.png") -> self.ui.map_left_pos_key = QPixmap("..\\images\\laba_2\\key_left.png")
    Ответ написан
  • Не могу понять как убрать ошибку python?

    @bbkmzzzz
    Запихните код в тег code
    if text[i+1].isdigit()  # на последнем элементе списка будет выкидывать исключение,
                          #так как берется индекс [последний элемент + 1], а это за границами списка
    Ответ написан
    Комментировать
  • Как перезапустить поток в python?

    @bbkmzzzz
    Не используйте глобальные переменные, используйте класс
    import time,threading
    
    class Foo:
        a = "a"
    
    def thread_func():
    
        w = 0
        while w < 5:
            time.sleep(2)
            print("func:" + Foo.a)
            w += 1
    
    if __name__ == "__main__":
        x = threading.Thread(target=thread_func)
        x.start()
        Foo.a = input('new: ')
    Ответ написан
  • Python как определить правильный падеж?

    @bbkmzzzz
    Обратиться к грамматике)
    1. После числительного один и составных числительных, оканчивающихся на один, ставится существительное в именительном падеже.

    2. После числительных два, три, четыре и составных числительных, оканчивающихся на два, три, четыре, ставится существительное в родительном падеже единственного числа.

    3. После числительного пять, шесть и т.д. и после слов много, мало, несколько, сколько и т.д. ставится существительное в родительном падеже множественного числа.


    И про ноль не забываем
    Ответ написан
    Комментировать
  • В чём преимущество assert перед циклом if-else?

    @bbkmzzzz
    assert - только для отладки. Он не заменяtт ничего, если запустить интерпретатор с флагом -о, - assert вообще игнорируется. Так что не стоит использовать его ни для чего, кроме целей отладки. Он не заменит ни циклы, ни if-else
    Ответ написан
    2 комментария
  • Какой кронштейн выбрать, чтобы поставить 2 монитора (один над другим)?

    @bbkmzzzz
    Любой, какой понравится, у меня стоит 2 вот таких, мне прекрасно. У них газовая пружина, до 18 кг держит, регулируется под вес монитора, крепление вращается в трех плоскостях
    Ответ написан
    2 комментария
  • Как распаковывать сложные json ответы через python?

    @bbkmzzzz
    spoiler

    data = [
        {
            "LocationId": 1, "BlastHole":
            [
                {
                    "Coords":
                        {
                            "X": 15599.1298828125, "Y": 35847.578125, "Z": 180.10580444335938
                        },
                    "DesignMass": 835.0,
                    "AdditionalCharge": 0.0,
                    "RealAdditionalMass": 0.0,
                    "DesignHeight": 9.992707,
                    "RealMass": 1301.0,
                    "DesignExplosiveId": 8,
                    "RealHeight": 15.56948,
                    "RealExplosiveId": 8,
                    "Depth": 10.0,
                    "SourceHoleDepth": 17.10579,
                    "Tamping": 0.0,
                    "StatusId": 4,
                    "UnitId": 4062,
                    "StaffId": 1019,
                    "SecondStaffId": -1,
                    "ShiftId": 1,
                    "Diameter": 0.311,
                    "StartTimestamp": "2020-08-18T08:46:39",
                    "EndTimeStamp": "2020-08-18T08:47:16",
                    "HoleNotes": "null",
                    "HoseLength": 0.0,
                    "BlockID": 14999,
                    "ID": 717689,
                    "Name": "100",
                    "OldName": "null"
                }
            ]
        }
    ]


    + 1 принт, и сразу понятнее
    for i in data:
        print('BlastHole', i['BlastHole'])
        if i['BlastHole']['Name'] == '100':
            print(['BlastHole']['SecondStaffId'])

    У элемента списка числовой индекс, никаких ключей, так что вариант доступа i['BlastHole'][0]['Name'] единственный. Каких строк может быть много? Пройтись еще одним циклом по списку?
    Ответ написан
    Комментировать
  • Как расположить QScrollBar на другом виджете?

    @bbkmzzzz
    Создаете виджет QScrollBar, а потом QTextEdit.setVerticalScrollBar(свой скролл) или setHorizontalScrollBar

    spoiler

    import sys
    
    from PySide2.QtWidgets import QApplication, QMainWindow, QWidget, QHBoxLayout, QTextEdit, QScrollBar
    
    
    class Main(QMainWindow):
        def __init__(self):
            super(Main, self).__init__()
            centralWidget = QWidget(self)
            self.setCentralWidget(centralWidget)
    
            # добавляем компонощик
            self.h_grid = QHBoxLayout(centralWidget)
    
            self.customScroll = QScrollBar()
    
            # добаляем QtextEdit
            self.textEdit = QTextEdit()
    
            # задаем для него скролл
            self.textEdit.setHorizontalScrollBar(self.customScroll)
    
            # убираем полосу, отведенную под скролл
            self.textEdit.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
    
            self.h_grid.addWidget(self.textEdit)
            self.h_grid.addWidget(self.customScroll)
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = Main()
        ex.show()
        sys.exit(app.exec_())

    5fc893430cfd4584110093.jpeg
    Ответ написан
  • Я пишу программу в пэйтоне и выдаёт ошибку что делать?

    @bbkmzzzz
    Код заверните в тег code (кнопка </> в редакторе).
    if what == "+" <- двоеточие где? потерялось.
    Ответ написан
    Комментировать
  • Как нормально настроить потоки в коде с использованием PyQt?

    @bbkmzzzz
    В таком виде, как приведено тут вообще работать не будет, в таком виде он даже не запустится.
    ̶Q̶T̶h̶r̶e̶a̶d̶ ̶н̶е̶ ̶н̶а̶с̶л̶е̶д̶н̶и̶к̶ ̶Q̶O̶b̶j̶e̶c̶t̶ ̶и̶ ̶н̶е̶ ̶м̶о̶ж̶е̶т̶ ̶и̶с̶п̶у̶с̶к̶а̶т̶ь̶ ̶с̶и̶г̶н̶а̶л̶ы̶. -> UPD: с определенной версии (в 5.15 точно) QThread наконец-то стал наследником QObject, так что он теперь может сам испускать сигналы. Костыль из класса сигналлера более не актуален

    Из соседнего потока нельзя вызывать изменения виджетов окна, только испуская и ловя сигналы.

    Не наследуйтесь от двух классов одновременно, огребете странностей.

    На тостере есть примеры, как в простом виде компоновать Qt.

    В общем виде, через QRunnable, выглядит так:
    import sys
    import time
    
    from PySide2.QtCore import QThreadPool, QRunnable, Signal, QObject
    from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton, QWidget, QHBoxLayout
    
    
    class Main(QMainWindow):
        def __init__(self):
            super(Main, self).__init__()
            centralWidget = QWidget(self)
            self.setCentralWidget(centralWidget)
    
            # добавляем компонощик
            self.h_grid = QHBoxLayout(centralWidget)
    
            self.thread = QThreadPool().globalInstance()
            # добаляем кнопки
            self.button = QPushButton('Start thread')
            self.h_grid.addWidget(self.button)
    
            self.worker = Worker()
            self.worker.finished.connect(self.__on_finish)
    
            self.button.clicked.connect(self.start_worker)
    
        def start_worker(self):
            self.thread.start(self.worker)
    
        def __on_finish(self):
            print('Воркер закончил работу')
    
    
    class WorkerSignaller(QObject):
        finished = Signal()
    
    
    class Worker(QRunnable):
        def __init__(self):
            super(Worker, self).__init__()
            self.signaller = WorkerSignaller()
            self.finished = self.signaller.finished
    
        def run(self):
            print(f'Я воркер, и я запускаюсь')
            time_to_sleep = 10
            print(f'Я воркер, и я сплю {time_to_sleep} секунд')
            time.sleep(time_to_sleep)
            print(f'Я воркер, и я поспал')
            self.finished.emit()
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = Main()
        ex.show()
        sys.exit(app.exec_())
    Ответ написан
    Комментировать
  • Как правильно вызывать кастомные исключения, не прерывая функция?

    @bbkmzzzz
    #########
    elif dice == 4:
        raise CarCrashError('бип бип')
    #########
    
    try:
        one_day()
    except SuicideError:
        do_something()
    except CarCrashError:
        do_something()
    # и т.д.

    но вообще, на мой взгляд, странное решение. Вам нужно срандомить событие, зачем исключения? Исключения - исключительная ситуация, тут же вполне нормальное поведение.
    #########
    elif dice == 4:
        return some_id_data
    #########
    reactions = {
        some_id_data: do_something  # <- объект функции
                       }
    result = one_day()
    if result == some_id_data:
        do_something()
    
    result = one_day()
    reactions[some_id_data]()
    Ответ написан