• Как узнать из-за чего упало приложение с PyQt5?

    @bbkmzzzz
    можно попытаться через модуль traceback.
    from traceback import format_exc
    from sys import stderr
    
    ## момент на котором предположительно может падать
    
    try:
        ...
    except:
        print(format_exc(10), file=stderr) # 10 - глубина стека ошибки
    Ответ написан
    Комментировать
  • Как сделать "кликабельные" карточки?

    @bbkmzzzz
    QListView генерирует событие clicked с индексом элемента модели, подписывайтесь на сигнал и обрабатывайте.
    Ответ написан
  • Для чего реально применяются структуры?

    @bbkmzzzz
    Для логической группировки данных в одной сущности, когда возможности классов избыточны, например, результат запроса в БД.
    Ответ написан
    3 комментария
  • Как правильно обработать исключение?

    @bbkmzzzz
    try:
        es = Elasticsearch(elastic_servers, http_auth=(elastic_user, elastic_password))
        res = es.search(index=indices, body=quer
    except Exception as exc:
        print('ALARM!', exc.args)


    если нужен стек исключения - модуль traceback поможет
    from traceback import format_exc
    ...
    try:
        es = Elasticsearch(elastic_servers, http_auth=(elastic_user, elastic_password))
        res = es.search(index=indices, body=quer
    except:
        print('ALARM!')
        print(format_exc(10)) # 10 - глубина стека
    Ответ написан
    Комментировать
  • Можно ли в клиент-серверном приложении на клиенте подключиться к другому клиенту?

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

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

    архитектурные вопросы)
    Ко всем сразу, кстати?
    А если клиентов в сети 1000?
    на каждом компьютере по 1000 активных подключений для одной программы?
    Или клиент подключается по мере необходимости?
    Тогда как быть с уже закрытым клиентом на той стороне?

    Лучше для общей коммуникации использовать сервер, а соединение клиент-клиент использовать для передачи больших объемов данных, например файлов.
    Ответ написан
    Комментировать
  • Python: сокеты на dynamic dns, как реализовать?

    @bbkmzzzz
    sock.bind((socket.gethostbyname("***********.ddns.net"),0)) #host указан верно

    На Вашем компьютере существует сетевой интерфейс (грубо говоря - сетевая карта) с адресом, который резолвится из ***********.ddns.net? Вы будете принимать входящие соединения? Ведь вы привязываете сокет на доступность с определенного интерфейса для входящих(!) подключений. Если не указывать интерфейс - сокет будет доступен на всех сетевых интерфейсах компьютера.

    Нулевой порт использовать можно только если Вы четко знаете что делаете. Все порты до 1024 требуют прав администратора для привязки сокета.

    Для корректной работы нужно два условия:
    1: Вы привязываете сокет на существующий интерфейс сетевой карты, или на все, если использовать "socket.bind(('', port))
    2: порт, который Вы пытаетесь привязать к сокету никто еще не использует.

    Для подключения куда-либо bind использовать не нужно, bind только для прослушивания.
    порт для подключения через connect - обязателен.

    import socket
    sock = socket.socket()
    HOST = socket.gethostbyname("***********.ddns.net")
    PORT = 80
    sock.connect((HOST, PORT)) #host указан верно PORT - обязательно
    # sock.listen(1) - только для прослушивания
    # con,addr = sock.accept() только для прослушивания
    #while True:  не имеет смысла, нет корректного выхода из цикла.
    sock.send(b"HI")
    cock.close()


    Учтите, что sock.accept() операция блокирующая, т.е. программа будет ждать входящего подключения пока оно не случится.

    Пример из документации:
    # Echo server program
    import socket
    
    HOST = ''                 # Symbolic name meaning all available interfaces
    PORT = 50007              # Arbitrary non-privileged port
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((HOST, PORT))
        s.listen(1)
        conn, addr = s.accept()
        with conn:
            print('Connected by', addr)
            while True:
                data = conn.recv(1024)
                if not data: break
                conn.sendall(data)

    # Echo client program
    import socket
    
    HOST = 'localhost'    # адрес, куда подключаемся,  localhost = 127.0.0.1
    PORT = 50007              # The same port as used by the server
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((HOST, PORT))
        s.sendall(b'Hello, world')
        data = s.recv(1024)
    print('Received', repr(data))
    Ответ написан
    Комментировать
  • Python, json файл преобразовать в словарь python?

    @bbkmzzzz
    Ошибка в Json файле, или модулю что-то не нравиться, например нестандартный разделитель. Откройте файл вручную и посмотрите, что может не нравиться модулю.
    Ответ написан
    Комментировать
  • Почему в Python вылетает ошибка IndexError: list index out of range, при правильном коде?

    @bbkmzzzz
    random.choice выкидывает исключение, если последовательность пустая.

    исходник random.choice

    def choice(self, seq):
            """Choose a random element from a non-empty sequence."""
            try:
                i = self._randbelow(len(seq))
            except ValueError:
                raise IndexError('Cannot choose from an empty sequence') from None
            return seq[i]

    Вот и обращение по индексу, а для генерации рандомного числа берет длину последовательности. Смотрите, почему список пуст или недоступен, если он разделяемый ресурс.
    Ответ написан
    Комментировать
  • Как получить путь до скрипта (Mac OS)?

    @bbkmzzzz
    os.getcwd() - возвращает текущую рабочу директорию
    sys.argv[0] - путь к файлу скрипта
    Ответ написан
    Комментировать
  • Сложить значения одинаковых ключей множества словарей объеденённых списком?

    @bbkmzzzz
    Если без подключения модуля, то можно так:
    a = (
          {'Петя': 6, 'Вася': 8, 'Дима': 11, 'Юля': 3},
          {'Петя': 5, 'Вася': 36, 'Дима': 4, 'Юля': 8},
          {'Петя': 54, 'Вася': 21, 'Дима': 22, 'Юля': 39},
          {'Петя': 61, 'Вася': 48, 'Дима': 71, 'Юля': 73}
        )
    
    resultdict = {}                                            #  результирующий словарь
    
    for dictionary in a:                                     # пробегаем по списку словарей
      for key in dictionary:                               # пробегаем по ключам словаря
        try:
          resultdict[key] += dictionary[key]        # складываем значения
        except KeyError:                                    # если ключа еще нет - создаем
          resultdict[key] = dictionary[key]   
    
    print(resultdict)
    Ответ написан
    Комментировать
  • PyQt записать в lineEdit по нажатию кнопки?

    @bbkmzzzz
    Можно так:
    self.ui.btnQuit.clicked.connect(lambda: self.ui.lineEdit.setText("Text"))  # Пример №2

    или привязать к методу
    # -*- coding: utf-8 -*-
    
    from PyQt5 import QtWidgets, uic
    import sys
    
    class MyWindow(QtWidgets.QWidget):
        def __init__(self, parent = None):
            QtWidgets.QWidget.__init__(self, parent)
            Form, Base = uic.loadUiType("window.ui")
            self.ui = Form()
            self.ui.setupUi(self)
            self.ui.lineEdit.setText("Text")  # Пример №1
    
            self.ui.btnQuit.clicked.connect(self.setmytext))  # Пример №2 Внимательно со скобками, нам нужно
                                                                                       #передать метод, но не результат его выполнения!
    
        def setmytext(self):
            self.ui.lineEdit.setText("Text")
    
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        window = MyWindow()
        window.show()
        sys.exit(app.exec_())
    Ответ написан
    Комментировать