Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 23, 2018 20:29:36

Faun_
Зарегистрирован: 2018-09-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Асемблерщик, трудности понимания классов в связка с PyQt

Пишу проги для МикроКонтроллеров(МК), увлекаюсь этим чуть ни с детства, при этом высокуровневку пытался, не далась. Видимо мозг так заточен…
И вот, появился проект, где нужно связать МК и ПК. Почитал про Питон, возрадовался что он заточен под простоту.
Глубоко постигать нет желания, пробежался по основным командам(которых мне хватит, задачи очень прагматичны, поделить_умножить/вывести_на_экран/записать_в_файл),
Я даже понял что такое “классы”!
Взялся за 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_())
…Написал только совсем немножко вопросов, возможно если получу (понятные для ассемблерщика), когда буду писать следующие, их окажется меньше..
Очень прошу понимания того факта, что я все-же программист, но логика ассемблера “все что есть, то есть, чего нет, того нет”. и обьяснения абстрактными понятиями мне как горох о стену, слышу, но не понимаю. Мне нужно понять как оно работает, какова цепочка того, на что оно ссылается..
….Так-же подскажите если знаете какие-то уроки, с удовольствием посмотрю, а вдруг зайдут лучше предыдущих. *Уверен, как только зацеплюсь за ниточку, сам буду искать ответы, я не лентяй, просто сейчас я в прастрации, уже пол месяца как баран на это ООП смотрю.

Офлайн

#2 Сен. 23, 2018 20:45:13

BM21
Зарегистрирован: 2018-09-15
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Асемблерщик, трудности понимания классов в связка с PyQt

1. QtWidgets.QMainWindow - Это просто класс окна, с определенными свойствами, например прогресс баром внизу, может вместо этого быть QWidget .
2. parent Это соответсвенно родитель окна, тоесть бывают окна без родителей, но поле ввода оно в твоем окне находится зн. твое окно его родитель, и.т.д.
3. Тут вызывается конструктор родительского класса, грубо говоря есть класс для работы с файлами, и он к примеру в конструкторе открывает файл нужный поэтому надо его вызывать.
4. *.ui это файл с интерфейсом который нарисован в QtDesigner или еще как-то создан, на основании его через pyuic наверное был создан модуль mycalc в котором спрятаны инициализация, настройка всяких эл-тов интерфейса, можно окрыть mycalc.py и посмотреть что там.


Тоесть в Ui_* классах содержится всякая инициализация и.т.д. А в основном классе например какие-то динамические настройки и.т.д.

Я обычно делаю так, в классе MyWin у меня методы получения нужных значений от GUI ну к примеру всяких там значений полей ввода и.т.д. А функции\классы где логика содержатся отдельно, таки тестировать легче и.т.д.
Много где я м.б некорректно\неверно написал но вижу это так.

Офлайн

#3 Сен. 23, 2018 21:15:35

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Асемблерщик, трудности понимания классов в связка с PyQt

Faun_
сюда посмотри.

python3 + PyQt5 + Arduino
и сюда
QtDesigner совсем не обязателен, для простых окон можно руками все расставить. вот простой пример -
загрузка текстового файла/редактирование/сохранение
 #!/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)

Офлайн

#4 Сен. 24, 2018 03:52:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Асемблерщик, трудности понимания классов в связка с PyQt

Faun_
Пишу проги для МикроКонтроллеров(МК), увлекаюсь этим чуть ни с детства, при этом высокуровневку пытался, не далась. Видимо мозг так заточен…
Ассемблер может выучить любой школьник, но чтобы писать программу на ассемблере, нужно представлять устройство механизма, для которого пишешь программу. Вот это сложность “ассемблера” - разбираться в механизме, для которого пишешь на ассемблере. Поэтому ассемблер считают сложным, хотя сложен не ассемблер, ассемблер прост. Кстати, на C та же самая ситуация - его считают сложным, в то время как сложен не он сам, а то, для чего его используют и то, как его используют. Когда пишешь на C, надо его весь в голове держать очень точно и отчётливо себе представлять, во что этот код (каждая строка) скомпилируется. Если этого не делать, можно допустить ошибку из-за пробелов в знании самого языка и эта ошибка проявится только в работе программы уже гораздо позже релиза этой программы.

