Форум сайта python.su
0
есть метод :
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)
Офлайн
9
В цикле, где формируете спинбоксы, добавляйте их в список, а потом удаляйте элементы списка.
Например:
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()
Офлайн
9
Небольшое уточнение: надо ещё и из списка, конечно же, удалить spinBox после close() 
Офлайн
0
попробовал такой текст:
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)
Офлайн
9
Список для хранения спинбоксов надо инициализировать вне метода и не надо чистить по изменению значения в спинбоксе с количеством. Для удаления надо просто вызывать метод списка remove для конкретного спинбокса. Переменная prevSBval не нужна, для этих целей можно использовать длину списка.
Офлайн
0
Крио, спасибо за помощь, со всей мочи пытаюсь следовать Вашим советам но только запутываюсь еще больше. Как использовать длину списка вместо переменной, когда при первом вхождении в цикл список пустой и длина его нулевая? метод remove требует идентификации спинбокса - а именно с этим у меня и главная проблема. Если например написать что-то вроде
print spinBoxList
то он выдает мне такой объект:
<PyQt4.QtGui.QSpinBox object at 0x0000000002E68948>
после at стоит его id в hex формате. Как сказано в писании, переменные в питоне ссылаются на данные, а не содержат их, но обнулить ссылку например так: id(spinBox)=0 змей не дает. как-же мне быть-то?
Если список не чистить после изменения значения в спинбоксе с количеством, метод пытается удалить несуществующие спинбоксы и вылетает… помогите примером, я сон потерял. масло в огонь подливает еще тот факт, что метод почему-то вызывается 2 раза, когда значение с количеством меняется только один раз…
Отредактировано margadon (Апрель 28, 2014 16:49:31)
Офлайн
9
Вот тестик. Я для теста добавила спинбокс в 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)
Офлайн