Форум сайта python.su
PEHDOMя имею ввиду предложенный Вами код стр.2 пост 4
в смысле? какой “этот метод”
PEHDOMполучилось )))
super().__init__(*args, **kwargs)
Отредактировано Kyrym (Апрель 11, 2017 16:27:01)
Офлайн
enumerate работает везде где работает in. только in перебирает элементы последовательности, а enumerate еще и выводит… порядковый номер элемента чтоле, позволяя избавиться от необходимости инициализировать и обновлять отдельную переменную-счётчик.
[code python][/code]
Офлайн
Kyrymда, пока они храняться в памяти
И эти имена объектов “<PyQt4.QtGui.QLineEdit object at 0x00000000038A0C18>” постоянные?
KyrymПо моему нет, это всего лишь текстовое представление, генерируемое встроеным методом __str__
Можно ли на них ссылаться?
KyrymУ всех виджетов PyQt есть атрибут objectName, устанавливвется методом .setObjectName(name), и возвращаеться .objectName()
Можно ли по названию удалить некоторые поля из общей сетки
Kyrymчтобы удалить а потом вставить на его место другой виджет вам нужно запомнить его местоположение в сетке. Я уже приводил вам несколько вариантов решения ранее http://python.su/forum/topic/32446/?page=1#post-177512, Сходу могу еще пару тройку придумать.
и вставить (вставить, понятное дело, можно) на их позиции другие элементы?
Kyrymреально, в любом табличном процессоре это реализовано.
Или по имени для одной ячейки (из всей сетки) сделать проверку вводимых значений? Вопрос в том, реально ли такое?
Kyrymвсе завивит от того насколько однотипными будут ваши элементы в сетке.
И ещё меня интересует вопрос. Вообще я хочу сделать сетку (30х7, где 30 - это строки), столбцы которой будут лайнэдитами, кнопками, раскрывающимися списками. Отдельные ячейки с проверкой вводимых значений. Как думаете, стоит ли мне пытаться решить такую задачу последней методикой?
Kyrymпри таком колличетсве возможно вам действительно стоит помотреть в сторону TableWidget как советовал MrViktor, или mvc? Например вот тут https://habrahabr.ru/post/139454/ как раз пример паттерна mvc очень похожий на ваш только упрощен до минимума, одна строка три поля.
Может лучше вернуться к начальному варианту с индексами из стр. 1 поста 4, или вообще всё руками прописать? Руками бы я уже сделал, но хотелось сделать правильно - технологично! ))
[code python][/code]
Отредактировано PEHDOM (Апрель 11, 2017 18:32:15)
Офлайн
Ох… что-то не понятное создает автор.
Можно еще рассмотреть создание своего виджета с использованием QScrollArea, где можно будет создавать/удалять QLineEdit, но тут надо хорошо продумать реализацию.
Kyrym
Может на словах опишете задачу (общую картину работы). Возможно вы выбрали изначально не правильный путь решения (реализации).
Офлайн
MrViktorНе понял при чём тут QScrollArea.
QScrollArea
MrViktorОй, описывать я долго буду, да и думаю, это не сильно интересно. Я пока заморозил этот проект. Зато делаю другой, и успешно внедрил метод PEHDOM'a.
Kyrym
Может на словах опишете задачу (общую картину работы). Возможно вы выбрали изначально не правильный путь решения (реализации).
self.edit = QtGui.QLineEdit()
class MyTextEdit ... s = ... GridLayout.self.edit.setText(str(s)) GridLayout.__init__.self.edit.setText(str(s)) ... class GridLayout(QtGui.QWidget): def __init__(self, parent=None, *args, **kwargs): ...
Отредактировано Kyrym (Апрель 17, 2017 16:27:00)
Офлайн
Kyrymчето я нихрена не понял.. словами вы пишеете одно а в коде у вас другое.
В фунции valueChange класса MyTextEdit получили сумму ‘s’, и теперь нужно эту сумму вставить в поле self.edit.
Ни к чему не приводят попытки сделать вот так:
Kyrymа коде у вас
В классе GridLayout создали обычным образом текстовое поле:
class MyTextEdit ... s = ... GridLayout.self.edit.setText(str(s)) GridLayout.__init__.self.edit.setText(str(s))
[code python][/code]
Отредактировано PEHDOM (Апрель 17, 2017 17:00:56)
Офлайн
PEHDOMНадо было мне полный код выложить.
чето я нихрена не понял.. словами вы пишеете одно а в коде у вас другое.
# 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) self.textChanged.connect(GridLayout.gl(self,s)) #self.textChanged.connect(GridLayout.gl) 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('Заголовок') self.grid = QtGui.QGridLayout() # ПОЛЯ n = 6 # строк m = 2 # столбцов for i in range(n): resultPole = MyTextEdit() # поле результата resultPole.setStyleSheet(sss_vivod) self.grid.addWidget(resultPole,i,m+2) butCopy = QtGui.QPushButton('Copy') butCopy.clicked.connect(resultPole.valueCopy) self.grid.addWidget(butCopy,i,m+1) for j in range(m): sourcePole = QtGui.QLineEdit() # поле данных sourcePole.setStyleSheet(sss) self.grid.addWidget(sourcePole,i,j) resultPole.addPole(sourcePole) # добавляем ссылку на поле в список sourcePole.textChanged.connect(resultPole.valueChange) self.pole_vivod = QtGui.QLineEdit() self.grid.addWidget(self.pole_vivod, n+1,m+2) self.setLayout(self.grid) def gl(self,s): s = MyTextEdit.valueChange(self,s) #s = MyTextEdit.valueChange(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_())
Отредактировано Kyrym (Апрель 17, 2017 20:00:27)
Офлайн
Kyrymда вы шутите… как вы вообще чтото пишете не понимая таких элементарных вещей?
Я понимаю, что self показывает принадлежность к экземпляру класса, но когда надо прописывать self, а когда не надо, мне не понятно, поэтому стараюсь писать везде, где это относится к конструктивным элементам.
KyrymЧестно говоря нихрена всеравно непонятно, вы просто хотите чтобы когда менялось значение в любом MyTextEdit-е оно передавалось в pole_vivod?
Механика
Когда в sourcePole мы вводим значения, срабатывает функция valueChange. Она считает нам сумму s, запускает сигнал self.textChanged.connect(GridLayout.gl(self,s)), который должен передать аргумент s в функцию gl класса GridLayout, а там значение s должно приниматься s = MyTextEdit.valueChange.
Если я пишу так: s = MyTextEdit.valueChange(self,s), то программа уходит в бесконечный цикл.
# 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('Заголовок') self.grid = QtGui.QGridLayout() # ПОЛЯ n = 6 # строк m = 2 # столбцов for i in range(n): resultPole = MyTextEdit() # поле результата resultPole.textChanged.connect(self.gl) resultPole.setStyleSheet(sss_vivod) self.grid.addWidget(resultPole,i,m+2) butCopy = QtGui.QPushButton('Copy') butCopy.clicked.connect(resultPole.valueCopy) self.grid.addWidget(butCopy,i,m+1) for j in range(m): sourcePole = QtGui.QLineEdit() # поле данных sourcePole.setStyleSheet(sss) self.grid.addWidget(sourcePole,i,j) resultPole.addPole(sourcePole) # добавляем ссылку на поле в список sourcePole.textChanged.connect(resultPole.valueChange) self.pole_vivod = QtGui.QLineEdit() self.grid.addWidget(self.pole_vivod, n+1,m+2) self.setLayout(self.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_())
[code python][/code]
Отредактировано PEHDOM (Апрель 17, 2017 22:51:21)
Офлайн
PEHDOMКак оказывается, всё просто.
resultPole.textChanged.connect(self.gl)
PEHDOMИменно так. Суть в том, что pole_vivod не принадлежит классу MyTextEdit, в котором происходят расчёты, а результаты из MyTextEdit получает. Для меня это было важно.
вы просто хотите чтобы когда менялось значение в любом MyTextEdit-е оно передавалось в pole_vivod?
PEHDOMЭто я знаю. Вопрос в том, как это применять на практике. Я читал, про self, но пока так и не понял.
self пишется только когда вы описываете класс, оно означает собственно сам себя
PEHDOMЭтого мало, программа не понимает, что нужно вставить, нет никаких ссылок на ‘s’ как было в функции:
можно вообще обойтись без def gl, а resultPole.textChanged.connect(self.gl) заменить на resultPole.textChanged.connect(self.pole_vivod.setText)
Только self.pole_vivod нужно обьявить до цикла.
def gl(self,s):
# Python 3. PyQt4 # -*- coding: utf-8 -*- # подвариант 2 без доп функции gl 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)) return s print(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('Заголовок') self.grid = QtGui.QGridLayout() # ПОЛЯ n = 6 # строк m = 2 # столбцов for i in range(n): resultPole = MyTextEdit() # поле результата resultPole.setStyleSheet(sss_vivod) self.grid.addWidget(resultPole,i,m+2) butCopy = QtGui.QPushButton('Copy') butCopy.clicked.connect(resultPole.valueCopy) self.grid.addWidget(butCopy,i,m+1) self.pole_vivod = QtGui.QLineEdit() resultPole.textChanged.connect(self.pole_vivod.setText) self.grid.addWidget(self.pole_vivod, n+1,m+2) for j in range(m): sourcePole = QtGui.QLineEdit() # поле данных sourcePole.setStyleSheet(sss) self.grid.addWidget(sourcePole,i,j) resultPole.addPole(sourcePole) # добавляем ссылку на поле в список sourcePole.textChanged.connect(resultPole.valueChange) self.setLayout(self.grid) app = QtGui.QApplication(sys.argv) qb = GridLayout() qb.move(250,250) qb.show() sys.exit(app.exec_())
Отредактировано Kyrym (Апрель 18, 2017 20:14:03)
Офлайн
Kyrymпереместите self.pole_vivod = QtGui.QLineEdit() и self.grid.addWidget(self.pole_vivod, n+1,m+2) сразу после m = 2 # столбцов и будет вам щастье, а у вас оно создает 6 лайн едитов, и помещает их один над одним, потому у вас ничего и не получаеться.
Вот код, правленный, как Вы сказали - без функции:
class GridLayout(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setWindowTitle('Заголовок') self.grid = QtGui.QGridLayout() self.pole_vivod = QtGui.QLineEdit() # ПОЛЯ n = 6 # строк m = 2 # столбцов self.grid.addWidget(self.pole_vivod, n+1,m+2) for i in range(n): resultPole = MyTextEdit() # поле результата resultPole.setStyleSheet(sss_vivod) self.grid.addWidget(resultPole,i,m+2) butCopy = QtGui.QPushButton('Copy') butCopy.clicked.connect(resultPole.valueCopy) self.grid.addWidget(butCopy,i,m+1) resultPole.textChanged.connect(self.pole_vivod.setText) for j in range(m): sourcePole = QtGui.QLineEdit() # поле данных sourcePole.setStyleSheet(sss) self.grid.addWidget(sourcePole,i,j) resultPole.addPole(sourcePole) # добавляем ссылку на поле в список sourcePole.textChanged.connect(resultPole.valueChange) self.setLayout(self.grid)
Kyrymэтого более чем достаточно, читаем документацию
Этого мало, программа не понимает, что нужно вставить, нет никаких ссылок на ‘s’ как было в функции:
Kyrymчто конкретно непонятно? По помему на тостере по вашей сссылке вполне доступно обьяснено.
Это я знаю. Вопрос в том, как это применять на практике. Я читал, про self, но пока так и не понял.
[code python][/code]
Отредактировано PEHDOM (Апрель 18, 2017 22:18:14)
Офлайн