Ну и, если рассматривать механизмы, для которых пишут на ассемблере, они тоже бывают простые и сложные. И писать на ассемблере для простого механизма ничего сложного из себя не представляет. Часто это различие используют, чтобы нанести такой флёр таинственности и высокого мастерства, когда на самом деле там ничего мастерского нет.

Вот поэтому, когда такие ассемблерщики попадают в мир реального программирования - когда надо сделать программу сложнее чем 2 + 2 (строк на 1000 или на 5000), - они нифига не могут не только сделать, но и разобраться в, казалось бы, простом. Проблемы начинаются на стадии проектирования, они не умеют проектировать программы сложнее десятка процедур.

Так что сбрасывай самомнение на ноль. Скажи себе, что ничего не знаешь и не умеешь, и начинай сначала всё изучать, классически. Если ты что-то знаешь, оно подцепится и ты быстро это пройдёшь заново. Если же ты чего-то не знаешь, то ты не станешь это бросать - уходить от этого, якобы ты это знаешь и так, но время не хочешь тратить, - а станешь изучать, чтобы узнать впервые.

Изучил ли ты процедурную парадигму программирования?
Изучил ли ты структурную парадигму программирования?
Без этого нельзя переходить к парадигме ООП, потому что парадигма объектно-ориентированного программирования не замена этим двум парадигмам, а дополнение к ним. И ООП не научит тебя разрабатывать программы, а лишь даст дополнительные плюсы и плюшки, упрощая твою разработку программ, уже спроектированных по классическим методикам.

Faun_
  
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)     
1) Почему QMainWindow и в скрипте, и в форме из Qt Designer'а
Форма в Qt Designer'е - это не вся программа, а просто кусок программы. Ты делаешь куски программы в виде разных форм и подключаешь каждую форму к программе. У программы есть главное окно, но оно имеет общий вид и чистое содержимое, поэтому ты берёшь созданную форму и копируешь все настройки и содержимое из неё в главное окно. Таким образом главное окно приобретает вид твоей формы и содержимое этой формы. А потом ты можешь к этим скопированным настройкам добавлять ещё настройки. Так ты можешь одну форму использовать для настройки разных окон своей программы, но при этом в разных окнах иметь ещё и какие-то индивидуальные настройки этих окон.

2) Что такое parent.
Это родительское окно (или виджет). Нужна эта штука, чтобы освобождать ресурсы. Когда окно закрывается, оно освобождает свои ресурсы и заходит в каждый дочерний элемент и закрывает его, а тот в свою очередь так же освобождает свои ресурсы и заходит в свои дочерние элементы и вызывает их закрытие. У тебя получается дерево виджетов, в котором завершение родительских виджетов приводит к завершению дочерних виджетов. Так ты, закрыв главное окно, вызываешь цепочку закрытий (правильных закрытий) всех его дочерних окон, кнопок, меток и других элементов.

