当前位置: 首页 > 知识库问答 >
问题:

PyQt4:如何正确加载已编译的ui文件?

方苗宣
2023-03-14

我创建了一个Qt资源文件,里面有我所有的ui文件,我用pyrcc4命令行编译了一个python文件,然后我用loadUi加载ui文件。这里举个例子:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import os
import sys

from PyQt4.QtCore import Qt, QFile
from PyQt4.uic import loadUi
from PyQt4.QtGui import QDialog

from xarphus.gui import ui_rc
# I import the compiled qt resource file named ui_rc

BASE_PATH = os.path.dirname(os.path.abspath(__file__))
#UI_PATH = os.path.join(BASE_PATH, 'gui', 'create_user.ui')
UI_PATH = QFile(":/ui_file/create_user.ui")
# I want to load those compiled ui files, 
# so I just create QFile.

class CreateUser_Window(QDialog):
    def __init__(self, parent):

        QDialog.__init__(self, parent)

        # I open the created QFile
        UI_PATH.open(QFile.ReadOnly)
        # I read the QFile and load the ui file
        self.ui_create_user = loadUi(UI_PATH, self)
        # After then I close it
        UI_PATH.close()

它工作正常,但我有一个问题。当我打开GUI窗口一次,一切正常。关闭窗口后,我尝试再次打开相同的图形用户界面窗口,我得到了长时间的回溯

回溯(最近一次调用):文件“D:\Dan\Python\xarphus\xarphus\frm\u mdi.py”,第359行,在create\u update\u form self中。update_form=update_Window(self)文件“D:\Dan\Python\xarphus\xarphus\frm_update.py”,第135行,在init self中。ui\u update=loadUi(ui\u路径,self)文件“C:\Python27\lib\site packages\PyQt4\uic\uuuu init\uuuu.py”,第238行,在loadUi返回DynamicUILoader(package)中。loadUi(uifile,baseinstance,resource_后缀)文件“C:\Python27\lib\site packages\PyQt4\uic\Loader\Loader.py”,第71行,在loadUi return self中。解析(文件名,资源后缀,basedir)文件“C:\Python27\lib\site packages\PyQt4\uic\uiparser.py”,第984行,在解析树的parse document=parse(文件名)文件“C:\Python27\lib\xml\etree\ElementTree.py”第1182行。解析(源代码,解析器)文件“C:\Python27\lib\xml\etree\ElementTree.py”,第657行,在parse self中_root=解析器。close()文件“C:\Python27\lib\xml\etree\ElementTree.py”,第1654行,在close self中_raiseerror(v)文件“C:\Python27\lib\xml\etree\ElementTree.py”,第1506行,位于raiseerror raise err xml中。埃特里。元素树。ParseError:未找到元素:第1行第0列

大家能帮帮我吗?

共有1个答案

锺离逸春
2023-03-14

也许我有一个解决办法,但我不知道这是否是一个完美的蟒蛇。

好吧,我们知道所有python项目都有一个______; init-文件。我们需要它来初始化Python包,对吗?我想:为什么不使用这个文件呢?我做了什么?我在___; init __;-文件中定义了如下函数:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4.uic import loadUi
from PyQt4.QtCore import Qt, QFile

def ui_load_about(self):
    uiFile = QFile(":/ui_file/about.ui")
    uiFile.open(QFile.ReadOnly)
    self.ui_about = loadUi(uiFile)
    uiFile.close()

    return self.ui_about

现在在我的“About_Window”课上,我这样做:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import os
import sys

from PyQt4.QtCore import Qt, QFile
from PyQt4.uic import loadUi
from PyQt4.QtGui import QDialog

import __init__ as ui_file

class About_Window(QDialog):
    def __init__(self, parent):

        QDialog.__init__(self, parent)

        self.ui_about = ui_file.ui_load_about(self)

您可以看到,我将包文件(_uuinit__u-file)导入为ui_文件,然后调用函数并将函数的返回保存在变量self中。我不知道。

