在python对话框中更新json外部文件

问题描述 投票:0回答:1

你好我在python中开发一个应用程序,我的问题是我正在保存一个json文件,我在一个对话框内的QlistWidget中调用它


[  
   {  
      "title":"El titulo",
      "enabled":true,
      "path":"path",
      "id":"5"
   },
   {  
      "title":"El titulo 2",
      "enabled":true,
      "path":"path",
      "id":"555"
   },
   {  
      "title":"El recontra titulo",
      "enabled":false,
      "path":"path",
      "id":"5555"
   },
   {  
      "title":"El titulo",
      "enabled":true,
      "path":"path",
      "id":"5"
   }
]

在这里我运行程序,我正确读取数据,并在进入对话框时在QlistWidget中显示它们

GUI

问题是当我更新json添加更多项目时,我关闭对话框并返回打开但列表未更新

在这里我留下我的代码

import sys
import os
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QLabel, QAction, QMessageBox
from PyQt5 import uic
from PyQt5.QtGui import QIcon
import modules.db as DB
#DB = DB.DB()

#DB.jsonOpen()

#class Dialogo Items
class Dialogo(QDialog):
    def __init__(self, item):
        QDialog.__init__(self)
        uic.loadUi("menu/" + item + ".ui", self)
        if item == 'addItems':
            items = DB.jsonOpen('items')
            for p in items:
                self.listitems.addItem(p['title'])
            self.listitems.repaint()

            self.saveitem.clicked.connect(self.save_items)
            self.cancelbtn.clicked.connect(self.close_dialog)

    def save_items(self):
        data = DB.jsonOpen('items')
        title = self.title.text()
        id = self.id.text()
        if self.status.isChecked():
            enabled = True
        else: enabled = False
        data.append({
            'id': id,
            'title': title,
            'path': 'path',
            'enabled': enabled
        })
        DB.jsonSave(data, 'items')
        self.title.setText("")
        self.id.setText("")
        self.status.setChecked(False)

    def close_dialog(self):
        self.hide()

#class heredada de QMainWindow (consturctor de ventanas) principal
class ventana(QMainWindow):
    #metodo constructor
    def __init__(self):
        #Iniciar el objeto QMainWindow
        QMainWindow.__init__(self)
        #cargar la configuracion de archivo .ui
        uic.loadUi("app.ui", self)

        #//// Barra de menu y acciones ////#
        #Onjeto menuBar
        menu = self.menuBar()
        #Menu Padre Inicio
        menu_inicio = menu.addMenu("&Inicio")
        menu_inicio_items = QAction(QIcon("icons/add.png"), "&Agregar Items", self)
        menu_inicio_items.setShortcut("Ctrl+i") #atajo de teclado
        self.DialogoItems = Dialogo('addItems'); # instanciamos la clase Dialogo Items
        menu_inicio_items.triggered.connect(self.OpenDialogItems) #lanzados el dialogo item desde el menu items
        menu_inicio.addAction(menu_inicio_items)
        #Menu Configuracon
        menu_conf = menu.addMenu("&Configuración")
        #configuracion general
        menu_conf_general = QAction(QIcon("icons/setting.png"), "&General", self)
        self.DialogConfGeneral = Dialogo('confGeneral')
        menu_conf_general.triggered.connect(self.OpenDialogConfGeneral) # lanazmos la configuracion general
        menu_conf.addAction(menu_conf_general)
        #configuracion servidores
        menu_conf_servers = QAction(QIcon("icons/earth.png"), "&Servidores", self)
        menu_conf_servers.setShortcut("Ctrl+h")
        self.DialogConfServer = Dialogo('confServers')
        menu_conf_servers.triggered.connect(self.OpenDialogConfServers)
        menu_conf.addAction(menu_conf_servers)

    #Abrir dialog Agregar Items
    def OpenDialogItems(self):
        self.DialogoItems.exec_()
    #Abrir dialog Configuracion general
    def OpenDialogConfGeneral(self):
        self.DialogConfGeneral.exec_()
    #Abrir dialog Configuracion Servidores
    def OpenDialogConfServers(self):
        self.DialogConfServer.exec_()

#instancia para iniciar una aplicacion
app = QApplication(sys.argv)
#app.setQuitOnLastWindowClosed(False)
#crear un objeto de la clase ventana
_ventana = ventana()
#mostrar ventana
_ventana.show()
app.exec_()

保存和读取功能完美地工作,两者的代码

import os
import json
def jsonSave(data, file):
    with open("data/"+file+".json", "w") as outfile:
        json.dump(data, outfile)

def jsonOpen(file):
    if os.path.exists('data/'+file+'.json') == True:
        with open("data/"+file+".json", 'r') as json_file:
            data = json.load(json_file)
    else:
        data = {}
        data = []
    return data

我正在使用--python 3 -pyQt5

python json pyqt5
1个回答
0
投票

问题是由于数据加载仅在构造函数中给出,一旦数据未更新,因为没有进行新的补给,必须要做的是创建一个QListWidget必须在必要时重新加载的方法或添加新项目直接到QListWidget,鉴于上述,我已经实现了以下代码:

class Dialogo(QDialog):
    def __init__(self, item):
        QDialog.__init__(self)
        uic.loadUi("menu/" + item + ".ui", self)
        if item == 'addItems':
            self.load()
            self.saveitem.clicked.connect(self.save_items)
            self.cancelbtn.clicked.connect(self.reject)

    def load(self):
        self.listitems.clear()
        items = DB.jsonOpen('items')
        for p in items:
            self.listitems.addItem(p['title'])

    def save_items(self):
        data = DB.jsonOpen('items')
        title = self.title.text()
        id = self.id.text()
        enabled = self.status.isChecked():
        data.append({
            'id': id,
            'title': title,
            'path': 'path',
            'enabled': enabled
        })
        DB.jsonSave(data, 'items')
        self.title.clear()
        self.id.clear()
        self.status.setChecked(False)
        self.listitems.addItem(title)
        # self.load()

我还建议,如果数据量很大,将它保存在json中是不合适的,因为它会在读取和写入数据时看到很大的延迟,这些情况的适当之处是使用数据库,例如,使用sqlite。

© www.soinside.com 2019 - 2024. All rights reserved.