Форум сайта python.su
Учусь. Начал переделывать под себя известный в интернете обучающий пример с калькулятором. И сразу тупик, как обратиться к виджетам, как передать фокус и т.п. У меня пишет в 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_())
Офлайн
вы создаете объект, но не создаете хранимую ссылку на него
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()
Офлайн
Спасибо.
Но у меня выскочила ошибка- Объект ‘tuple - кортеж’ не поддерживает назначение элемента.self.lines[row][col]=line
Пока не нашел как обойти.
Офлайн
Здесь кортеж и будет ошибка
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)]
Офлайн
Спасибо. Получилось.
Офлайн
Мне вот интересно, а как на такие LineEdit ставятся сигналы, например, на изменение текста?
Т.е на каждую колонку лайн едит надо поставить свою функцию, типа:
self.lines[row][col].textChanged.connect(self.on_start[col])
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)
Офлайн
все проще. 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)
Офлайн
vic57Этот код отвечает на вопрос, заданный в соседней теме. А в этой теме, я писал про задание каждойму столбцу своей функции.
все проще. RTFM
Офлайн
по objectName определишь и строку и столбец
Офлайн