Форум сайта python.su
Добрый день. Я новичек в программировании и это не моя профессия. Но нужна прога для вывода данных из базы (sqlite3) по нескольким параметрам. Эти параметры выбираются с помощью комбобокc-ах.
Для упрощения оставил кусок проги и маленькую таблицу из 2 столбцов: Locality.DB
Raion | Village
——–|———
Raion1|Village1
Raion1|Village2
Raion1|Village3
Raion2|Village1
Raion2|Village
Raion2|Village3
Использовал PYQT5. При выборе “Raion” в ComboBox_1, который заполнен в коде (combo.addItems(“Raion1”, “Raion2”,“Raion3”,“Raion4”,“Raion5”)), нужно чтобы ComboBox_3 заполнился данными (Village1, Village2, Village3) из базы согласно выбранному району.
Выходит ошибка:
self.initUI.combo_3.addItems(str(i))
AttributeError: ‘function’ object has no attribute 'combo_3
Код:
import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import QIcon, QFont from PyQt5.QtCore import QCoreApplication class MyWin(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): #comboBox1 self.lb8 = QLabel("ComboBox_1", self) self.lb8.move(30, 50) self.lbl = QLabel(self) self.lbl.move(250, 52) combo = QComboBox(self) combo.move(100, 50) combo.addItems([" ","Raion1", "Raion2","Raion3","Raion4","Raion5"]) combo.resize (130, 22) combo.activated[str].connect(self.onActivated) combo.activated[str].connect(self.selected) combo.activated[str].connect(self.combo3) #comboBox3 self.lb10 = QLabel("ComboBox_3", self) self.lb10.move(30, 90) self.lb3 = QLabel(self) self.lb3.move(250, 90) combo_3 = QComboBox(self) combo_3.move(100, 90) combo_3.resize (130, 22) combo_3.activated[str].connect(self.onActivated3) #Close button qbtn = QPushButton('Close', self) qbtn.clicked.connect(self.close) qbtn.resize(qbtn.sizeHint()) qbtn.move(450, 450) #Basic Window self.resize(600, 520) self.center() self.setWindowTitle('Locality') self.show() #qLabel_1 def onActivated(self, text): self.lbl.setText(text) self.lbl.adjustSize() #qLabel_3 def onActivated3(self, text): self.lb3.setText(text) self.lb3.adjustSize() #selected raion def selected(self, text): raion = text print (raion) def combo3(self, text): import sqlite3 raion = text conn = sqlite3.connect ("Locality.db") cursor = conn.cursor() cursor.execute ("""select Village from Locality where raion=? """,(raion,)) result = cursor.fetchall() combo3list = [row[0] for row in result] for row in combo3list: self.combo_3.addItems(row[0]) #main window def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) def closeEvent(self, event): reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == '__main__': app = QApplication(sys.argv) my = MyWin() sys.exit(app.exec_())
Отредактировано Yonga (Окт. 11, 2019 08:52:55)
Офлайн
1) Научись пользоваться дизайнером
2) Метод initUI вообще не нужен, всё что в нём у тебя написано нужно перенести в __init__
3) combo_3 не является атрибутом, по этому ты к нему и обратиться не можешь. Надо его определять как self.combo_3 = QComboBox(self) и обращаться к нему через self.combo_3.
Офлайн
Rodegast, спасибо за советы. Первую програмульку (это вторая) создал с помощью QTDesigner. С ним графическую часть конечно намного проще рисовать. Но, по скольку некоторые спецы пишут что дизайнером в коде добавляется много “мусора”, попробовал без него. Может быть когда будет готова, попробую перерисовать в дизайнере (для сравнения). Что касается 3 совета (Надо его определять как self.combo_3 = QComboBox(self) и обращаться к нему через self.combo_3), помогло, но вышла уже другая ошибка: QComboBox.addItems(list-of-str): argument 1 has unexpected type ‘str’ - аргумент 1 имеет неожиданный тип ‘str’. Хотя командой print(type(combo3list)) получаю ответ: <class ‘list’>.
Офлайн
Вам надо наверно так:
self.combo_3.addItem(row[0])
Офлайн
ramiОшибка исчезла, print(combo3list) - выдает список, но комбобокс пустой.
Вам надо наверно так:
Отредактировано Yonga (Окт. 11, 2019 11:06:48)
Офлайн
Выложите базу Locality.db
Офлайн
import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import QIcon, QFont from PyQt5.QtCore import QCoreApplication class MyWin(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): #comboBox1 self.lb8 = QLabel("ComboBox_1", self) self.lb8.move(30, 50) self.lbl = QLabel(self) self.lbl.move(250, 52) combo = QComboBox(self) combo.move(100, 50) combo.addItems([" ","Raion1", "Raion2","Raion3","Raion4","Raion5"]) combo.resize (130, 22) combo.activated[str].connect(self.onActivated) combo.activated[str].connect(self.selected) combo.activated[str].connect(self.combo3) #comboBox3 self.lb10 = QLabel("ComboBox_3", self) self.lb10.move(30, 90) self.lb3 = QLabel(self) self.lb3.move(250, 90) combo_3 = QComboBox(self) combo_3.move(100, 90) combo_3.resize (130, 22) combo_3.activated[str].connect(self.onActivated3) #Close button qbtn = QPushButton('Close', self) qbtn.clicked.connect(self.close) qbtn.resize(qbtn.sizeHint()) qbtn.move(450, 450) #Basic Window self.resize(600, 520) self.center() self.setWindowTitle('Center') self.setWindowTitle('Locality') self.setWindowIcon(QIcon('port.png')) self.show() #qLabel_1 def onActivated(self, text): self.lbl.setText(text) self.lbl.adjustSize() #qLabel_3 def onActivated3(self, text): self.lb3.setText(text) self.lb3.adjustSize() #selected raion def selected(self, text): raion = text def combo3(self, text): import sqlite3 self.combo_3 = QComboBox(self) raion = text conn = sqlite3.connect ("Locality.db") cursor = conn.cursor() cursor.execute ("""select locality from Locality where raion=? """,(raion,)) result = cursor.fetchall() combo3list = [row[0] for row in result] print('list:', combo3list) for row in combo3list: self.combo_3.addItem(row[0]) #main window def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) def closeEvent(self, event): reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == '__main__': app = QApplication(sys.argv) my = MyWin() sys.exit(app.exec_())
Прикреплённый файлы:
Locality.db (12,0 KБ)
Офлайн
Замените функцию:
def combo3(self, text): conn = sqlite3.connect("Locality.db") cursor = conn.cursor() cursor.execute('select locality from Locality where raion=?',(text,)) result = cursor.fetchall() conn.close() #добавил закрытие combo3list = [row[0] for row in result] self.combo_3.clear() #добавил очистку виджета for row in combo3list: self.combo_3.addItem(row) #убрал индекс у row[0]
Отредактировано rami (Окт. 11, 2019 14:27:48)
Офлайн
rami
Замените функцию:
Офлайн
ramiЯ эту строку не убирал, в самом первом вашем представленном коде этой строки нет, я его поправил, а не тот, что вы опубликовали позже.
Rami, вы убрали из def combo3 строку: self.combo_3 = QComboBox(self). Я понимаю что этот виджет определен выше, но без этой строки выдает ошибку AttributeError: ‘MyWin’ object has no attribute ‘combo_3’. Спасибо.
Офлайн