Найти - Пользователи
Полная версия: PyQt5. Как определить виджеты созданные в цикле?
Начало » GUI » PyQt5. Как определить виджеты созданные в цикле?
1
andrey_krsk
Учусь. Начал переделывать под себя известный в интернете обучающий пример с калькулятором. И сразу тупик, как обратиться к виджетам, как передать фокус и т.п. У меня пишет в 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_())
vic57
вы создаете объект, но не создаете хранимую ссылку на него
 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()

andrey_krsk
Спасибо.
Но у меня выскочила ошибка
 self.lines[row][col]=line
- Объект ‘tuple - кортеж’ не поддерживает назначение элемента.
Пока не нашел как обойти.
FishHook
Здесь кортеж и будет ошибка
 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)]
andrey_krsk
Спасибо. Получилось.
Kyrym
Мне вот интересно, а как на такие 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')
vic57
все проще. 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_()
Kyrym
vic57
все проще. RTFM
Этот код отвечает на вопрос, заданный в соседней теме. А в этой теме, я писал про задание каждойму столбцу своей функции.
vic57
по objectName определишь и строку и столбец
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