Форум сайта python.su
Пишу проги для МикроКонтроллеров(МК), увлекаюсь этим чуть ни с детства, при этом высокуровневку пытался, не далась. Видимо мозг так заточен…
И вот, появился проект, где нужно связать МК и ПК. Почитал про Питон, возрадовался что он заточен под простоту.
Глубоко постигать нет желания, пробежался по основным командам(которых мне хватит, задачи очень прагматичны, поделить_умножить/вывести_на_экран/записать_в_файл),
Я даже понял что такое “классы”!
Взялся за TkIner, масса уроков, но вышел в тупик, что кроме повторения урока, и минимальных его изменений(надписей/цвета/размер_окна) сделать особо ни чего не магу, т.к. эит разные наследования и так далее, при том обьектов, которых я не понимаю, …хиромантия какая-то!.. В уроке сказали, “Напишите вот так, так и так”, этого достаточно для того чтобы повторить урок. Может эти фрагменты можно применить в своей программе не понимая, но когда их там будет много?(я головой о стену биться буду, “Да чего-же оно не работает??!”, опыта в программировании у меня достаточно, знаю что это, искать ошибку в проге которую не понимаешь!)
Решил взятся за PyQt-Designer, он мне все ГРАМОТНО соберет, а я буду только тело проги писатьу! .. А нет, чтобы к ему обращаться, нужно еще гору хиромантии наворотить!
——————————
Вот один из уроков с ютуба ролик, (((два поля ввода, кнопка(извлечь данные из полей и сделать с ними что-та), и вывести как ТекстЛейбл)))
а вот вам код, который у его получился(у его все легко и просто, а у меня мешура в глазах и куча вопросов)…
*(я прямо там напишу свои вопросы, Его коменты оставлю для того чтоб вы понимали о чем прога, а мои будут начинаться с “## -№- ##”)
import sys # Импортируем наш интерфейс from mycalc import * class MyWin(QtWidgets.QMainWindow): ## -1- ## QMainWindow это класс, типа контейнер в котором лежит ВСЁ, для того чтобы рисовать окна PyQt.. Вопрос, почему эта строчка здесь, а не в блоке, который собрал Qt-designer... Эта строчка всегда одна и та-же(в любых ситуациях), или это параметр от чего-та зависящий? def __init__(self, parent=None): ## -2- ## Что такое "parent=None"?. Это я передаю какую-то переменную со значением "None".. Но куда, что это такое. QtWidgets.QWidget.__init__(self, parent) ## -3- ## Читал разные уроки, там сказано "__init__" это какой-та конструктор, просто пишите его ВО ВСЕХ прогах, и только единственный раз,.. а понимать вам не обязательно. И вот он уже второй раз в единственной проге, и появился вопрос, так что-же это, должна ведь быть причина , что он использован дважды! self.ui = Ui_MainWindow() ## -4- ## Что такое "*.ui"?. Да, вроде называется "метод", но в документации это используется только как аббривиатура "User Iterfeys".. Но ведь она для чего-та нужна? Как понять, что это такое, чтобы я знал, где это писать... self.ui.setupUi(self) # Начало моего дописанного кода: self.ui.btnResult.clicked.connect(self.getResult) # функция которая выполняется при нажатии на кнопку def getResult(self): try: n1 = self.ui.txtNum1.text() n2 = int(self.ui.txtNum2.text()) s = int(n1, n2) self.ui.lblSum.setText(str(s)) except: msg = QtWidgets.QMessageBox() msg.setWindowTitle('Ошибка ввода!') msg.setText('Введите корректные данные!') msg.setIcon(msg.Warning) msg.exec() # Конец моего кода if __name__=="__main__": app = QtWidgets.QApplication(sys.argv) myapp = MyWin() myapp.show() sys.exit(app.exec_())
Офлайн
1. QtWidgets.QMainWindow - Это просто класс окна, с определенными свойствами, например прогресс баром внизу, может вместо этого быть QWidget .
2. parent Это соответсвенно родитель окна, тоесть бывают окна без родителей, но поле ввода оно в твоем окне находится зн. твое окно его родитель, и.т.д.
3. Тут вызывается конструктор родительского класса, грубо говоря есть класс для работы с файлами, и он к примеру в конструкторе открывает файл нужный поэтому надо его вызывать.
4. *.ui это файл с интерфейсом который нарисован в QtDesigner или еще как-то создан, на основании его через pyuic наверное был создан модуль mycalc в котором спрятаны инициализация, настройка всяких эл-тов интерфейса, можно окрыть mycalc.py и посмотреть что там.
Тоесть в Ui_* классах содержится всякая инициализация и.т.д. А в основном классе например какие-то динамические настройки и.т.д.
Я обычно делаю так, в классе MyWin у меня методы получения нужных значений от GUI ну к примеру всяких там значений полей ввода и.т.д. А функции\классы где логика содержатся отдельно, таки тестировать легче и.т.д.
Много где я м.б некорректно\неверно написал но вижу это так.
Офлайн
Faun_
сюда посмотри.
python3 + PyQt5 + Arduinoи сюда
#!/usr/bin/env python3 from PyQt5 import Qt class View(Qt.QWidget): def __init__(self): super().__init__() self.fname = '' self.view = Qt.QTextEdit() self.btnLoad = Qt.QPushButton("Open") self.btnSave = Qt.QPushButton("Save") grid = Qt.QGridLayout(self) grid.setContentsMargins(0,0,0,0) grid.addWidget(self.view,0,0,10,10) grid.addWidget(self.btnLoad,10,0,1,1) grid.addWidget(self.btnSave,10,1,1,1) self.btnLoad.clicked.connect(self.on_load) self.btnSave.clicked.connect(self.on_save) def on_load(self): fname,_ = Qt.QFileDialog.getOpenFileName(None,'Open',self.fname,"*.txt") if not fname: return self.fname = fname with open(self.fname) as f: self.view.setText(f.read()) def on_save(self): fname,_ = Qt.QFileDialog.getSaveFileName(None,'Save',self.fname,"*.txt") if not fname: return self.fname = fname with open(self.fname,'w') as f: f.write(self.view.toPlainText()) if __name__=="__main__": app = Qt.QApplication([]) w = View() w.setFont(Qt.QFont('Arial',14)) w.resize(800,600) w.move(0,0) w.show() app.exec_()
Отредактировано vic57 (Сен. 23, 2018 21:45:56)
Офлайн
Faun_Ассемблер может выучить любой школьник, но чтобы писать программу на ассемблере, нужно представлять устройство механизма, для которого пишешь программу. Вот это сложность “ассемблера” - разбираться в механизме, для которого пишешь на ассемблере. Поэтому ассемблер считают сложным, хотя сложен не ассемблер, ассемблер прост. Кстати, на C та же самая ситуация - его считают сложным, в то время как сложен не он сам, а то, для чего его используют и то, как его используют. Когда пишешь на C, надо его весь в голове держать очень точно и отчётливо себе представлять, во что этот код (каждая строка) скомпилируется. Если этого не делать, можно допустить ошибку из-за пробелов в знании самого языка и эта ошибка проявится только в работе программы уже гораздо позже релиза этой программы.
Пишу проги для МикроКонтроллеров(МК), увлекаюсь этим чуть ни с детства, при этом высокуровневку пытался, не далась. Видимо мозг так заточен…
Faun_1) Почему QMainWindow и в скрипте, и в форме из Qt Designer'аclass MyWin(QtWidgets.QMainWindow): ## -1- ## QMainWindow это класс, типа контейнер в котором лежит ВСЁ, для того чтобы рисовать окна PyQt.. Вопрос, почему эта строчка здесь, а не в блоке, который собрал Qt-designer... Эта строчка всегда одна и та-же(в любых ситуациях), или это параметр от чего-та зависящий? def __init__(self, parent=None): ## -2- ## Что такое "parent=None"?. Это я передаю какую-то переменную со значением "None".. Но куда, что это такое. QtWidgets.QWidget.__init__(self, parent) ## -3- ## Читал разные уроки, там сказано "__init__" это какой-та конструктор, просто пишите его ВО ВСЕХ прогах, и только единственный раз,.. а понимать вам не обязательно. И вот он уже второй раз в единственной проге, и появился вопрос, так что-же это, должна ведь быть причина , что он использован дважды! self.ui = Ui_MainWindow() ## -4- ## Что такое "*.ui"?. Да, вроде называется "метод", но в документации это используется только как аббривиатура "User Iterfeys".. Но ведь она для чего-та нужна? Как понять, что это такое, чтобы я знал, где это писать... self.ui.setupUi(self)
Отредактировано py.user.next (Сен. 24, 2018 04:19:11)
Офлайн
Дополнение к вопросу 2 про parent=None в аргументе. Если при вызове метода (или функции) не передавать аргумент, то метод будет воспринимать это так, как будто передано значение None.
Дополнение к вопросу 3 про два __init__. Начнем со строки сlass MyWin(QtWidgets.QMainWindow). Здесь подразумевается, что класс MyWin базируется на классе QtWidgets.QMainWindow, т.е. наследует всё и вся из QtWidgets.QMainWindow. Здесь, в нашем MyWin, метод __init__ переопределяется и, поэтому, родительский __init__ не будет работать. Для того, чтобы он отработал, добавлена строка QtWidgets.QWidget.__init__(self, parent). Такой трюк даёт возможность дополнить родительский метод своими прибамбасами, т.е. отрабатывает метод родителя и далее отрабатывается то, чем дополнили этот метод.
Про строку self.ui = Ui_MainWindow(). Это означает, что создается атрибут ui как результат, который вернёт Ui_MainWindow().
Офлайн
Всем спасибо за подсказки, пака(с их помощью) углублюсь в самостоятельное разбирательство. *напомню, что я ищу понимания, ка оно устроено(я ассемблерщик, у нас не нет ни чего абстрактного, потому для меня всё это так сложно)
..А ваш py.user.next камешек, заброшу-ка обратно, ..в родной огород. У вас комплекс короткой проги? У меня таких заморочек нет,.. по мне, толщина важней!(Длинная может и не влезть, а если толстая, это даже приятно ). А что до длинны, она сама вырастит, сколько ей нада. Если писать хорошо(продумано разбить на функциональные блоки), размер не сильно сказывается на ее понимании. Кроме того… перечитайте первую месагу, я и намека не сделал, что я КРУТОЙ ассемблерщик. Если вы выдрали это из “…увлекаюсь этим почти с детства”, то хотя-б спросили сколько мне, а потом уже предложили обнулить самомнение(которое я кстати и не обозначил).
….
Кстати, наткнулся на интересную штуку, есть оказывается проги, которые из программы делают такую картинку. Попробую, вдруг поможет, что там куда..
Офлайн
Faun_Мне всё равно. Я смотрю на твои вопросы и из этого понимаю твой уровень в целом, не в ассемблере, а вообще. Вопросы у тебя тупые - значит, ты полный ноль.
то хотя-б спросили сколько мне
Faun_Дорогуша, это и есть абстрагирование, только в примитивной парадигме. Ты даже в это не врубаешься.
Если писать хорошо(продумано разбить на функциональные блоки)
Faun_Ты просто очередной дурачок, который думает, что может просто рассказать всем, как он круто программирует, и никто его проверять не станет. Ты код свой на ассемблере не привёл нигде и мы это заметили.
а потом уже предложили обнулить самомнение(которое я кстати и не обозначил).
Отредактировано py.user.next (Сен. 25, 2018 01:43:58)
Офлайн
С удовольствием вас проигнорирую, ..но есть тенденция,.. не все читают ветку целиком, и по этому составляют представление о теме разговора по самым ГРОМКИМ сообщениям.
Не однократно ссылался что я ассеблерщик, чтобы подчеркнуть тот факт, что с абстрактными понятями(которыми изобилует ООП) у меня совсем беда(но ни куда не денешся, нада разбираться). Фактически вы правы, я тупой, но я пришел в соответствующий раздел, и не обязан испытывать комплексов, по этому поводу.
….Кто просто заглянул сюда, проясню картину, py.user.next на ровном месте решил что я заявил о своей крутости из-за того, что я несколько раз подчеркнул что я закоренелый ассемблерщик, но я это сделал чтобы обьяснить, что абстрактные понятия, которыми изобилует высокоуровневка, для меня просто …магия какая-то! На все вопросы я получил ответы, но из-за другова типа мышления(что есть, то есть,.. чего нет, того нет), над ними продолжают висеть вопросики.. поэтому я пака займусь ими сам.
…пака писал, py.user.next отредактировал свою месагу, и теперь моя может казаться неадекватной..(короче тот еще ущак помоев вывернул). Я свою редактировать не буду, я то уже прочитал, в свой адрес..
Отредактировано Faun_ (Сен. 25, 2018 10:30:28)
Офлайн
Faun_Я ничего не редактировал, ты просто дебил какой-то.
пака писал, py.user.next отредактировал свою месагу
Faun_Блин, оно для тебя магия потому, что ты абсолютно не компетентный. Вот и всё.
но я это сделал чтобы обьяснить, что абстрактные понятия, которыми изобилует высокоуровневка, для меня просто …магия какая-то!
Отредактировано py.user.next (Сен. 25, 2018 11:09:10)
Офлайн
def __init__(self, parent=None): ## -2- ## Что такое "parent=None"?.
Офлайн