Qtablewidget中的动态QCombobox填充来自sqlite3db

2024-09-27 19:37:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从SQLite3数据库中生成一个动态Qcombobox(安排在Qtablewidget中)填充。基础数据(为了演示和简单起见)可以在以下代码生成的表中找到:

import sqlite3

conn = sqlite3.connect('DataBase.db')
c = conn.cursor()

def create_table():
    c.execute('CREATE TABLE IF NOT EXISTS source("Section",\
                                                 "Product_ID",\
                                                 "Label",\
                                                 "Product_desc",\
                                                 "Unit_price")' )

list1 = [
    ['Butterfly','16/1/001','PP','Pepito Butterfly','350'],
    ['Butterfly','16/1/002','PP','Brown Butterfly','350'],
    ['Butterfly','16/1/003','PP','Blue Butterfly','350'],
    ['Butterfly','bra01','BR','White Butterfly','500'],
    ['Backpack','bra02','BR','Backpack-blue','1500'],
    ['Backpack','bra03','BR','Backpack-black','1250'],
    ['Toy','klv01','KL','Bear','200'],
    ['Toy','klv02','KL','Fish','500'],
    ['Toy','klv03','KL','Rabbit','400'],
    ['Toy','klv04','KL','Owl','450'],
    ]

def data_entry():
    for element in list1:
            c.execute("INSERT INTO source VALUES(?,?,?,?,?)", (element))
    conn.commit()
    c.close()
    conn.close()

create_table()
data_entry()

我的目标是更新所有组合框(在给定的行中),并在用户选择任何组合框中的内容时用更新的选择选项填充它们。逻辑如下:

场景1: 选择combo1中的Butterfly,combo2和combo3中的选择选项更新如下:combo2显示三个选项(blank,PP,BR),默认为空;combo3显示(blank,Pepito Butterfly,Brown Butterfly,Blue Butterfly,White Butterfly),默认为空,之后用户在combo2中选择BR时,combo3的选择选项将只提供blank和White Buttefly(默认设置为blank)。你知道吗

场景2: 在combo3中选择Backpack black,combo2的选择选项为空,BR(默认设置为空),combo1的选择选项为空,Backpack(默认设置为空)。你知道吗

场景3: 与Scenario1相同,但在第二个实例中(在combo1中选择Butterfly之后),用户在combo3中选择White Butterfly,combo2应该只提供blank和BR(默认设置为blank)。你知道吗

空白值应作为重新启动来启用用户重置选择选项。你知道吗

在某些地方有一篇类似于本文的文章,可以在这里找到:Dynamic QComboBox fill dependent on user input PyQt5。你知道吗

在我的研究中,我发现了一些其他有用的帖子:sqlite3 table into QTableWidget, sqlite3, PyQt5,但是,我仍然没有实现代码位,所以它工作了,决定直接用sqlite3提取数据。你知道吗

我被困在初始阶段,需要形成一个数据结构,在信号传递(即选择)后将被更新。下面是Qtablewidget的代码,其中qcombobox是我未能正确获取的:

进一步编辑-即将完成,提供的选择似乎还可以,但由于某些原因无法选择:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sqlite3
from pandas import DataFrame

conn = sqlite3.connect('DataBase.db')
c = conn.cursor()
c.execute('select Section, Label, Product_desc from source')
offer = c.fetchall()
c.close()
conn.close()

df = DataFrame(offer)
fin = {}
for i in df:
    fin[i] = df[i]
    fin[i] = df[i].drop_duplicates()
    fin[i] = list(fin[i])
    fin[i].insert(0,'')

class Window(QMainWindow):

    def __init__(self, parent = None):
        super(Window,self).__init__(parent)
        self.Table_of_widgets()

    def Table_of_widgets(self):

        rowCount = 20
        columnCount = 9

        self.table = QTableWidget()
        self.table.setColumnCount(columnCount)
        self.table.setRowCount(rowCount)
        self.table.setHorizontalHeaderLabels(['Section', 'Label', 'Product description', 'Picture', 'Product ID', "Amount", "Unit price", "Store", "Total price"])
        self.table.verticalHeader().hide()

        for i in range(columnCount):
            self.table.horizontalHeader().setSectionResizeMode(i, QHeaderView.Stretch)

        self.table.showMaximized()

        self.offer1 = fin[0]
        self.offer2 = fin[1]
        self.offer3 = fin[2]

        for i in range(rowCount):
            comboA = QComboBox()
            comboB = QComboBox()
            comboC = QComboBox()
            comboA.addItems(self.offer1)
            comboB.addItems(self.offer2)
            comboC.addItems(self.offer3)
            self.table.setCellWidget(i, 0, comboA)
            self.table.setCellWidget(i, 1, comboB)
            self.table.setCellWidget(i, 2, comboC)
            comboA.currentTextChanged.connect(lambda text1, row=i: self.onComboACurrentTextChanged(text1, row))
            comboB.currentTextChanged.connect(lambda text2, row=i: self.onComboBCurrentTextChanged(text2, row))
            comboC.currentTextChanged.connect(lambda text3, row=i: self.onComboCCurrentTextChanged(text3, row))

    def updateCombox(self, combo1, combo2, combo3, item1, item2, item3):
        text1 = combo1.currentText()
        text2 = combo2.currentText()
        text3 = combo3.currentText()
        combo1.blockSignals(True)
        combo2.blockSignals(True)
        combo3.blockSignals(True)
        combo1.clear()
        combo2.clear()
        combo3.clear()

        if text1 == '': a = list(df[0].drop_duplicates())
        else: a = [text1]
        if text2 == '': b = list(df[1].drop_duplicates())
        else: b = [text2]
        if text3 == '': c = list(df[2].drop_duplicates())
        else: c = [text3]

        offer1 = list(df.loc[df[0].isin(a) & df[1].isin(b) & df[2].isin(c)][0].drop_duplicates())
        offer1.insert(0, ' ')
        offer2 = list(df.loc[df[0].isin(a) & df[1].isin(b) & df[2].isin(c)][1].drop_duplicates())
        offer2.insert(0, ' ')
        offer3 = list(df.loc[df[0].isin(a) & df[1].isin(b) & df[2].isin(c)][2].drop_duplicates())
        offer3.insert(0, ' ')

        combo3.addItems(offer3)
        combo3.setCurrentText(text3)

        combo2.addItems(offer2)
        combo2.setCurrentText(text2)

        combo1.addItems(offer1)
        combo1.setCurrentText(text1)

        combo1.blockSignals(False)
        combo2.blockSignals(False)
        combo3.blockSignals(False)

    def onComboACurrentTextChanged(self, text1, row): # Determines changes in given row iniciated by comboA
        comboA = self.table.cellWidget(row, 0)
        comboB = self.table.cellWidget(row, 1)
        comboC = self.table.cellWidget(row, 2)
        self.updateCombox(comboA, comboB, comboC, self.offer1, self.offer2, self.offer3)

    def onComboBCurrentTextChanged(self, text2, row): # Determines changes in given row iniciated by comboB
        comboA = self.table.cellWidget(row, 0)
        comboB = self.table.cellWidget(row, 1)
        comboC = self.table.cellWidget(row, 2)
        self.updateCombox(comboA, comboB, comboC, self.offer1, self.offer2, self.offer3)

    def onComboCCurrentTextChanged(self, text3, row): # Determines changes in given row iniciated by comboC
        comboA = self.table.cellWidget(row, 0)
        comboB = self.table.cellWidget(row, 1)
        comboC = self.table.cellWidget(row, 2)
        self.updateCombox(comboA, comboB, comboC, self.offer1, self.offer2, self.offer3)

if __name__ == "__main__":

    app = QApplication(sys.argv)
    app.setApplicationName('MyWindow')
    main = Window()
    sys.exit(app.exec_())

我将感谢您的任何建议/解决方案/提示!谢谢


Tags: selfdfdeftablerowfinbutterflyisin
1条回答
网友
1楼 · 发布于 2024-09-27 19:37:10

这是我想要的密码:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sqlite3
from pandas import DataFrame

conn = sqlite3.connect('DataBase.db')
c = conn.cursor()
c.execute('select Section, Label, Product_desc from source')
offer = c.fetchall()
c.close()
conn.close()

df = DataFrame(offer)
fin = {}
for i in df:
    fin[i] = df[i]
    fin[i] = df[i].drop_duplicates()
    fin[i] = list(fin[i])
    fin[i].insert(0,' ')

