Kyrymself применяется и к методам, то есть если метод а экземпляра класса вызывает метод в этого же экземпляра то нужно писать так
Window.in_ch_f(self,a)
self.in_ch_f(self,a)
Возможно еще что-то упустил (бегло код посмотрел), со временем проблема.
Kyrymself применяется и к методам, то есть если метод а экземпляра класса вызывает метод в этого же экземпляра то нужно писать так
Window.in_ch_f(self,a)
TypeError: in_ch_f() takes 2 positional arguments but 3 were givenВидимо, надо ещё что-то менять.
Kyrymвы можете вместо Window.in_ch_f(self,a) писать self.in_ch_f(a)
Хм… вместо Window.in_ch_f(self,a) пишу self.in_ch_f(self,a) и вижу:
# -*- coding: utf-8 -*- import sys from PyQt4 import QtGui, QtCore # ЦВЕТА ПОЛЕЙ sss_vivod = ("background-color: #456173; color: #f2f2f0; font: 12pt 'Courier New'") # ДАННЫЕ # ГРАФИКА class Window(QtGui.QWidget): # Класс Window наследует класс QWidget def __init__(self, parent=None, *args, **kwargs): # Создаёт конструктор класса, parent - ссылка на родительский эл-т QtGui.QWidget.__init__(self, parent) self.setMinimumSize(200, 200) # Ширина и высота окна self.resize(200, 200) # шир / выс окна self.setWindowTitle('Исключения') # Заголовок self.setWindowIcon(QtGui.QIcon('icon.png')) # Иконка # БЛОК РАЗМЕТКИ self.vbox_os = QtGui.QVBoxLayout() # --- self.pole = QtGui.QLineEdit() self.pole.setStyleSheet(sss_vivod) self.vbox_os.addWidget(self.pole) # --- self.pole_2 = QtGui.QLineEdit() self.pole_2.setStyleSheet(sss_vivod) self.vbox_os.addWidget(self.pole_2) # --- self.btn = QtGui.QPushButton('Выполнить') self.btn.clicked.connect(self.on_start) self.vbox_os.addWidget(self.btn) # --- self.pole_vivod = QtGui.QTextEdit('') self.pole_vivod.setStyleSheet(sss_vivod) self.vbox_os.addWidget(self.pole_vivod) # --- self.setLayout(self.vbox_os) # установка рабочей области # ЛОГИКА def on_start(self, x=None): def ap(i): data.append(i) data = [] self.pole_vivod.setText('') a = self.pole.text() print('on_start до функции, a =',a) a = self.in_ch_f(a) # Да, можно вот так print('on_start после функции, a =',a) ap(a) print('-'*50) b = self.pole_2.text() # Да, можно вот так print('on_start до функции, b =',b) b = self.in_ch_f(b) print('on_start после функции, b =',b) ap(b) print('='*50) for i in data: self.pole_vivod.append(str(i)) def in_ch_f(self,x): # Наш метод возавращает результат try: x = float(x) print('try, x =',x) except (TypeError, ValueError): print('except, x =',x) x = 0 return x # КОНЕЦ if __name__ == "__main__": app = QtGui.QApplication(sys.argv) window = Window() # создаёт экземпляр окна из класса window.show() # запускает окно sys.exit(app.exec_())
# -*- coding: utf-8 -*- import sys from PyQt4 import QtGui, QtCore # ЦВЕТА ПОЛЕЙ sss_vivod = ("background-color: #456173; color: #f2f2f0; font: 12pt 'Courier New'") # ДАННЫЕ # ГРАФИКА class Window(QtGui.QWidget): # Класс Window наследует класс QWidget def __init__(self, parent=None, *args, **kwargs): # Создаёт конструктор класса, parent - ссылка на родительский эл-т QtGui.QWidget.__init__(self, parent) self.setMinimumSize(200, 200) # Ширина и высота окна self.resize(200, 200) # шир / выс окна self.setWindowTitle('Исключения') # Заголовок self.setWindowIcon(QtGui.QIcon('icon.png')) # Иконка # БЛОК РАЗМЕТКИ self.vbox_os = QtGui.QVBoxLayout() # --- self.pole = QtGui.QLineEdit() self.pole.setStyleSheet(sss_vivod) self.vbox_os.addWidget(self.pole) # --- self.pole_2 = QtGui.QLineEdit() self.pole_2.setStyleSheet(sss_vivod) self.vbox_os.addWidget(self.pole_2) # --- self.btn = QtGui.QPushButton('Выполнить') self.btn.clicked.connect(self.on_start) self.vbox_os.addWidget(self.btn) # --- self.pole_vivod = QtGui.QTextEdit('') self.pole_vivod.setStyleSheet(sss_vivod) self.vbox_os.addWidget(self.pole_vivod) # --- self.setLayout(self.vbox_os) # установка рабочей области # ЛОГИКА def on_start(self, x=None): def ap(i): data.append(i) data = [] self.pole_vivod.setText('') a = self.pole.text() print('on_start до функции, a =',a) a = Window.in_ch_f(a) # вызываем in_ch_f через класс print('on_start после функции, a =',a) ap(a) print('-'*50) b = self.pole_2.text() print('on_start до функции, b =',b) b = self.in_ch_f(b) # вызываем in_ch_f через экземпляр print('on_start после функции, b =',b) ap(b) print('='*50) for i in data: self.pole_vivod.append(str(i)) @staticmethod #декоратор указывающий на то что in_ch_f статический метод def in_ch_f(x): # Обратите внимание self отсутвует как аргумент try: x = float(x) print('try, x =',x) except (TypeError, ValueError): print('except, x =',x) x = 0 return x # возвращаем значение # КОНЕЦ if __name__ == "__main__": app = QtGui.QApplication(sys.argv) window = Window() # создаёт экземпляр окна из класса window.show() # запускает окно sys.exit(app.exec_())
Kyrymне совсем просто перед тем как получить self.x вы в методе in_ch_f меняете его значение.
Суть в том, что ссылаясь a = self.x и b = self.x, я получаю разные self.x
# Python 3 # -*- coding: utf-8 -*- import sys from PyQt4 import QtCore, QtGui from PyQt4.QtGui import (QWidget, qApp, QAction, QApplication, QHBoxLayout, QVBoxLayout, QGridLayout, QLabel, QLineEdit, QTextEdit, QPushButton, QComboBox, QCheckBox, QRadioButton, QFrame, QScrollArea, QTabWidget, QSizePolicy, QBrush, QColor) from PyQt4.QtGui import QIcon, QPixmap, QPalette, QTextCursor # ГРАФИКА class Window(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.resize(300, 100) # шир / выс окна self.setWindowTitle('несущ') # Заголовок grid = QGridLayout() grid.setSpacing(5) # --- --- self.columnCount = 4 self.lines = [None for i in range(self.columnCount)] #lst_on_start = ['self.on_start'+str(i) for i in range(columnCount)] #print('lst_on_start =',lst_on_start) for col in range(self.columnCount): line = QLineEdit() self.lines[col] = line grid.addWidget(line,0,col+1) self.lines[col].textChanged.connect(self.on_start) #self.lines[col].textChanged.connect(lst_on_start[col]) # --- --- self.setLayout(grid) def on_start(self): print('1') lst_data = [] for i in range(self.columnCount): lst_data.append(self.lines[i].text()) print('lst_data =',lst_data) # КОНЕЦ if __name__ == "__main__": app = QApplication(sys.argv) window = Window() window.move(40, 20) # сдвиг окна от верхнего левого угла экрана window.show() sys.exit(app.exec_())
lst_data = ['4', '', '16', '']
# Python 3 # -*- coding: utf-8 -*- import sys from PyQt4 import QtCore, QtGui from PyQt4.QtGui import (QWidget, qApp, QAction, QApplication, QHBoxLayout, QVBoxLayout, QGridLayout, QLabel, QLineEdit, QTextEdit, QPushButton, QComboBox, QCheckBox, QRadioButton, QFrame, QScrollArea, QTabWidget, QSizePolicy, QBrush, QColor) from PyQt4.QtGui import QIcon, QPixmap, QPalette, QTextCursor # ГРАФИКА class Window(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.resize(300, 100) # шир / выс окна self.setWindowTitle('несущ') # Заголовок grid = QGridLayout() grid.setSpacing(5) # --- --- self.columnCount = 4 self.lines = [None for i in range(self.columnCount)] #lst_on_start = ['self.on_start'+str(i) for i in range(columnCount)] #print('lst_on_start =',lst_on_start) for col in range(self.columnCount): line = QLineEdit() self.lines[col] = line grid.addWidget(line,0,col+1) self.lines[col].textChanged.connect(self.on_start) #self.lines[col].textChanged.connect(lst_on_start[col]) # --- --- self.setLayout(grid) def on_start(self, text): print('1') lst_data = [] for i in range(self.columnCount): lst_data.append(self.lines[i].text()) col_index = lst_data.index(text) print('lst_data =',lst_data) print('Столбец №',col_index) # КОНЕЦ if __name__ == "__main__": app = QApplication(sys.argv) window = Window() window.move(40, 20) # сдвиг окна от верхнего левого угла экрана window.show() sys.exit(app.exec_())
Kyrymможно создать свой сигнал, котороый будет передавать все что угодно, хоть номкр колонки, хоть черта лысого..
А сам сигнал textChanged не может передать некую заданную информацию, номер колонки в данном случае?
PEHDOMСвои элементы создавать сложно (для меня), потом оказывается, что нужно многое предусмотреть.
можно создать свой сигнал
# Python 3 # -*- coding: utf-8 -*- import sys from PyQt4 import QtCore, QtGui from PyQt4.QtGui import (QWidget, qApp, QAction, QApplication, QHBoxLayout, QVBoxLayout, QGridLayout, QLabel, QLineEdit, QTextEdit, QPushButton, QComboBox, QCheckBox, QRadioButton, QFrame, QScrollArea, QTabWidget, QSizePolicy, QBrush, QColor) from PyQt4.QtGui import QIcon, QPixmap, QPalette, QTextCursor # ГРАФИКА class Window(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.resize(300, 100) # шир / выс окна self.setWindowTitle('несущ') # Заголовок grid = QGridLayout() grid.setSpacing(5) # --- --- self.columnCount = 4 self.lst_obj_name = ['line' + str(i) for i in range(self.columnCount)] self.lines = [None for i in range(self.columnCount)] for col in range(self.columnCount): line = QLineEdit() line.setObjectName('line' + str(col)) self.lines[col] = line self.lines[col].textChanged.connect(self.on_start) grid.addWidget(line,0,col) # --- --- self.setLayout(grid) def on_start(self): print('press',self.sender().objectName(),self.sender().text()) col_index = self.lst_obj_name.index(self.sender().objectName()) print('Столбец №',col_index) # КОНЕЦ if __name__ == "__main__": app = QApplication(sys.argv) window = Window() window.move(40, 20) # сдвиг окна от верхнего левого угла экрана window.show() sys.exit(app.exec_())