Python PyQt5应用程序:第三个小部件没有';t在运行时显示,但在调试模式(PyCharm)下可见

Python PyQt5应用程序:第三个小部件没有';t在运行时显示,但在调试模式(PyCharm)下可见,python,pyqt5,Python,Pyqt5,我有一个以QMainWindow开始的应用程序。在为数据库和东西选择合适的位置(目录)后,它允许用户启动PLC控制器的设置,该控制器位于第二个窗口(QWidget)上。到目前为止没有问题 在第二个窗口(SetupWindow)构建的同时,它还检查一系列解析它们的xml文件,构建字典等等 如果在解析时遇到错误,我想捕获它,请停止安装窗口完成填充表、列表等,并弹出第三个窗口,显示解析错误,并允许用户编辑错误的XML并修复它(启动所选的文本编辑器) 每个模块都处于空白状态(小部件驻留在不同的模块上),

我有一个以QMainWindow开始的应用程序。在为数据库和东西选择合适的位置(目录)后,它允许用户启动PLC控制器的设置,该控制器位于第二个窗口(QWidget)上。到目前为止没有问题

在第二个窗口(SetupWindow)构建的同时,它还检查一系列解析它们的xml文件,构建字典等等

如果在解析时遇到错误,我想捕获它,请停止安装窗口完成填充表、列表等,并弹出第三个窗口,显示解析错误,并允许用户编辑错误的XML并修复它(启动所选的文本编辑器)

每个模块都处于空白状态(小部件驻留在不同的模块上),一切正常。 当我把它们放在一起时,在解析异常的情况下,第三个窗口不会显示,应用程序会继续填充第二个窗口(部分是这样,因为一些XML由于格式错误而被跳过,这就是我试图捕获的异常)

奇怪的是,当我试图从PyCharm调试它时,在异常处中断,然后进入,第三个窗口会定期弹出。我做错了什么

这是我的代码(注意:我用来设置UI布局)

第一个主窗口(摘要:单击按钮事件以启动设置):

这是第二个窗口(设置控制器):

以下是调用解析函数的位置:

def load_bulk(self):
    # get the list of running components into a dictionary
    for i in self.list_controllers:
        i_path = os.path.join(self.root_path, i)
        self.components[i] = get_controller_dict(i_path,
                                                 self.config_obj,
                                                 'Application.xml',
                                                 'Subcomponents/Subcomponent',
                                                 'Name',
                                                 'src')
这是解析函数,我想在其中捕获异常:

import lib.parsingError as PE
def get_controller_dict(controller_path: str,
                        config: ConfigParser,
                        target: str,
                        inner_element: str,
                        tag_key: str,
                        tag_value: str,
                        tag_value_2: str=None):
    gc_dict = {}
    cdp_app_file = os.path.join(controller_path, target)
    if not os.path.exists(cdp_app_file):
        return gc_dict
    try:
        root = ET.parse(cdp_app_file).getroot()
        for type_tag in root.findall(inner_element):
            gc_dict[type_tag.attrib[tag_key]] = type_tag.attrib[tag_value]
    except ET.ParseError as ex: # debug breakpoint is here
        parseErr = PE.MainWindow(config, ex, cdp_app_file)
    except Exception as ex:
        show_exception(f"Parsing {cdp_app_file}", ex)
    return gc_dict
最后是PE.parsing错误。同样,它也驻留在自己的模块中:

from PyQt5 import uic
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtGui as qtg
from configparser import ConfigParser
myForm_3, baseClass = uic.loadUiType('./forms/parseErr.ui')
class MainWindow(baseClass):
    def __init__(self, config_obj: ConfigParser,
                 exc: ET.ParseError,
                 filename: str,
                 *args,
                 **kwargs):

        super().__init__(*args, **kwargs)
        # your code begins here
        self._icon = qtg.QIcon()
        self.ui = myForm_3()
        self.ui.setupUi(self)
        self.ui.MM_logo.setPixmap(qtg.QPixmap(':/logo_Small.png'))
        self.main_icon = qtg.QIcon()
        self.main_icon.addPixmap(qtg.QPixmap(':/logo_Small.png'), qtg.QIcon.Normal, qtg.QIcon.Off)
        self.setWindowIcon(self.main_icon)
        self.exc = exc
        self.config = config_obj
        self.filename = filename
        self.setLabels()
        self.ui.OK_butt.clicked.connect(self.ok_onClick)
        self.ui.validate_butt.clicked.connect(self.validate_onClick)
        self.ui.editXml_butt.clicked.connect(self.editXML)
        # your code ends here
        self.show()

恐怕你的问题有点太清楚了,想弄明白到底发生了什么真的很难。我建议你耐心地尝试创建一个新的解决方案(这可能会帮助你自己解决问题),因为我怀疑现在是否有人能够真正帮助你。还要注意的是,只有在某些条件下才需要使用
uic.loadUiType
,您可以直接在
\uuu init\uu
之后调用
uic.loadUi('somefile.ui',self)
。我怀疑您的问题与此有关。在这种情况下,问题可能是由以下事实引起的:
passer
get\u controller\u dict
的局部变量。它还将解释为什么在调试器中显示窗口,因为
passer
仍在断点处的作用域内。@Heike:spot on。很多。目前,我只是修补了它
返回
小部件,而不是分配给
过路人
。现在窗口出现了。我以后会把它修好,但那太棒了。你可以把它写在答案上,我会查出来的,否则我会做的
import lib.parsingError as PE
def get_controller_dict(controller_path: str,
                        config: ConfigParser,
                        target: str,
                        inner_element: str,
                        tag_key: str,
                        tag_value: str,
                        tag_value_2: str=None):
    gc_dict = {}
    cdp_app_file = os.path.join(controller_path, target)
    if not os.path.exists(cdp_app_file):
        return gc_dict
    try:
        root = ET.parse(cdp_app_file).getroot()
        for type_tag in root.findall(inner_element):
            gc_dict[type_tag.attrib[tag_key]] = type_tag.attrib[tag_value]
    except ET.ParseError as ex: # debug breakpoint is here
        parseErr = PE.MainWindow(config, ex, cdp_app_file)
    except Exception as ex:
        show_exception(f"Parsing {cdp_app_file}", ex)
    return gc_dict
from PyQt5 import uic
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtGui as qtg
from configparser import ConfigParser
myForm_3, baseClass = uic.loadUiType('./forms/parseErr.ui')
class MainWindow(baseClass):
    def __init__(self, config_obj: ConfigParser,
                 exc: ET.ParseError,
                 filename: str,
                 *args,
                 **kwargs):

        super().__init__(*args, **kwargs)
        # your code begins here
        self._icon = qtg.QIcon()
        self.ui = myForm_3()
        self.ui.setupUi(self)
        self.ui.MM_logo.setPixmap(qtg.QPixmap(':/logo_Small.png'))
        self.main_icon = qtg.QIcon()
        self.main_icon.addPixmap(qtg.QPixmap(':/logo_Small.png'), qtg.QIcon.Normal, qtg.QIcon.Off)
        self.setWindowIcon(self.main_icon)
        self.exc = exc
        self.config = config_obj
        self.filename = filename
        self.setLabels()
        self.ui.OK_butt.clicked.connect(self.ok_onClick)
        self.ui.validate_butt.clicked.connect(self.validate_onClick)
        self.ui.editXml_butt.clicked.connect(self.editXML)
        # your code ends here
        self.show()