Форум сайта python.su
есть метод :
def on_spinBox_1_valueChanged(self):
for i in xrange(1, 20):
if i>2:
spinBox = QtGui.QSpinBox(self.widget_conmat)
spinBox.setGeometry(QtCore.QRect(36, 10+i*30, 21, 22))
spinBox.setButtonSymbols(QtGui.QAbstractSpinBox.NoButtons)
spinBox.setObjectName("spinBox"+str(i*20))
spinBox.setValue(i)
if i>self.spinBox_1.value():
spinBox.close()
print u'Количесво групп в программе = ', self.groupNumber
if i>self.spinBox_1.value(): spinBox.close()
Отредактировано margadon (Апрель 24, 2014 15:18:08)
Офлайн
В цикле, где формируете спинбоксы, добавляйте их в список, а потом удаляйте элементы списка.
Например:
def on_spinBox_1_valueChanged(self): self.spinBoxL = [] for i in xrange(1, 20): if i>2: spinBox = QtGui.QSpinBox(self.widget_conmat) self.spinBoxL.append(spinBox) spinBox.setGeometry(QtCore.QRect(36, 10+i*30, 21, 22)) spinBox.setButtonSymbols(QtGui.QAbstractSpinBox.NoButtons) spinBox.setObjectName("spinBox"+str(i*20)) spinBox.setValue(i) if i>self.spinBox_1.value(): spinBoxL[i].close()
Офлайн
Небольшое уточнение: надо ещё и из списка, конечно же, удалить spinBox после close()
Офлайн
попробовал такой текст:
def on_spinBox_1_valueChanged(self): global prevSBval if prevSBval<self.spinBox_1.value(): prevSBval=self.spinBox_1.value() self.spinBoxList = [] for i in xrange(1, prevSBval+1): if i>0: spinBox = QtGui.QSpinBox(self.widget_conmat) self.spinBoxList.append(spinBox) spinBox.setGeometry(QtCore.QRect(36, 10+i*30, 21, 22)) spinBox.setButtonSymbols(QtGui.QAbstractSpinBox.NoButtons) spinBox.setObjectName("spinBox"+str(i*20)) spinBox.setValue(i) if i>self.spinBox_1.value(): print i#self.spinBoxList[i] self.spinBoxList[i-1].close() # для верности удаляю весь список self.spinBoxList = [] #spinBox.close() print u'Количесво групп в программе = ', self.spinBox_1.value()
Отредактировано margadon (Апрель 25, 2014 17:09:10)
Офлайн
Список для хранения спинбоксов надо инициализировать вне метода и не надо чистить по изменению значения в спинбоксе с количеством. Для удаления надо просто вызывать метод списка remove для конкретного спинбокса. Переменная prevSBval не нужна, для этих целей можно использовать длину списка.
Офлайн
Крио, спасибо за помощь, со всей мочи пытаюсь следовать Вашим советам но только запутываюсь еще больше. Как использовать длину списка вместо переменной, когда при первом вхождении в цикл список пустой и длина его нулевая? метод remove требует идентификации спинбокса - а именно с этим у меня и главная проблема. Если например написать что-то вроде
print spinBoxList
то он выдает мне такой объект:
<PyQt4.QtGui.QSpinBox object at 0x0000000002E68948>
после at стоит его id в hex формате. Как сказано в писании, переменные в питоне ссылаются на данные, а не содержат их, но обнулить ссылку например так: id(spinBox)=0 змей не дает. как-же мне быть-то?
Если список не чистить после изменения значения в спинбоксе с количеством, метод пытается удалить несуществующие спинбоксы и вылетает… помогите примером, я сон потерял. масло в огонь подливает еще тот факт, что метод почему-то вызывается 2 раза, когда значение с количеством меняется только один раз…
Отредактировано margadon (Апрель 28, 2014 16:49:31)
Офлайн
Вот тестик. Я для теста добавила спинбокс в QtGui.QVBoxLayout(), т.к. не знаю в какой контейнер Вы их добавляете. Но сути это не меняет. Удаление из списка сделала с конца.
#!/usr/bin/env python2 # -*- coding: iso-8859-5 -*- from PyQt4 import QtGui,QtCore class SpinBox(QtGui.QSpinBox): def __init__(self, index, parent=None): super(SpinBox, self).__init__(parent) self.setButtonSymbols(QtGui.QAbstractSpinBox.NoButtons) self.setGeometry(QtCore.QRect(36, 10+index*30, 21, 22)) self.setObjectName("spinBox"+str(index*20)) self.setValue(index) class Conmat(QtGui.QWidget): def __init__(self, parent=None): super(Conmat, self).__init__(parent) self.spinBoxL = [] self.vb = QtGui.QVBoxLayout() self.vb.setContentsMargins(0, 0, 0, 0) self.vb.setSpacing(0) self.setLayout(self.vb) sb = SpinBox(0, self) self.spinBoxL.append(sb) self.spinBoxL[0].setMinimum(1) self.spinBoxL[0].valueChanged.connect(self.addOrRemoveSpinBox) self.vb.addWidget(self.spinBoxL[0]) self.closeBut = QtGui.QPushButton("Close") self.closeBut.clicked.connect(self.closeApp) self.vb.addWidget(self.closeBut) def closeApp(self): self.close() def addOrRemoveSpinBox(self): for i in range(len(self.spinBoxL), self.spinBoxL[0].value()): self.spinBoxL.append(SpinBox(i, self)) self.vb.insertWidget(i,self.spinBoxL[i]) for i in range(self.spinBoxL[0].value(), len(self.spinBoxL)): sb = self.spinBoxL[-1] self.spinBoxL.pop() sb.close() print 'quantity = ', len(self.spinBoxL) if __name__ == '__main__': import sys app = QtGui.QApplication(sys.argv) conmat = Conmat() conmat.show() sys.exit(app.exec_())
Отредактировано KriO (Апрель 29, 2014 12:58:22)
Офлайн