3) Что такое __init__ и почему он вызывается.
__init__() - это служебный метод. То есть это значит, что вызывать его напрямую в коде не требуется. После создания объекта этот метод сразу вызывается сам собой и заполняет объект первичными значениями, которые программист может написать в коде. Но мы имеем наследование - есть родительский класс общего вида и дочерний класс, который от него унаследован. В них обоих есть __init__() и унаследованный класс заменяет своим __init__()'ом родительский __init__(). __init__()'ы родительского и дочернего класса могут полностью различаться как по содержимому, так и по аргументам. Если ты напишешь в __init__()'е дочернего класса заполнение объекта какими-то значениями, то тот __init__(), который находится в родительском классе, не выполнится, так как весь этот родительский __init__() заменён дочерним __init__()'ом. При создании объекта дочернего класса сам собой у этого объекта вызывается только дочерний __init__(), а родителский __init__() не вызывается, так как он бы вызвался, если бы ты объект родительского класса создал. Поэтому, если у тебя в родительском классе записано, что __init__() должен проставить такие-то значения в объекте этого класса, нужно соблюсти это условие. Но так как объект дочернего класса вызывает собственный __init__() и проставляет собственные значения, то внутри этого дочернего __init__()'а сначала нужно вызвать родительский __init__() с правильными для родительского __init__()'а значениями и только после этого выполнять установки дочерних значений.
В общем, дочерний __init__() полностью заменяет родительский __init__(), но родительский __init__() писался для чего-то, поэтому его нужно вызвать до всех операций в дочернем __init__()'е, чтобы он сделал своё дело.

4) Что такое ui, которое фигурирует в коде.
UI - User Interface (пользовательский интерфейс или интерфейс для пользователя). В названии класса этот префикс символизирует о том, что это только внешний вид окна, а не само окно со всей его работой, запрограммированными процессами там и так далее. Мы можем взять окно, в котором не только установлен внешний вид, но и которое связано как-то с другими окнами и частями программы, которое как-то работает уже. Вот такое окно будет называеться Window, например. Но внешний вид этого окна (расположение элементов на нём, кнопки слева или справа или внизу) будет называться UiWindow. И к окну Window будет подключаться вид окна UiWindow, чтобы придать окну определённый внешний вид. А окно Window уже можно будет подключать в каком-то месте программы, чтобы работать уже с готовым, полноценно работающим окном, которое и выглядит определённым образом, и работает по определённым правилам, имеет связи какие-то с другими элементами программы и что-то делает.
В названии переменной ui также означает, что там хранится объект интерфейса пользователя. UiWindow - это класс интерфейса пользователя, а ui - это объект этого класса - класса интерфейса пользователя.

В общем, чтобы изучать PyQt, надо сначала освоить парадигму ООП. PyQt полностью выполнено в этой парадигме и соблюдает её правила во всех своих частях. Питон же сам соблюдает парадигму ООП не полностью и имеет ещё некоторые хаки, которые выглядят как ООП, но по сути устроены по-другому. Так что без понимания парадигмы ООП тебе будет сложно понимать логику устройства PyQT, а также будет сложно понимать сам питон в некоторых моментах.


tags: assembler programers



Отредактировано py.user.next (Сен. 24, 2018 04:19:11)

Офлайн

#5 Сен. 24, 2018 10:23:48

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Асемблерщик, трудности понимания классов в связка с PyQt

Дополнение к вопросу 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().

Офлайн

#6 Сен. 24, 2018 22:15:55

Faun_
Зарегистрирован: 2018-09-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Асемблерщик, трудности понимания классов в связка с PyQt

Всем спасибо за подсказки, пака(с их помощью) углублюсь в самостоятельное разбирательство. *напомню, что я ищу понимания, ка оно устроено(я ассемблерщик, у нас не нет ни чего абстрактного, потому для меня всё это так сложно)
..А ваш py.user.next камешек, заброшу-ка обратно, ..в родной огород. У вас комплекс короткой проги? У меня таких заморочек нет,.. по мне, толщина важней!(Длинная может и не влезть, а если толстая, это даже приятно ). А что до длинны, она сама вырастит, сколько ей нада. Если писать хорошо(продумано разбить на функциональные блоки), размер не сильно сказывается на ее понимании. Кроме того… перечитайте первую месагу, я и намека не сделал, что я КРУТОЙ ассемблерщик. Если вы выдрали это из “…увлекаюсь этим почти с детства”, то хотя-б спросили сколько мне, а потом уже предложили обнулить самомнение(которое я кстати и не обозначил).
….
Кстати, наткнулся на интересную штуку, есть оказывается проги, которые из программы делают такую картинку. Попробую, вдруг поможет, что там куда..

