Skip to main content
 首页 » 编程设计

python之从文本文件填充 UI之python

2024年10月24日28oomusou

我将我的问题分解为一个非常基本的设置。每个选项卡都允许用户单击一个按钮并将项目添加到列表中。在将项目添加到列表的同时,它也被添加到一个名为 ALLITEMs 的全局变量中。每个选项卡都在字典上给出,可以附加到此处..

ALLITEMS = { 
        "A" : [], 
        "B" : [] 
    } 

在“closeEvent”的主要小部件中,我将这个变量保存到一个 json 文件中。同样在主要小部件“showEvent”中,我将此数据加载回全局变量 ALLITEMS。这允许用户在每次启动应用程序时保留数据。我不确定的是如何刷新选项卡小部件以使用变量中的数据重新填充 GUI。但仅当该工具最初启动时。我不希望每次用户单击该选项卡时都加载它,这会产生重复数据。

import sys 
import json 
import os 
from PySide import QtGui, QtCore 
 
ALLITEMS = { 
    "A" : [], 
    "B" : [] 
} 
 
# Widgets 
# ------------------------------------------------------------------------------ 
class ExampleA(QtGui.QWidget): 
 
    def __init__(self): 
        super(ExampleA, self).__init__() 
        self.initUI() 
 
    def initUI(self):       
        # formatting 
        self.resize(550, 400) 
        self.setWindowTitle("Tab A") 
 
        # widgets 
        self.ui_listview = QtGui.QListWidget() 
        self.ui_add = QtGui.QPushButton("Add Item") 
 
        # signals 
        self.ui_add.clicked.connect(self.add_item_clicked) 
 
        # main layout 
        main_layout = QtGui.QVBoxLayout() 
        main_layout.addWidget(self.ui_add) 
        main_layout.addWidget(self.ui_listview) 
        main_layout.setContentsMargins(0,0,0,0) 
        self.setLayout(main_layout) 
 
    def add_item_clicked(self): 
        global ALLITEMS 
        item = "Another item A" 
        ALLITEMS["A"].append(item) 
        self.ui_listview.addItem( item ) 
 
 
class ExampleB(QtGui.QWidget): 
 
    def __init__(self): 
        super(ExampleB, self).__init__() 
        self.initUI() 
 
    def initUI(self):       
        # formatting 
        self.resize(550, 400) 
        self.setWindowTitle("Tab A") 
 
        # widgets 
        self.ui_listview = QtGui.QListWidget() 
        self.ui_add = QtGui.QPushButton("Add Item") 
 
        # signals 
        self.ui_add.clicked.connect(self.add_item_clicked) 
 
        # main layout 
        main_layout = QtGui.QVBoxLayout() 
        main_layout.addWidget(self.ui_add) 
        main_layout.addWidget(self.ui_listview) 
        main_layout.setContentsMargins(0,0,0,0) 
        self.setLayout(main_layout) 
 
    def add_item_clicked(self): 
        global ALLITEMS 
        item = "Another item B" 
        ALLITEMS["B"].append(item) 
        self.ui_listview.addItem( item ) 
 
 
class ExampleMain(QtGui.QWidget): 
 
    def __init__(self): 
        super(ExampleMain, self).__init__() 
        self.initUI() 
 
    def initUI(self):       
        # formatting 
        self.resize(200, 200) 
        self.setWindowTitle("Test") 
 
        # widgets 
        tab_panel = QtGui.QTabWidget() 
        tab_panel.addTab(ExampleA(), "Tab A") 
        tab_panel.addTab(ExampleB(), "Tab B") 
 
        # main layout 
        main_layout = QtGui.QVBoxLayout() 
        main_layout.addWidget(tab_panel) 
        main_layout.setContentsMargins(0,0,0,0) 
        self.setLayout(main_layout) 
 
    def closeEvent(self, event): 
        self.save_data() 
 
    def showEvent(self, event): 
        self.load_data() 
 
    def save_data(self): 
        print "Saving..." 
        global ALLITEMS 
        json.dump(ALLITEMS, open("Example_Data.json",'w'), indent=4) 
 
    def load_data(self): 
        global ALLITEMS 
        if os.path.exists( "Example_Data.json" ): 
            with open( "Example_Data.json" ) as f: 
                data = json.load(f) 
                ALLITEMS = data 
 
# Main 
# ------------------------------------------------------------------------------ 
if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    ex = ExampleMain() 
    ex.show() 
    sys.exit(app.exec_()) 

请您参考如下方法:

最简单(虽然不是很有效)的方法是每次更改时从 ALLITEMS 字典更新列表小部件。所以在每次按下按钮时,您可以先更新 ALLITEMS,然后清除列表小部件的内容并根据 ALLITEMS["TabName"] 的新值重新填充它。然后在 show 事件上你可以做同样的事情 - 从文件一次加载 ALLITEMS 然后更新列表小部件。

要获得更有效的方法,请查看 Qt 模型/ View 编程 (http://doc.qt.io/qt-5/model-view-programming.html) 您可能需要将 QListWidget 替换为 QListView