Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » как удалить элементы GUI созданные программой [RSS Feed]

#1 Апрель 24, 2014 15:10:42

margadon
Зарегистрирован: 2014-04-16
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

как удалить элементы GUI созданные программой

есть метод :

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()
но не выходит ( не удаляются они. ) Может как-то можно при вызове метода убивать всех спинбоксов, которые там до этого были и рисовать их по новой?

Отредактировано margadon (Апрель 24, 2014 15:18:08)

Офлайн

#2 Апрель 24, 2014 17:11:57

KriO
Зарегистрирован: 2012-10-07
Сообщения: 61
Репутация: +  9  -
Профиль   Отправить e-mail  

как удалить элементы GUI созданные программой

В цикле, где формируете спинбоксы, добавляйте их в список, а потом удаляйте элементы списка.
Например:

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()

Офлайн

#3 Апрель 24, 2014 21:38:46

KriO
Зарегистрирован: 2012-10-07
Сообщения: 61
Репутация: +  9  -
Профиль   Отправить e-mail  

как удалить элементы GUI созданные программой

Небольшое уточнение: надо ещё и из списка, конечно же, удалить spinBox после close()

Офлайн

#4 Апрель 25, 2014 16:41:54

margadon
Зарегистрирован: 2014-04-16
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

как удалить элементы GUI созданные программой

попробовал такой текст:

    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)

Офлайн

#5 Апрель 26, 2014 00:40:25

KriO
Зарегистрирован: 2012-10-07
Сообщения: 61
Репутация: +  9  -
Профиль   Отправить e-mail  

как удалить элементы GUI созданные программой

Список для хранения спинбоксов надо инициализировать вне метода и не надо чистить по изменению значения в спинбоксе с количеством. Для удаления надо просто вызывать метод списка remove для конкретного спинбокса. Переменная prevSBval не нужна, для этих целей можно использовать длину списка.

Офлайн

#6 Апрель 28, 2014 14:07:34

margadon
Зарегистрирован: 2014-04-16
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

как удалить элементы GUI созданные программой

Крио, спасибо за помощь, со всей мочи пытаюсь следовать Вашим советам но только запутываюсь еще больше. Как использовать длину списка вместо переменной, когда при первом вхождении в цикл список пустой и длина его нулевая? метод remove требует идентификации спинбокса - а именно с этим у меня и главная проблема. Если например написать что-то вроде

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

Если список не чистить после изменения значения в спинбоксе с количеством, метод пытается удалить несуществующие спинбоксы и вылетает… помогите примером, я сон потерял. масло в огонь подливает еще тот факт, что метод почему-то вызывается 2 раза, когда значение с количеством меняется только один раз…

Отредактировано margadon (Апрель 28, 2014 16:49:31)

Офлайн

#7 Апрель 29, 2014 00:43:54

KriO
Зарегистрирован: 2012-10-07
Сообщения: 61
Репутация: +  9  -
Профиль   Отправить e-mail  

как удалить элементы GUI созданные программой

Вот тестик. Я для теста добавила спинбокс в 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)

Офлайн

  • Начало
  • » GUI
  • » как удалить элементы GUI созданные программой[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version