简体   繁体   English

如何从 SQL 填充组合框数据? 使用 Python

[英]How to populate Combobox data from SQL? Using Python

(Picture 1) - Here is the output of my simple program, supposedly it has 5 dropdown items coming from the database but it only displays 1 data which is the last row of the db that has been read. (图片 1) - 这是我的简单程序的输出,据说它有 5 个来自数据库的下拉项,但它只显示 1 个数据,这是已读取的数据库的最后一行。

Picture 1 -图片1 -

在此处输入图片说明

(Picture 2) - Here is the code, I used for loop and I expect it to loop through it and display every data from db but it only display the last row. (图片 2) - 这是代码,我使用 for 循环,我希望它循环遍历它并显示来自 db 的每个数据,但它只显示最后一行。 Is it wrong syntax or wrong logic?是错误的语法还是错误的逻辑?

# Combobox - Subjects
self.cbSubjects = ttk.Combobox(root, width=17, textvariable=self.cbSubjects)
self.cbSubjects.place(x=120, y=60)

# SQL Command
self.conn = cx_Oracle.connect('system/system@127.0.0.1/xe')
self.cursor = self.conn.cursor()
self.cursor.execute("SELECT hr.subject.description FROM hr.subject")
for i in self.cursor:

   self.cbSubjects['values'] = (i)
   self.cbSubjects.current(0)

self.cursor.close()
self.conn.close()

(Picture 3) - Here is the SQL data that I'd like to display on my Combobox (图片 3) - 这是我想在我的 Combobox 上显示的 SQL 数据

Picture 3 -图 3 -

在此处输入图片说明

I'm new to Python tkinter.我是 Python tkinter 的新手。 Thank you so much!非常感谢!

Inside the for loop, you are simply overriding the single value you have in your combobox why this line is executed: self.cbSubjects['values'] = (i) .for循环中,您只是覆盖了组合框中的单个值,为什么要执行此行: self.cbSubjects['values'] = (i) The last value you assign to it is the last row returned by the SELECT SQL statement.您分配给它的最后一个值是SELECT SQL 语句返回的最后一行。 So this is the explanation of the reason you faced that problem.所以这就是您遇到该问题的原因的解释。

For the solution, if you take a look at the documentation which is often your best friend, you can read this:对于解决方案,如果您查看通常是您最好的朋友的 文档,您可以阅读以下内容:

values Specifies the list of values to display in the drop-down listbox. values 指定要在下拉列表框中显示的值列表。

Actually this is a little bit misleading because self.cbSubjects['values'] is rather a tuple, not a list, and as you know tuples are immutable, unlike lists, but still you can overcome this problem by making making i wearing the clothes of a tuple having one single element.实际上这有点误导,因为self.cbSubjects['values']是一个元组,而不是一个列表,正如你所知,元组是不可变的,不像列表,但你仍然可以通过让i穿上衣服来克服这个问题具有单个元素的元组。

Maybe with code, you will understand the idea better:也许通过代码,你会更好地理解这个想法:

#...
for i in self.cursor:   
   # self.cbSubjects['values'] = (i) , this is bad, change it like this:
   self.cbSubjects['values'] = self.cbSubjects['values'] + (i, )
   # ... rest of your program
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'delivery.ui'
#
# Created by: PyQt5 UI code generator 5.14.1
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets
import sqlite3
conn = sqlite3.connect("spmanager.db")
cursor = conn.cursor()


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(773, 621)
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(310, 20, 121, 20))
        font = QtGui.QFont()
        font.setFamily("Ubuntu Condensed")
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.verticalLayoutWidget = QtWidgets.QWidget(Form)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(50, 210, 701, 331))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.tableWidget = QtWidgets.QTableWidget(self.verticalLayoutWidget)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(3)
        self.tableWidget.setRowCount(1)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(2, item)
        self.verticalLayout.addWidget(self.tableWidget)
        self.frame_3 = QtWidgets.QFrame(Form)
        self.frame_3.setGeometry(QtCore.QRect(40, 550, 331, 80))
        self.frame_3.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_3.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_3.setObjectName("frame_3")
        self.label_4 = QtWidgets.QLabel(self.frame_3)
        self.label_4.setGeometry(QtCore.QRect(0, 0, 91, 17))
        self.label_4.setObjectName("label_4")
        self.textEdit = QtWidgets.QTextEdit(self.frame_3)
        self.textEdit.setGeometry(QtCore.QRect(10, 19, 291, 61))
        self.textEdit.setObjectName("textEdit")
        self.layoutWidget = QtWidgets.QWidget(Form)
        self.layoutWidget.setGeometry(QtCore.QRect(50, 70, 691, 91))
        self.layoutWidget.setObjectName("layoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.frame_2 = QtWidgets.QFrame(self.layoutWidget)
        self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_2.setObjectName("frame_2")
        self.label_3 = QtWidgets.QLabel(self.frame_2)
        self.label_3.setGeometry(QtCore.QRect(10, 30, 67, 17))
        self.label_3.setObjectName("label_3")
        self.dateEdit = QtWidgets.QDateEdit(self.frame_2)
        self.dateEdit.setGeometry(QtCore.QRect(70, 20, 151, 41))
        self.dateEdit.setObjectName("dateEdit")
        self.gridLayout.addWidget(self.frame_2, 0, 1, 1, 1)
        self.frame = QtWidgets.QFrame(self.layoutWidget)
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.label_2 = QtWidgets.QLabel(self.frame)
        self.label_2.setGeometry(QtCore.QRect(20, 30, 71, 21))
        self.label_2.setObjectName("label_2")
        self.comboBox = QtWidgets.QComboBox(self.frame)
        self.comboBox.setGeometry(QtCore.QRect(80, 30, 171, 25))
        self.comboBox.setEditable(True)
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        #list1 = ['First Item','Second Item','Third Item']
        #self.comboBox.addItems(list1)

        self.gridLayout.addWidget(self.frame, 0, 0, 1, 1)
        self.frame_4 = QtWidgets.QFrame(Form)
        self.frame_4.setGeometry(QtCore.QRect(540, 540, 181, 81))
        self.frame_4.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_4.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_4.setObjectName("frame_4")
        self.comboBox_2 = QtWidgets.QComboBox(self.frame_4)
        self.comboBox_2.setGeometry(QtCore.QRect(5, 20, 141, 25))
        self.comboBox_2.setObjectName("comboBox_2")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.pushButton = QtWidgets.QPushButton(self.frame_4)
        self.pushButton.setGeometry(QtCore.QRect(8, 50, 131, 25))
        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)


        def customer_names(self):
            self.conn = conn
            self.cursor = cursor
            self.cursor.execute("SELECT  customer_name FROM customers ORDER BY customer_name")
            self.sql =cursor.fetchall()
        customer_names(self)
        self.names =[]
        for i in self.sql:
            self.names.append(i[0])
        self.comboBox.addItems(self.names)



    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "HI-SPECS INNOVATIVE DELIVERY NOTE"))
        self.label.setText(_translate("Form", "DELIVERY NOTE"))
        item = self.tableWidget.verticalHeaderItem(0)
        item.setText(_translate("Form", "1"))
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("Form", "Qnty"))
        item = self.tableWidget.horizontalHeaderItem(1)
        item.setText(_translate("Form", "Item"))
        item = self.tableWidget.horizontalHeaderItem(2)
        item.setText(_translate("Form", "Description"))
        self.label_4.setText(_translate("Form", "Comment"))
        self.label_3.setText(_translate("Form", "Date:"))
        self.label_2.setText(_translate("Form", "Name:"))
        self.comboBox.setItemText(0, _translate("Form", "customer"))
        self.comboBox_2.setItemText(0, _translate("Form", "Print & Record"))
        self.comboBox_2.setItemText(1, _translate("Form", "Print"))
        self.comboBox_2.setItemText(2, _translate("Form", "Record"))
        self.comboBox_2.setItemText(3, _translate("Form", "Email"))
        self.pushButton.setText(_translate("Form", "Continue"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM