Qt5 Python 3.6程序中的共享全局状态

2024-04-20 07:40:49 发布

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

我试图使用名为“global_data”的模块保存全局状态信息,但未成功。代码已经越来越大了,所以我会尽量只发布基本的内容

from view import cube_control
from ioserver.ioserver import IOServer
from manager import config_manager, global_data
if __name__ == "__main__":
    #sets up initial data
    config_manager.init_manager()
    #modifies data
    io = IOServer()
    #verify global data modified from IOServer.__init__
    global_data.test() #success
    #start pyqt GUI
    cube_control.start_view()

到目前为止还不错。但是,在最后一行cube\u control.start\u view()中,它输入以下代码:

#inside cube_control.py
def start_view():
    #verify global data modified from IOServer.__init__
    global_data.test() #fail ?!?!
    app = QApplication(sys.argv)
    w = MainWindow()
    sys.exit(app.exec_())

在这种情况下,运行全局_data.test()失败。打印整个全局状态显示它现在以某种方式恢复到config_manager.init_manager()的数据设置

这怎么可能

当Qt运行时,我有一个调度程序,每10秒调用一次,同时报告一个失败的测试

然而,一旦QtGUI停止(单击“x”),并且我从控制台运行测试,它就会再次成功

在全局_数据模块中,我尝试将数据存储在一个简单python对象和一个ZODB内存数据库中的dict中:

#inside global_data
state = {
    "units" : {}
}
db = ZODB.DB(None) #creates an in memory db
def test(identity="no-id"):
    con = db.open()
    r = con.root()
    print("test online: ", r["units"]["local-test"]["online"], identity)
    con.close()

两者都有完全相同的问题。上述测试仅使用db进行

我尝试使用db的原因是我了解线程可以创建一个全新的全局字典。但是,前两个测试在同一线程中。循环线程在自己的线程中,可能会造成这样的问题

文件组织

如果有帮助的话,我的计划是按照以下结构组织的:

enter image description here

还有一个“视图”文件夹,其中包含一些qt5 GUI文件

IOServer尝试使用opcua模块连接到一组OPC-UA服务器。那里没有手动启动线程,尽管我认为opcua模块需要保持连接

全局_数据id()

我还尝试将(id(全局_数据))与测试一起打印,发现IOServer和顶级代码中的id相同,但多维数据集控件.py#start_视图中的id发生了变化。这些不应该总是指同一个模块吗


Tags: 模块数据fromtestviewiddbdata
1条回答
网友
1楼 · 发布于 2024-04-20 07:40:49

我还不确定到底发生了什么事。但显然,这是通过删除名为manager的文件夹中的init.py文件解决的。现在,名为“global_data”的模块的所有导入都指向相同的ID

使用init.py文件如何导致同一模块的第二个实例仍然是个谜

相关问题 更多 >