在我的例子中,我从主窗口(QMainWindow)打开About_窗口,它看起来是这样的:

def create_about_form(self):
    self.ui_about = About_Window(self)

    # Now when I try to show (show()-method) a window I get two windows
    # The reason is: I open and load the ui files from compiled
    # qt resorce file that was define in __init__-module. 
    # There is a function that opens the resource file, reads  
    # the ui file an closes and returns the ui file back

    # That's the reason why I have commented out this method
    #self.ui_about.show()

你看,我注释掉了show()-方法。没有这种方法,它就可以工作。我只定义About_Window()-类。我知道这可能不是最好的解决方案,但它确实有效。我可以一次又一次地打开窗口而不需要回溯。

如果您有更好的解决方案或想法,请告诉我:-)

 类似资料:
  • 问题内容: 我有一个在PyQt4中开发的应用程序。 它具有为Windows和QMenus设置的图标。 所有客户端系统均已安装python。并且PyQt4是从网络位置加载的。 该应用程序在带有正确加载图标的开发人员系统中运行良好。但是,当在客户端上运行相同的脚本时,应用程序可以运行,但图标不会加载。 在我的应用程序中,我也使用了Qsql驱动程序。它也有同样的问题。适用于开发人员系统,但不适用于客户端

  • 问题内容: 我需要从一个zip文件(由py2exe压缩生成)中读取所有模块(预编译)到内​​存中,然后将它们全部加载。我知道这可以通过直接从zip文件加载来完成,但是我需要从内存中加载它们。有任何想法吗?(我在Windows上使用python 2.5.2)TIA Steve 问题答案: 这取决于您所拥有的“模块(预编译)”的确切含义。假设它恰好是文件的内容,例如,通过以下方式构建: IOW这样构建

  • 我运行了一个简单的程序,它允许我将HTTP请求映射到一个函数——这很棒,所以我决定,与其简单地返回一个随机字符串,我还可以轻松地返回一个字符串格式的超文本标记语言页面,就像能够动态地提供静态超文本标记语言页面一样。 问题是我无法加载网页资源。 我的项目具有以下结构: 正如我所说,如果我只是想返回一个字符串,我的程序工作正常,它正在尝试加载我似乎无法管理的home.html文件,特别是我的问题是如何

  • 我的拓扑的配置是: 我的第一个TransformBolt螺栓是:

  • 我之前习惯这样引入,但https://unpkg.com偶尔会出现访问不了的情况,就会导致样式出不来。于是我把这份样式文件下载下来,一些icon,图标之类的东西会显示不出来。所以大家是怎么引入的?

  • 问题内容: 我如何断言页面的CSS已在Watin 2.1中成功加载并应用了其样式? 问题答案: 在进行了一些研究并写下我的答案之后,我偶然发现了该链接,该链接解释了您需要了解的有关CSS的所有信息,何时加载CSS以及如何检查CSS。 实际上,所提供的链接对它的解释很好,以至于我在其中添加了一些引用以供将来参考。 如果您好奇,我的答案将是#2和#4的变体。 何时真正加载样式表? … 顺便说一句,让我

  • 如何确认我的JAR文件已加载到Coldfusion中?我在CF10上。 我目前得到这个错误: 我的网站结构如下: 在我的申请中。cfc,我有以下代码: 这是我调用一切的代码: 更新#1 我在检查administor时发现了设置摘要,其中列出了服务器Java类路径。我添加了jar文件的位置并重新启动了服务器。即使路径存在于Administrator中的类路径中,我仍然会遇到相同的错误。 更新2 添加

  • 我想在我的Minecraft Bukkit服务器(https://github.com/bitquest/bitquest)上安装以下插件。但为此我必须先编译它。我尝试了Maven,因为我不知道在手册中的含义。这导致一个. jar文件在服务器上不起作用(它发出错误消息)。我希望你能帮助我。有点关于jcjms。 手册: 构建BitQuest Java插件您可以构建BitQuest Java插件,您可