Офлайн

#7 Сен. 25, 2018 01:37:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Асемблерщик, трудности понимания классов в связка с PyQt

Faun_
то хотя-б спросили сколько мне
Мне всё равно. Я смотрю на твои вопросы и из этого понимаю твой уровень в целом, не в ассемблере, а вообще. Вопросы у тебя тупые - значит, ты полный ноль.

Faun_
Если писать хорошо(продумано разбить на функциональные блоки)
Дорогуша, это и есть абстрагирование, только в примитивной парадигме. Ты даже в это не врубаешься.

Faun_
а потом уже предложили обнулить самомнение(которое я кстати и не обозначил).
Ты просто очередной дурачок, который думает, что может просто рассказать всем, как он круто программирует, и никто его проверять не станет. Ты код свой на ассемблере не привёл нигде и мы это заметили.



Отредактировано py.user.next (Сен. 25, 2018 01:43:58)

Офлайн

#8 Сен. 25, 2018 10:26:38

Faun_
Зарегистрирован: 2018-09-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Асемблерщик, трудности понимания классов в связка с PyQt

С удовольствием вас проигнорирую, ..но есть тенденция,.. не все читают ветку целиком, и по этому составляют представление о теме разговора по самым ГРОМКИМ сообщениям.
Не однократно ссылался что я ассеблерщик, чтобы подчеркнуть тот факт, что с абстрактными понятями(которыми изобилует ООП) у меня совсем беда(но ни куда не денешся, нада разбираться). Фактически вы правы, я тупой, но я пришел в соответствующий раздел, и не обязан испытывать комплексов, по этому поводу.
….Кто просто заглянул сюда, проясню картину, py.user.next на ровном месте решил что я заявил о своей крутости из-за того, что я несколько раз подчеркнул что я закоренелый ассемблерщик, но я это сделал чтобы обьяснить, что абстрактные понятия, которыми изобилует высокоуровневка, для меня просто …магия какая-то! На все вопросы я получил ответы, но из-за другова типа мышления(что есть, то есть,.. чего нет, того нет), над ними продолжают висеть вопросики.. поэтому я пака займусь ими сам.
…пака писал, py.user.next отредактировал свою месагу, и теперь моя может казаться неадекватной..(короче тот еще ущак помоев вывернул). Я свою редактировать не буду, я то уже прочитал, в свой адрес..

Отредактировано Faun_ (Сен. 25, 2018 10:30:28)

Офлайн

#9 Сен. 25, 2018 11:06:40

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Асемблерщик, трудности понимания классов в связка с PyQt

Faun_
пака писал, py.user.next отредактировал свою месагу
Я ничего не редактировал, ты просто дебил какой-то.

Faun_
но я это сделал чтобы обьяснить, что абстрактные понятия, которыми изобилует высокоуровневка, для меня просто …магия какая-то!
Блин, оно для тебя магия потому, что ты абсолютно не компетентный. Вот и всё.



Отредактировано py.user.next (Сен. 25, 2018 11:09:10)

Офлайн

#10 Сен. 25, 2018 12:49:26

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

Асемблерщик, трудности понимания классов в связка с PyQt

 def __init__(self, parent=None):    ## -2- ## Что такое "parent=None"?.

Faun_
Вызов функции с параметрами по умолчанию - это какая-то невероятная абстракция? Я фигею, дорогая редакция. Никто не будет относиться к тебе серьезно, если ты с вопросами настолько детсадовского уровня в детсадовской постановке с детсадовской лексикой и детсадовским мировоззрением тем не менее заявляешь себя специалистом в программировании. Что это вообще за “ассемблерщик” такой? Где-то учат конкретно на ассемблерщика? Или ты с детства настолько любишь ассемблер, что мимо тебя прошли учебники Ричи, Вирта, Макконела, Таненбаума в конце концов? Бред какой-то.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version