Найти - Пользователи
Полная версия: как удалить элементы GUI созданные программой
Начало » GUI » как удалить элементы GUI созданные программой
1
margadon
есть метод :
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

по числу в spinBox1 надо рисовать матрицу других спинбоксов. она рисуется ( в примере только первая колонка), но только если значение в spinBox1 растет.
Подскажите как удялять спинбоксы если значение уменьшается? я пробуюв том-же цикле, вот этот фрагмент:
if i>self.spinBox_1.value():
                spinBox.close()
но не выходит ( не удаляются они. ) Может как-то можно при вызове метода убивать всех спинбоксов, которые там до этого были и рисовать их по новой?
KriO
В цикле, где формируете спинбоксы, добавляйте их в список, а потом удаляйте элементы списка.
Например:
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()
KriO
Небольшое уточнение: надо ещё и из списка, конечно же, удалить spinBox после close()
margadon
попробовал такой текст:
    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()
все равно не удаляет.
KriO
Список для хранения спинбоксов надо инициализировать вне метода и не надо чистить по изменению значения в спинбоксе с количеством. Для удаления надо просто вызывать метод списка remove для конкретного спинбокса. Переменная prevSBval не нужна, для этих целей можно использовать длину списка.
margadon
Крио, спасибо за помощь, со всей мочи пытаюсь следовать Вашим советам но только запутываюсь еще больше. Как использовать длину списка вместо переменной, когда при первом вхождении в цикл список пустой и длина его нулевая? метод remove требует идентификации спинбокса - а именно с этим у меня и главная проблема. Если например написать что-то вроде

print spinBoxList
то он выдает мне такой объект:
<PyQt4.QtGui.QSpinBox object at 0x0000000002E68948>
после at стоит его id в hex формате. Как сказано в писании, переменные в питоне ссылаются на данные, а не содержат их, но обнулить ссылку например так: id(spinBox)=0 змей не дает. как-же мне быть-то?

Если список не чистить после изменения значения в спинбоксе с количеством, метод пытается удалить несуществующие спинбоксы и вылетает… помогите примером, я сон потерял. масло в огонь подливает еще тот факт, что метод почему-то вызывается 2 раза, когда значение с количеством меняется только один раз…
KriO
Вот тестик. Я для теста добавила спинбокс в 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_())
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB