• Возможна ли обработка обращений к неопределенным методам класса в Python?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    Для этого есть магический метод __getattr__, он вызывается тогда, когда нет атрибута в классе.

    Вот простой пример:
    class Foo(object):
    
        def __init__(self, value):
            self.value = value
    
        def __getattr__(self, name):
            return lambda: print("'{0}' doesn't exists!".format(name))
    
    
    foo = Foo(10)
    print(foo.value)
    foo.some_function()
    Ответ написан
    2 комментария
  • Как вывести время на ось графика matplotlib?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    Вам нужно перевести ваше время в тип datetime. И затем уже строить график.

    Например:

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib import dates
    import datetime as dt
    
    fmt = dates.DateFormatter('%H:%M:%S')
    
    fig, ax = plt.subplots()
    
    time_interval = ['19:0:0', '19:1:0', '19:2:0', '19:3:0', '19:4:0']
    time_interval = [dt.datetime.strptime(i, "%H:%M:%S") for i in time_interval]
    y = np.random.randn(5)
    x = np.array([x for x in range(5)])
    ax.plot(time_interval, y, "-o")
    ax.xaxis.set_major_formatter(fmt)
    fig.autofmt_xdate()
    plt.show()
    Ответ написан
    4 комментария
  • Управления временем в Python?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    Как и сказал Sergey6661313 вам нужно использовать QTimer. Класс QTimer испускает сигнал timeout спустя заданное время.

    Вот пример использования QTimer с QProgressBar. Таймер испускает сигнал timeout каждую секунду, по сигналу вызывается метод on_timer в котором происходит инкрементирование QProgressBar, после заполнения прогресса таймер останавливается.

    from PyQt4 import QtGui
    from PyQt4 import QtCore
    
    class Widget(QtGui.QWidget):
        
        def __init__(self, parent=None):
            super(Widget, self).__init__()
            layout = QtGui.QVBoxLayout(self)
            self.pb = QtGui.QProgressBar()
            self.pb.setMaximum(100)
            self.pb.setMinimum(0)
            self.pb.setValue(0)
            layout.addWidget(self.pb)
            self.timer = QtCore.QTimer()
            self.timer.timeout.connect(self.on_timer)
            self.timer.start(1000)
    
        def on_timer(self):
            current_value = self.pb.value() + 1
            self.pb.setValue(current_value)
            if current_value == 100:
                self.timer.stop()
    
    if __name__ == '__main__':
        app = QtGui.QApplication([])
        w = Widget()
        w.show()
        app.exec()
    Ответ написан
    Комментировать
  • Аналог Alphaskins для других языков существует ли?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    Для Python есть PyQt4(5), в ней можно делать все что угодно, включая использование css для настройки элементов GUI.
    По умолчанию PyQt выглядит нативно для операционной системы.

    Определение красивый UI, очень размыто. Луший вариант это когда приложение не выделяется от приложений установленых в систему.

    Вот простой пример как использовать CSS для кнопки:

    from PyQt5 import Qt
    
    
    class Widget(Qt.QWidget):
    
        def __init__(self):
            super().__init__()
            layout = Qt.QVBoxLayout(self)
    
            button1 = Qt.QPushButton("Button 1")
            button2 = Qt.QPushButton("Button 2")
    
            layout.addWidget(button1)
            layout.addWidget(button2)
    
            button1.setStyleSheet("""
            QPushButton {
                background-color: green;
                border-style: outset;
                border-width: 2px;
                border-radius: 10px;
                border-color: beige;
                font: bold 14px;
                min-width: 10em;
                padding: 6px;
                }
            QPushButton:pressed{
                background-color: #4CAF50;
                color: white;
                border-color: black;
                border-style: inset;
                }
            """)
    
    
    if __name__ == '__main__':
        app = Qt.QApplication([])
    
        w = Widget()
        w.show()
        app.exec()
    Ответ написан
    1 комментарий
  • Проблема с классом QWidget. Как настроить правильную работу PyQ4t?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    Судя по вашему скрину, ваш Widget не активный, поэтоме и не показывается подсказка. Тыкните внутри окна `Tooltip`, а потом подождите, и должна появится подсказка.
    Ответ написан
    Комментировать
  • Как передать доп. данные в контрол и потом это считать в обработчике событий?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    А почему у вас не заработало с наследованием?

    Попробуйте вот такой пример с использованием наследования и сигналов:

    from PyQt4 import QtGui, Qt
    
    
    class MyLabel(QtGui.QLabel):
        clicked = Qt.pyqtSignal(str)
    
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
    
        def mousePressEvent(self, *args, **kwargs):
            self.clicked.emit(self.text())
            return QtGui.QLabel.mousePressEvent(self, *args, **kwargs)
    
    
    class Main(QtGui.QWidget):
    
        def __init__(self):
            super().__init__()
            layout = QtGui.QVBoxLayout(self)
            for i in range(5):
                label = MyLabel(self, "Label " + str(i))
                label.clicked.connect(self.set_title)
                layout.addWidget(label)
            self.resize(300, 300)
    
        def set_title(self, label):
            self.setWindowTitle(label)
    
    if __name__ == '__main__':
        app = Qt.QApplication([])
        m = Main()
        m.show()
        app.exec()
    Ответ написан
    1 комментарий
  • Как решить проблему ошибки при компиляции на Python 3?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    Класс STARTUPINFO доступен только в Windows.

    Видать единственным решением будет не задавать эти флаги на posix системах.

    info = None
    if os.name == 'nt':
         info = subprocess.STARTUPINFO()
         info.dwFlags |= subprocess.STARTF_USESHOWWINDOW
         info.wShowWindow = subprocess.SW_HIDE
    Ответ написан
    5 комментариев
  • Matplotlib. Как правильно строить алгебраические функции?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    График нужно строить на интересующем вас интервале, тогда проблема с "бесконечным списком" исчезнет.
    Например:

    import numpy as np
    import matplotlib.pyplot as plt
    
    
    def func(x, a, b, c):
        y = a * x ** 2 + b * x + c
        return y
    
    x = np.linspace(0, 5, 300)
    y = func(x, 1, 0.2, 2)
    
    plt.figure(1)
    plt.subplot(211)
    plt.plot(x, y)
    plt.subplot(212)
    plt.plot(x, y)
    plt.xlim(2, 3)
    
    plt.show()


    На графике 211 будет весь интервал, а на графике 212 будет интервал от 2 до 3.
    Ответ написан
    Комментировать
  • Как умножить каждый элемент массива с шагом n?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    from math import sqrt
    
    array = [1] * 10
    
    for i in range(len(array)):
        array[i] *= sqrt(2) ** (i + 1)
    
    print(array)


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

    import numpy as np
    
    array = np.ones(10, dtype='int32')
    
    for i in range(len(array)):
        array[i] *= np.sqrt(2) ** (i + 1)
    
    print(array)


    Чтобы избежать этого, либо делаете новый массив, либо этот конвертируете в тип float, либо изначально создаете массив типа float.

    import numpy as np
    
    array = np.ones(10, dtype='f4')
    
    for i in range(len(array)):
        array[i] *= np.sqrt(2) ** (i + 1)
    
    print(array)
    Ответ написан
  • Как исправить ошибку "object has no attribute" в Python?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    Проверьте версию OpenCV, в новых версиях некоторые модули перенесены в отдельный проект opencv_contrib и по умолчанию их нет.
    Ответ написан
    Комментировать
  • Как вывести заданное количество точек на графике функции в PyPlot?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    Что значит задать количество точек?
    pyplot не знает о том какую функцию вы считаете, поэтому он не сможет вам построить график для определенных точек.

    Чтобы вывести только те точки что вам нужны нужно использовать срезы.

    Например:
    import matplotlib.pyplot as plt
    import numpy as np
    
    
    t = np.linspace(0, np.pi, 314)
    y = np.sin(t)
    
    plt.figure(1)
    plt.plot(t, y, '-g')
    plt.plot(t[100:150:5], y[100:150:5], 'og')
    plt.plot(t[::10], y[::10], '*r')
    plt.show()
    Ответ написан
    Комментировать
  • Как сделать импорт всех классов в PyQt5?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    В PyQt5 достаточно импортировать модуль Qt, а через него получать доступ ко всему что нужно. Если сразу сделаете импорт всех классов, просто захламите вашу программу.

    Например:

    from PyQt5 import Qt
    
    
    class ExampleWidget(Qt.QWidget):
    
        def __init__(self):
            super().__init__()
            layout = Qt.QVBoxLayout(self)
            layout.addWidget(Qt.QLabel("Label"))
            layout.addWidget(Qt.QLineEdit("LineEdit"))
            layout.addWidget(Qt.QPushButton("PushButton"))
            pb = Qt.QProgressBar()
            pb.setValue(66)
            layout.addWidget(pb)
    
    
    if __name__ == '__main__':
        app = Qt.QApplication([])
        w = ExampleWidget()
        w.show()
        app.exec()
    Ответ написан
    Комментировать
  • Как получить доступ к области видимости?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    Функция locals возвращает словарь с переменными в текущей области видимости.

    def func1(a, b):
        func2(locals())
    
    def func2(args):
        print(args)
    
    func1(10, 20)
    Ответ написан
  • Python+Qt для тяжелых научных расчетов и графики - миф?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    На связке Python + Qt можно написать то что будет визуализировать данные и довольно таки быстро. У меня есть опыт разработки для визуализации изображений состоящих из 500к точек и выше принимаемых по zmq. При этом использовал библиотеку pyqtgraph. Для изображений выполнялись расчеты среднего, корреляции и и т.п.

    Если при обработке где-то не будет хватать производительности, то этот участок вполне можно переписать на С++, а вызывать потом из python.

    P.S. Конечно нельзя забывать, что многое зависит от прямых рук разработчиков.
    Ответ написан
  • Как добавить распаковку для объекта своего класса?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    Например вот так:

    class A(object):
    
        def __init__(self, a, b, c):
            self.a = a
            self.b = b
            self.c = c
    
        def __iter__(self):
            yield from [self.a, self.b, self.c]
    
    
    obj = A(1, 2, 3)
    
    print(*obj)
    Ответ написан
    1 комментарий
  • Как правильно работать с QThread?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    Можете привести весь код? Проверьте работает ли простой код с обновлением прогресса.

    from PyQt4.QtGui import QWidget, QVBoxLayout, QPushButton, QProgressBar, QApplication
    from PyQt4.QtCore import QThread, pyqtSignal
    import time
    
    
    class SomeThread(QThread):
        progressed = pyqtSignal(int)
    
        def __init__(self):
            super().__init__()
    
        def run(self):
            for i in range(1, 11):
                self.progressed.emit(i)
                time.sleep(0.5)
    
    
    class App(QWidget):
    
        def __init__(self):
            super().__init__()
            vbox = QVBoxLayout()
            self.pBar = QProgressBar()
            self.pBar.setMaximum(10)
            vbox.addWidget(self.pBar)
            self.button = QPushButton("Start")
            vbox.addWidget(self.button)
            self.thread = None
            self.setLayout(vbox)
            self.button.clicked.connect(self.on_button)
    
        def on_button(self):
            if not self.thread:
                self.thread = SomeThread()
                self.thread.progressed.connect(self.on_progress)
                self.thread.finished.connect(self.on_finished)
                self.thread.start()
    
        def on_progress(self, value):
            self.pBar.setValue(value)
    
        def on_finished(self):
            self.thread.progressed.disconnect(self.on_progress)
            self.thread.finished.disconnect(self.on_finished)
            self.thread = None
    
    if __name__ == '__main__':
        qApp = QApplication([])
        app = App()
        app.show()
        qApp.exec()
    Ответ написан
    2 комментария
  • Как выполнить задачу параллельно и получить результат?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    Первый пример с Pool:python docs
    Ответ написан
    Комментировать
  • Как передать атрибуты экземпляров класса в определение функции?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    ekz1.attr1 и getattr(ekz1, "attr1") равнозначны. Соответственно в функции у вас может написано быть как угодно:

    И так:

    def foo(ekz1, ekz2):
        print(ekz1.attr1, ekz2.attr2)


    И так:

    def foo(ekz1, ekz2):
        print(getattr(ekz1, "attr1"), getattr(ekz2, "attr2"))


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

    class C1:
        def __init__(self, value1):
            self.attr1 = value1
    
    
    class C2:
        def __init__(self, value2):
            self.attr2 = value2
    
    
    def func(ekz1, ekz2):
        if not hasattr(ekz1, "attr1"):
            print("{0} has no attr1".format(type(ekz1)))
            return
        if not hasattr(ekz2, "attr2"):
            print("{0} has no attr2".format(type(ekz2)))
            return
        print(ekz1.attr1, ekz2.attr2)
    
    inst1 = C1(10)
    inst2 = C2(11)
    
    
    func(inst1, inst2)
    
    func(inst1, [1, 2, 3])
    Ответ написан
    Комментировать
  • Почему PyQt5 не считает класс виджета QObject?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    У вас в целом очень странная организация классов, отсюда и ошибки. Также у вас ошибки в исходных текстах, например lineedit и lineEdit, откуда то QTableViewItem взялся, его в библиотеке даже нет, откуда то взялся метод exec_loop.
    Когда приводите пример, будьте внимательны.
    А проблему вашу, решить проще так:

    class ORGH_widget(Qt.QWidget):
    
        def __init__(self, parent=None):
            super(ORGH_widget, self).__init__(parent)
            self.maindialog = ORGH_app(None)
            self.layout = Qt.QVBoxLayout(self)
            self.layout.addWidget(self.maindialog)
            self.maindialog.show()
    #        self.exec_loop()
    
        def keyPressEvent(self, e):
            if e.key() == Qt.Qt.Key_Escape:
                self.close()
    
    
    class ORGH_app(Qt.QMainWindow):
    
        def __init__(self, parent):
            super(ORGH_app, self).__init__()
            self.form = Ui_Form()
            self.form.setupUi(self)
    
            self._connectSlots()
    
        def _connectSlots(self):
            self.form.pushButton.clicked.connect(self._slotAddClicked)
    
        def _slotAddClicked(self):
            text = self.form.lineEdit.text()
            if len(text):
    #             tvi = Qt.QTableViewItem(self.form.tableView)
    #             tvi.setText(0, text)
                self.form.lineEdit.clear()
    
    if __name__ == "__main__":
        app = Qt.QApplication(sys.argv)
        main = ORGH_app(None)
        main.show()
        sys.exit(app.exec())
    Ответ написан
    1 комментарий
  • Как правильно сгенировать csv?

    Avernial
    @Avernial
    Разрабатываю научное ПО на языке Python.
    Если я правильно понял то у вас есть список словарей. Для записи проще использовать DictWriter:

    import csv
    
    lst = [{'value1': 1, 'value2': 10, 'value3': 100, 'value4': 'aaaa'},
           {'value1': 2, 'value2': 20, 'value3': 200, 'value4': 'bbbb'},
           {'value1': 3, 'value2': 30, 'value3': 300, 'value4': 'cccc'},
           {'value1': 4, 'value2': 40, 'value3': 400, 'value4': 'dddd'}]
    
    with open('test.csv', 'w') as csvfile:
        writer = csv.DictWriter(csvfile, delimiter=' ', fieldnames=lst[0].keys())
        writer.writeheader()
        writer.writerows(lst)
    Ответ написан
    Комментировать