Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt5. Как определить виджеты созданные в цикле? [RSS Feed]

#1 Сен. 6, 2017 19:24:58

andrey_krsk
Зарегистрирован: 2017-09-06
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5. Как определить виджеты созданные в цикле?

Учусь. Начал переделывать под себя известный в интернете обучающий пример с калькулятором. И сразу тупик, как обратиться к виджетам, как передать фокус и т.п. У меня пишет в PyCarm, что индексация объектов не поддерживается. Как расставить виджеты есть много примеров, а как дальше обращаться с ними в цикле не нашел. Прошу подсказать.
 import sys
from PyQt5.QtWidgets import QWidget,  QApplication, QLineEdit, QGridLayout
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        grid=QGridLayout(self)
        self.setLayout(grid)
        i=0
        j=0
        numbers = [(i, j) for i in range(3) for j in range(3)]
        print(numbers)
        for n in numbers:
            self.lineedit = QLineEdit(self)
            grid.addWidget(self.lineedit,*n)
            self.lineedit.setFocus()  # Передает фокус естественно на последний
        #виджет, а мне допустим надо на [2,0]
        #Если так написать self.lineedit[2,0].setFocus() или так 
        #self.lineedit[4].setFocus() или так self.lineedit[(0,3)].setFocus(),
        #то пишет, что 'QLineEdit' не поддерживает индексацию
        #self.lineedit(4).setFocus()  # объект не может быть вызван.
        #self.lineedit[(2, 0)].setFocus()Объект QLineEdit не подлежит расшифровке
        # И как допустим написать, что значение в [0,0] умножается на значение 
        #[0,1] и записывается в [0,2]
        self.move(300, 150)
        self.setWindowTitle('LineEdit')
        self.show()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Офлайн

#2 Сен. 6, 2017 21:37:20

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

PyQt5. Как определить виджеты созданные в цикле?

вы создаете объект, но не создаете хранимую ссылку на него

 class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        rows = 3
        cols = 4
        self.lines = [[None for i in range(cols)] for j in range(rows)]
        grid=QGridLayout(self)
        for row  in range(rows):
            for col in range(cols):
                    line  = QLineEdit()
                    self.lines[row][col] = line
                    grid.addWidget(line,row,col)
        #print(self.lines)
        self.lines[1][1].setFocus()

Офлайн

#3 Сен. 7, 2017 06:12:52

andrey_krsk
Зарегистрирован: 2017-09-06
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5. Как определить виджеты созданные в цикле?

Спасибо.
Но у меня выскочила ошибка
 self.lines[row][col]=line
- Объект ‘tuple - кортеж’ не поддерживает назначение элемента.
Пока не нашел как обойти.

Офлайн

#4 Сен. 7, 2017 08:06:26

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

PyQt5. Как определить виджеты созданные в цикле?

Здесь кортеж и будет ошибка

 numbers = [(i, j) for i in range(3) for j in range(3)]

Здесь список и ошибки не будет
  self.lines = [[None for i in range(cols)] for j in range(rows)]



Офлайн

#5 Сен. 7, 2017 16:31:19

andrey_krsk
Зарегистрирован: 2017-09-06
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5. Как определить виджеты созданные в цикле?

Спасибо. Получилось.

Офлайн

#6 Дек. 15, 2017 18:34:52

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

PyQt5. Как определить виджеты созданные в цикле?

Мне вот интересно, а как на такие LineEdit ставятся сигналы, например, на изменение текста?
Т.е на каждую колонку лайн едит надо поставить свою функцию, типа:

 self.lines[row][col].textChanged.connect(self.on_start[col])
Ну а сами функции писать руками.
————
Добавлено.
Вот так работает. Здесь 1 строка, 4 столбца:
 cols_find = 4
        self.lines = [None for i in range(cols_find)]
        lst_on_start = ['self.on_start'+str(i) for i in range(cols_find)]
        print('lst_on_start =',lst_on_start)
        for col_find in range(cols_find):
            line  = QLineEdit()
            self.lines[col_find] = line
            grid_find.addWidget(line,0,col_find+1)
            self.lines[col_find].textChanged.connect(eval(lst_on_start[col_find]))
    def on_start0(self):
        print('0')
    def on_start1(self):
        print('1')
    def on_start2(self):
        print('2')
    def on_start3(self):
        print('3')

Отредактировано Kyrym (Дек. 15, 2017 18:54:40)

Офлайн

#7 Дек. 16, 2017 07:27:56

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

PyQt5. Как определить виджеты созданные в цикле?

все проще. RTFM

 from PyQt5.Qt import *
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        rows = 3
        cols = 4
        self.lines = [[None for i in range(cols)] for j in range(rows)]
        grid=QGridLayout(self)
        for row  in range(rows):
            for col in range(cols):
                    line  = QLineEdit()
                    line.setObjectName('line' + str(row) + str(col))
                    line.returnPressed.connect(self.on_line)
                    self.lines[row][col] = line
                    grid.addWidget(line,row,col)
        #print(self.lines)
        self.lines[1][1].setFocus()
    def on_line(self):
       print('press',self.sender().objectName(),self.sender().text())
if __name__=="__main__":
    app = QApplication([])
    w = Example()
    w.show()
    app.exec_()

Отредактировано vic57 (Дек. 16, 2017 07:31:07)

Офлайн

#8 Дек. 16, 2017 09:07:21

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

PyQt5. Как определить виджеты созданные в цикле?

vic57
все проще. RTFM
Этот код отвечает на вопрос, заданный в соседней теме. А в этой теме, я писал про задание каждойму столбцу своей функции.

Офлайн

#9 Дек. 16, 2017 13:18:11

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

PyQt5. Как определить виджеты созданные в цикле?

по objectName определишь и строку и столбец

Офлайн

  • Начало
  • » GUI
  • » PyQt5. Как определить виджеты созданные в цикле?[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version