【问题标题】:How to populate Combobox data from SQL? Using Python如何从 SQL 填充 Combobox 数据?使用 Python
【发布时间】:2018-10-13 05:36:33
【问题描述】:

(图 1)- 这是我的简单程序的输出,据说它有 5 个来自数据库的下拉项,但它只显示 1 个数据,这是已读取的数据库的最后一行。

图片1-

(图 2)- 这是代码,我使用 for 循环,我希望它循环并显示 db 中的每个数据,但它只显示最后一行。是语法错误还是逻辑错误?

# 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()

(图 3)- 这是我想在 Combobox 上显示的 SQL 数据

图3-

我是 Python tkinter 的新手。非常感谢!

【问题讨论】:

    标签: python sql tkinter combobox ttk


    【解决方案1】:

    for 循环中,您只是覆盖了组合框中的单个值,为什么会执行此行:self.cbSubjects['values'] = (i)。您为其分配的最后一个值是SELECT SQL 语句返回的最后一行。所以这就是你遇到这个问题的原因的解释。

    对于解决方案,如果您查看通常是您最好的朋友的documentation,您可以阅读以下内容:

    values 指定要在下拉列表中显示的值列表 列表框。

    实际上这有点误导,因为self.cbSubjects['values'] 是一个元组,而不是一个列表,而且你知道元组是不可变的,不像列表,但你仍然可以通过让i 穿着衣服来克服这个问题具有一个元素的元组。

    也许通过代码,你会更好地理解这个想法:

    #...
    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
    

    【讨论】:

    • 它有一个错误说TypeError: Can't convert 'tuple' object to str implicitly
    【解决方案2】:
    # -*- 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_())
    
    

    【讨论】:

      猜你喜欢
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 2014-09-18
      • 2023-03-30
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      相关资源
      最近更新 更多