简体   繁体   中英

PyQt4: How to load compiled ui-files correctly?

I created a Qt resource file with all my ui files inside of it, I compiled that with pyrcc4 command-line in a python file, and then I loaded the ui files using loadUi. Here an example:

#!/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()

Well its works fine, but I have a problem. When I open the GUI-window once, everything works fine. After closing the window I try to open the same GUI-window again, I get ja long traceback.

Traceback (most recent call last): File "D:\\Dan\\Python\\xarphus\\xarphus\\frm_mdi.py", line 359, in create_update_form self.update_form = Update_Window(self) File "D:\\Dan\\Python\\xarphus\\xarphus\\frm_update.py", line 135, in init self.ui_update = loadUi(UI_PATH, self) File "C:\\Python27\\lib\\site-packages\\PyQt4\\uic__init__.py", line 238, in loadUi return DynamicUILoader(package).loadUi(uifile, baseinstance, resource_suffix) File "C:\\Python27\\lib\\site-packages\\PyQt4\\uic\\Loader\\loader.py", line 71, in loadUi return self.parse(filename, resource_suffix, basedir) File "C:\\Python27\\lib\\site-packages\\PyQt4\\uic\\uiparser.py", line 984, in parse document = parse(filename) File "C:\\Python27\\lib\\xml\\etree\\ElementTree.py", line 1182, in parse tree.parse(source, parser) File "C:\\Python27\\lib\\xml\\etree\\ElementTree.py", line 657, in parse self._root = parser.close() File "C:\\Python27\\lib\\xml\\etree\\ElementTree.py", line 1654, in close self._raiseerror(v) File "C:\\Python27\\lib\\xml\\etree\\ElementTree.py", line 1506, in _raiseerror raise err xml.etree.ElementTree.ParseError: no element found: line 1, column 0

Can everyone help me?

Maybe I have a solution, but I don't know if that is a perfectly pythonic.

Well, we know all python projects have an __ init __-file. We need it for initializing Python packages, right? Well I thought: Why not use this file? What did I do? I define in the __ init __ -file a function like so:

#!/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

Now in my "About_Window"-class I do this:

#!/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)

You see I importe the package-file (__ init __-file) as ui_file and then I call the function and save the return of the function in the variable self.ui_about.

In my case I open the About_Window from a MainWindow(QMainWindow), and it looks like so:

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()

You see I commented out the show()-method. It works without this method. I only define the About_Window()-class. Well I know that isn't maybe the best solution, but it works. I can open the window again and again without traceback.

If you have a better solution or idea let me know :-)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM