我如何使用在另一个文件中创建的列表

时间:2016-02-16 09:40:43

标签: python list combobox sqlite pyqt5

您好我想从另一个档案中获取变量,但我不知道我做错了什么。

这是第一个文件。我试图从第二个文件中的列表中获取值并将它们放入组合框中,但我不知道如何将列表返回到第一个文件。我尝试了return语句,但它告诉我应该没有

import sys
from PyQt5.QtWidgets import (QWidget, QLabel, 
QComboBox, QApplication)
import selectColumn


class Example(QWidget):

    def __init__(self):
        super().__init__()

        ItemList=selectColumn.Column()
        print(ItemList)
        self.lbl = QLabel("1", self)
        combo = QComboBox(self)
        for i in range(len(ItemList)):
            Item=ItemList[i]
            combo.addItem(Item)


        combo.move(50, 50)
        self.lbl.move(50, 150)

        combo.activated[str].connect(self.onActivated)        

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('QComboBox')
        self.show()


    def onActivated(self, text):

        self.lbl.setText(text)
        self.lbl.adjustSize()  


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

这是第二个文件。这是使列值成为列表的文件。

import sqlite3
class Column(object):
    def __init__(self):
        db= sqlite3.connect("SQLite database")

        cursor = db.cursor()

        cursor.execute("""SELECT Item_ID FROM Items_Table""")
        data = cursor.fetchall()
        print(data)

        db.commit()
        cursor.close()

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

如果删除第二个文件中的类Column,这将是一个更简单的设计。如您所示,功能可以解决您的问题。

import sqlite3
def getData():
  db = sqlite3.connect("SQLite database")
  cursor = db.cursor()
  cursor.execute("""SELECT Item_ID FROM Items_Table""")
  data = cursor.fetchall()
  db.close()
  return data

并且,在第一个文件中,将行ItemList=selectColumn.Column()更改为itensIds = selectColumn.getData()

答案 1 :(得分:0)

在第二个文件selectColumn.py中,您可以定义类Column。它的__init__()方法对数据库执行select查询,并检索它存储在变量data中的所有行。方法结束时data超出范围并被删除。因此,您以后无法再次检索它,它会丢失。

您需要做的是将查询结果分配给对象的成员(或属性)。为此,请使用self.data = cursor.fetchall()。现在,您可以通过data类的实例访问Column

import sqlite3

class Column(object):
    def __init__(self):
        with sqlite3.connect("SQLite database") as db:
            cursor = db.cursor()    
            cursor.execute("""SELECT Item_ID FROM Items_Table""")
            self.data = [item[0] for item in cursor.fetchall()]    

请注意,我在打开数据库时已将代码更改为使用上下文管理器。这有点干净,因为您不必担心关闭游标或数据库连接。

此外,cursor.fetchall()将返回元组列表。每个元组包含一个元素,即项目ID。对于这个类的用户来说,只有没有元组包装器的ID的列表会更方便。为此,我使用列表推导来提取每个元组的第一个(也是唯一的)元素。这会产生一个ID列表。

现在,在第一个文件中,您可以执行此操作:

column = selectColumn.Column()
...
for item_id in column.data:
    combo.addItem(item_id)