Форум сайта python.su
Оффтоп
PEHDOMВозьмём Ваш код (я пониамю, что он переделывался из моего, но всё равно):
что конкретно непонятно?
# -*- coding: utf-8 -*- import sys from PyQt4 import QtGui class GridLayout(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setWindowTitle('Заголовок') self.grid = QtGui.QGridLayout() # ПОЛЯ names_pole = ['12','7','4'] for i,name in enumerate(names_pole): pole = QtGui.QLineEdit(name) self.grid.addWidget(pole,i,0) pole.textChanged.connect(self.on_start) # сигнал изм текста pole = QtGui.QLineEdit() self.grid.addWidget(pole,i,1) # КНОПКИ names_button = ['Copy', 'Copy', 'Copy'] for i, name in enumerate(names_button): button = QtGui.QPushButton(name+str(i)) self.grid.addWidget(button, i,2) button.clicked.connect(self.on_click) self.setLayout(self.grid) def on_start(self): pole = self.sender() #Лайн едид отправитель сигнала idx = self.grid.indexOf(pole) # индекс отправителя сигнала location = self.grid.getItemPosition(idx) # положение в гриде poleX2 = self.grid.itemAtPosition(location[0],location[1]+1).widget() # соседнее поле poleX2.setText(pole.text()*2) print('старт', pole.text()*2) def on_click(self): button = self.sender() idx = self.grid.indexOf(button) location = self.grid.getItemPosition(idx) pole = self.grid.itemAtPosition(location[0],location[1]-1).widget() print(pole.text(),'клик') app = QtGui.QApplication(sys.argv) qb = GridLayout() qb.show() sys.exit(app.exec_())
self.grid = QtGui.QGridLayout()
grid = QtGui.QGridLayout()
#!/usr/bin/env python #-*-coding:utf-8-*- from PyQt4.Qt import * class Widget(QWidget): # Класс Widget наследует класс QWidget def __init__(self): # Создаёт конструктор класса QWidget.__init__(self) self.edit1 = QLineEdit() # Создаём верхнее поле self.edit2 = QLineEdit() # Создаём нижнее поле self.lbl = QLabel() # Создаём текстовую строку self.btn = QPushButton("Calc") # Создаём кнопку с именем calc # Блок задаёт расположение виджетов по вертикали self.lay = QVBoxLayout(self) self.lay.addWidget(self.edit1) self.lay.addWidget(self.edit2) self.lay.addWidget(self.lbl) self.lay.addWidget(self.btn) self.edit2.returnPressed.connect(self.on_click) # Вернуть при нажатии - сигнал # обработчик - соединить self.btn.clicked.connect(self.on_click) def on_click(self): self.lbl.setText('Value: '+str(float(self.edit1.text())*float(self.edit2.text()))) if __name__=="__main__": app = QApplication([]) w = Widget() w.move(0,0) w.resize(400,100) w.show() app.exec_()
#!/usr/bin/python # fontdialog.py import sys from PyQt4 import QtGui from PyQt4 import QtCore class FontDialog(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) hbox = QtGui.QHBoxLayout() self.setGeometry(300, 300, 250, 110) self.setWindowTitle('FontDialog') button = QtGui.QPushButton('Dialog', self) button.setFocusPolicy(QtCore.Qt.NoFocus) button.move(20, 20) hbox.addWidget(button) self.connect(button, QtCore.SIGNAL('clicked()'), self.showDialog) self.label = QtGui.QLabel('Knowledge only matters', self) self.label.move(130, 20) hbox.addWidget(self.label, 1) self.setLayout(hbox) def showDialog(self): font, ok = QtGui.QFontDialog.getFont() if ok: self.label.setFont(font) app = QtGui.QApplication(sys.argv) cd = FontDialog() cd.show() app.exec_()
self.label = QtGui.QLabel('Knowledge only matters', self)
Офлайн
KyrymТак без понимания, будет очень трудно.
Это я знаю. Вопрос в том, как это применять на практике. Я читал, про self, но пока так и не понял.
class Тумбочка(): ящики = None def __init__(self, кол_ящ = None): self.ящики = кол_ящ тумбочка_Ивана = Тумбочка(2) тумбочка_Ильи = Тумбочка(3)
class Тумбочка(): ящики = None тумбочка_Ивана = Тумбочка(2) тумбочка_Ильи = Тумбочка(3)
Офлайн
Мне кажется, стоило написать так:
class Тумбочка(): def __init__(self, кол_ящ = None): self.ящики = кол_ящ тумбочка_Ивана = Тумбочка(2) тумбочка_Ильи = Тумбочка(3) print('тумбочка_Ивана = ',тумбочка_Ивана.ящики) print('тумбочка_Ильи = ',тумбочка_Ильи.ящики)
MrViktorДа, это понятно, вопрос в том, когда для этой переменной нужно писать self (если он ставится автоматом), а когда нет?
чертеж в котором нарисована тумбочка без ящиков и отсутствует информация, что они там вообще могут быть.
классов дал на русском только для лучшего понимания (в реальности так делать НЕЛЬЗЯ)Если писать для себя, то так делать всё-таки можно )))
Отредактировано Kyrym (Апрель 19, 2017 09:58:25)
Офлайн
KyrymДавайте тогда на базе этого примера и продолжим.
Строчка “ящики = None”, думаю, не нужна.
тумбочка_Ивана = Тумбочка(2)
class Тумбочка(): ящики = None def __init__(self, кол_ящ = 2): if кол_ящ != 0: self.ящики = кол_ящ
KyrymПотому что, self.ящики = 2 если опять же перенести это в реальный мир, для человека сборщика будет звучать так: “Собрать тумбочку_Ивана по чертежу Тумбочка и сделать в ней два ящика”, а запись ящики = 2 для него будет звучать так “дочертить на чертеже Тумбочка два ящика” - тут мы услышим весь матерный запас сборщика (т.к. он не чертежник) Но это все конечно утрированно, но по сути верно.
Типа:
“ящики = кол_ящ”, а программа бы сама сделала “self.ящики = кол_ящ”
Офлайн
KyrymУ-у-у как у вас все запущено…..
Здесь написано
self.grid = QtGui.QGridLayout()
Почему не написать
grid = QtGui.QGridLayout()
?
Ведь self должен подставится автоматом?
grid = QtGui.QGridLayout()
self.grid = QtGui.QGridLayout()
def on_start(self): pole = self.sender() #Лайн едид отправитель сигнала idx = self.grid.indexOf(pole) # индекс отправителя сигнала location = self.grid.getItemPosition(idx) # положение в гриде poleX2 = self.grid.itemAtPosition(location[0],location[1]+1).widget() # соседнее поле poleX2.setText(pole.text()*2) print('старт', pole.text()*2)
qb = GridLayout() location = qb.grid.getItemPosition(5)
# Python 3. PyQt4 # -*- coding: utf-8 -*- import sys from PyQt4 import QtGui, QtCore sss_vivod = ("background-color: #d0f0c0; font: 10pt 'Arial black'") sss = ("background-color: #edecbe; font: 10pt") class MyTextEdit(QtGui.QLineEdit): # создаем свой класс наследуя QLineEdit def __init__(self, *args, **kwargs): super().__init__() self.poles = [] # пустой список ссылок на поля вычислений def addPole(self, pole): self.poles.append(pole) # добавляем ссылку на поле в список print(self.poles) def valueChange(self,*args): s=0 # по умолчанию результат = 0 for pole in self.poles: text = pole.text() if text: s+=int(text) # прошлый результат + новое значение self.setText(str(s)) print(s) return s def valueCopy(self,*args): self.selectAll() # выделяем все self.copy() # копируем в буфер class GridLayout(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setWindowTitle('Заголовок') grid = QtGui.QGridLayout() # ПОЛЯ n = 6 # строк m = 2 # столбцов for i in range(n): resultPole = MyTextEdit() # поле результата resultPole.textChanged.connect(self.gl) resultPole.setStyleSheet(sss_vivod) grid.addWidget(resultPole,i,m+2) butCopy = QtGui.QPushButton('Copy') butCopy.clicked.connect(resultPole.valueCopy) grid.addWidget(butCopy,i,m+1) for j in range(m): sourcePole = QtGui.QLineEdit() # поле данных sourcePole.setStyleSheet(sss) grid.addWidget(sourcePole,i,j) resultPole.addPole(sourcePole) # добавляем ссылку на поле в список sourcePole.textChanged.connect(resultPole.valueChange) self.pole_vivod = QtGui.QLineEdit() grid.addWidget(self.pole_vivod, n+1,m+2) self.setLayout(grid) def gl(self, s): print('приём s = ',s) self.pole_vivod.setText(str(s)) app = QtGui.QApplication(sys.argv) qb = GridLayout() qb.move(250,250) qb.show() sys.exit(app.exec_())
class A(): # Новый класс x=2 # атрибут x класса А y=4 # атрибут y класса А def __init__(self, x, z, n): #метод __init__ класса А self.x = x # атрибут x экземпляра класса А self.z = z # атрибут z экземпляра класса А w = n # локальная переменная def print(self, num): #метод print класса А print('self.x + num =',self.x + num)
>>> print('A.x=',A.x) A.x= 2 print('A.y=',A.y) A.y= 4 print('A.z=',A.z) Traceback (most recent call last): File "<модуль1>", line 15, in <module> AttributeError: type object 'A' has no attribute 'z' >>>
a = A(x = 8, z = 22, n = 14) # создаем экземпляр класса А print('A.x=',A.x) print('A.y=',A.y) print('a.x=',a.x) print('a.y=',a.y) print('a.z=',a.z) >>> A.x= 2 A.y= 4 a.x= 8 a.y= 4 a.z= 22 >>>
print('a.w=',a.w) >>> Traceback (most recent call last): File "<модуль1>", line 20, in <module> AttributeError: 'A' object has no attribute 'w'
a = A(x = 8, z = 22, n = 14) # создаем экземпляр класса А A.print(a,2) >>> self.x + num = 10
a.print(2) >>> self.x + num = 10
Kyrymеще раз повторюсь, self это “указатель” на экземпляр класса из которого вы вызываете метод.
Здесь есть такая строчка:
self.label = QtGui.QLabel('Knowledge only matters', self)
Здесь с селфом вообще не понятно.
QLabel::QLabel ( const QString & text, QWidget * parent = 0, Qt::WindowFlags f = 0 )QLabel принимает в качестве первого аргумента текст самого лейбла, а вторым можно указать родительский виджет (не путать с родительским классом)
Создаёт метку, которая отображает текст text.
The parent and widget flag f, arguments are passed to the QFrame constructor.
[code python][/code]
Отредактировано PEHDOM (Апрель 19, 2017 12:11:50)
Офлайн
PEHDOMАга, очень сильно запущено, но думаю он не безнадежен.
PEHDOMЕще добавлю, любая переменная объявленная внутри функции, процедуры существует (живет), пока данная функция, процедура не завершит свою работу. Таким образом объявленная переменная grid внутри __init__ прекратит свое существование после завершения работы данного метода, а self.grid - это объявление атрибута объекта и она будет существовать пока существует этот объект.
grid обьявляеться внутри def __init__ тоесть исходя из вышенаписаного переменная grid связана с областью видимости функции __init__ (локальная переменная), видна только внутри кода __init__ и к ней нельзя обратиться “извне”. А self.grid это уже атрибут инстанса класса GridLayout, и к нему вы можете обратиться из других методов класса, и даже извне класса(поробнее про классы и экземпляры ниже).
Офлайн
Kyrymэто Qt правило - при уничтожении родителя автоматом уничтожаются все дочерние элементы, поэтому и надо явно указывать родителя для освобождения памяти. в питоне это не так актуально, как в С++.
Здесь с селфом вообще не понятно.
Офлайн
PEHDOM и MrViktor, спасибо вам большое, теперь я понял разницу в использовании self.
Офлайн
KyrymДа всегда пожалуйста!
PEHDOM и MrViktor, спасибо вам большое, теперь я понял разницу в использовании self.
Офлайн
MrViktorА вот я как-раз и набросал сейчас программку с селфами. Программа ловит исключения: если может перевести значение поля в вещественное, то выводит это число, в противном случае выводит 0. И как раз две функции работают друг с другом.
Поздравляю, надо бы еще экзамен провести
# Python 3. PyQt4 # -*- coding: utf-8 -*- import sys from PyQt4 import QtGui, QtCore # ЦВЕТА ПОЛЕЙ sss_vivod = ("background-color: #456173; color: #f2f2f0; font: 14pt 'Courier New'") # ДАННЫЕ # ГРАФИКА class Window(QtGui.QWidget): # Класс Window наследует класс QWidget def __init__(self, parent=None, *args, **kwargs): # Создаёт конструктор класса, parent - ссылка на родительский эл-т QtGui.QWidget.__init__(self, parent) self.setMinimumSize(200, 200) # Ширина и высота окна self.resize(200, 200) # шир / выс окна self.setWindowTitle('Исключения') # Заголовок self.setWindowIcon(QtGui.QIcon('icon.png')) # Иконка # БЛОК РАЗМЕТКИ self.vbox_os = QtGui.QVBoxLayout() # --- self.pole = QtGui.QLineEdit() self.pole.setStyleSheet(sss_vivod) self.vbox_os.addWidget(self.pole) # --- self.btn = QtGui.QPushButton('Выполнить') self.btn.clicked.connect(self.on_start) self.vbox_os.addWidget(self.btn) # --- self.pole_vivod = QtGui.QTextEdit('') self.pole_vivod.setStyleSheet(sss_vivod) self.vbox_os.addWidget(self.pole_vivod) # --- self.setLayout(self.vbox_os) # установка рабочей области # ЛОГИКА def on_start(self, x=None): a = self.pole.text() print('on_start до функции, a =',a) Window.in_ch_f(self,a) a = self.x print('on_start после функции, a =',a) self.pole_vivod.setText(str(a)) print('-'*50) def in_ch_f(self,x): try: self.x = float(x) print('try, x =',x) except: self.x = 0 print('except, x =',x) # КОНЕЦ if __name__ == "__main__": app = QtGui.QApplication(sys.argv) window = Window() # создаёт экземпляр окна из класса window.show() # запускает окно sys.exit(app.exec_())
# Python 3. PyQt4 # -*- coding: utf-8 -*- import sys from PyQt4 import QtGui, QtCore # ЦВЕТА ПОЛЕЙ sss_vivod = ("background-color: #456173; color: #f2f2f0; font: 12pt 'Courier New'") # ДАННЫЕ # ГРАФИКА class Window(QtGui.QWidget): # Класс Window наследует класс QWidget def __init__(self, parent=None, *args, **kwargs): # Создаёт конструктор класса, parent - ссылка на родительский эл-т QtGui.QWidget.__init__(self, parent) self.setMinimumSize(200, 200) # Ширина и высота окна self.resize(200, 200) # шир / выс окна self.setWindowTitle('Исключения') # Заголовок self.setWindowIcon(QtGui.QIcon('icon.png')) # Иконка # БЛОК РАЗМЕТКИ self.vbox_os = QtGui.QVBoxLayout() # --- self.pole = QtGui.QLineEdit() self.pole.setStyleSheet(sss_vivod) self.vbox_os.addWidget(self.pole) # --- self.pole_2 = QtGui.QLineEdit() self.pole_2.setStyleSheet(sss_vivod) self.vbox_os.addWidget(self.pole_2) # --- self.btn = QtGui.QPushButton('Выполнить') self.btn.clicked.connect(self.on_start) self.vbox_os.addWidget(self.btn) # --- self.pole_vivod = QtGui.QTextEdit('') self.pole_vivod.setStyleSheet(sss_vivod) self.vbox_os.addWidget(self.pole_vivod) # --- self.setLayout(self.vbox_os) # установка рабочей области # ЛОГИКА def on_start(self, x=None): def ap(i): data.append(i) data = [] self.pole_vivod.setText('') a = self.pole.text() print('on_start до функции, a =',a) Window.in_ch_f(self,a) a = self.x print('on_start после функции, a =',a) ap(a) print('-'*50) b = self.pole_2.text() print('on_start до функции, b =',b) Window.in_ch_f(self,b) b = self.x print('on_start после функции, b =',b) ap(b) print('='*50) for i in data: self.pole_vivod.append(str(i)) def in_ch_f(self,x): try: self.x = float(x) print('try, x =',x) except: self.x = 0 print('except, x =',x) # КОНЕЦ if __name__ == "__main__": app = QtGui.QApplication(sys.argv) window = Window() # создаёт экземпляр окна из класса window.show() # запускает окно sys.exit(app.exec_())
Отредактировано Kyrym (Апрель 20, 2017 15:16:38)
Офлайн