class Window(QMainWindow):

    def __init__(self, parent = None):
        super(Window,self).__init__(parent)
        self.Table_of_widgets()

    def Table_of_widgets(self):

        rowCount = 20
        columnCount = 9

        self.table = QTableWidget()
        self.table.setColumnCount(columnCount)
        self.table.setRowCount(rowCount)
        self.table.setHorizontalHeaderLabels(['Section', 'Label', 'Product description', 'Picture', 'Product ID', "Amount", "Unit price", "Store", "Total price"])
        self.table.verticalHeader().hide()

        for i in range(columnCount):
            self.table.horizontalHeader().setSectionResizeMode(i, QHeaderView.Stretch)

        self.table.showMaximized()

        self.offer1 = fin[0]
        self.offer2 = fin[1]
        self.offer3 = fin[2]

        for i in range(rowCount):
            comboA = QComboBox()
            comboB = QComboBox()
            comboC = QComboBox()
            comboA.addItems(self.offer1)
            comboB.addItems(self.offer2)
            comboC.addItems(self.offer3)
            self.table.setCellWidget(i, 0, comboA)
            self.table.setCellWidget(i, 1, comboB)
            self.table.setCellWidget(i, 2, comboC)
            comboA.currentTextChanged.connect(lambda text, row=i: self.onComboACurrentTextChanged(text, row))
            comboB.currentTextChanged.connect(lambda text, row=i: self.onComboBCurrentTextChanged(text, row))
            comboC.currentTextChanged.connect(lambda text, row=i: self.onComboCCurrentTextChanged(text, row))

    def updateCombox(self, combo1, combo2, combo3, offer1, offer2, offer3):
        text1 = combo1.currentText()
        text2 = combo2.currentText()
        text3 = combo3.currentText()
        combo1.blockSignals(True)
        combo2.blockSignals(True)
        combo3.blockSignals(True)
        combo1.clear()
        combo2.clear()
        combo3.clear()

        if text1 == ' ': a = list(df[0].drop_duplicates())
        else: a = [text1]
        if text2 == ' ': b = list(df[1].drop_duplicates())
        else: b = [text2]
        if text3 == ' ': c = list(df[2].drop_duplicates())
        else: c = [text3]

        offer1 = list(df.loc[df[0].isin(a) & df[1].isin(b) & df[2].isin(c)][0].drop_duplicates())
        offer1.insert(0, ' ')
        offer2 = list(df.loc[df[0].isin(a) & df[1].isin(b) & df[2].isin(c)][1].drop_duplicates())
        offer2.insert(0, ' ')
        offer3 = list(df.loc[df[0].isin(a) & df[1].isin(b) & df[2].isin(c)][2].drop_duplicates())
        offer3.insert(0, ' ')

        combo3.addItems(offer3)
        combo3.setCurrentText(text3)

        combo2.addItems(offer2)
        combo2.setCurrentText(text2)

        combo1.addItems(offer1)
        combo1.setCurrentText(text1)

        combo1.blockSignals(False)
        combo2.blockSignals(False)
        combo3.blockSignals(False)

    def onComboACurrentTextChanged(self, text, row):
        comboA = self.table.cellWidget(row, 0)
        comboB = self.table.cellWidget(row, 1)
        comboC = self.table.cellWidget(row, 2)
        self.updateCombox(comboA, comboB, comboC, self.offer1, self.offer2, self.offer3)

    def onComboBCurrentTextChanged(self, text, row):
        comboA = self.table.cellWidget(row, 0)
        comboB = self.table.cellWidget(row, 1)
        comboC = self.table.cellWidget(row, 2)
        self.updateCombox(comboA, comboB, comboC, self.offer1, self.offer2, self.offer3)

    def onComboCCurrentTextChanged(self, text, row):
        comboA = self.table.cellWidget(row, 0)
        comboB = self.table.cellWidget(row, 1)
        comboC = self.table.cellWidget(row, 2)
        self.updateCombox(comboA, comboB, comboC, self.offer1, self.offer2, self.offer3)

if __name__ == "__main__":

    app = QApplication(sys.argv)
    app.setApplicationName('MyWindow')
    main = Window()
    sys.exit(app.exec_())

相关问题 更多 >

    热门问题