Python PyQt5应用程序:第三个小部件没有';t在运行时显示,但在调试模式(PyCharm)下可见
我有一个以QMainWindow开始的应用程序。在为数据库和东西选择合适的位置(目录)后,它允许用户启动PLC控制器的设置,该控制器位于第二个窗口(QWidget)上。到目前为止没有问题 在第二个窗口(SetupWindow)构建的同时,它还检查一系列解析它们的xml文件,构建字典等等 如果在解析时遇到错误,我想捕获它,请停止安装窗口完成填充表、列表等,并弹出第三个窗口,显示解析错误,并允许用户编辑错误的XML并修复它(启动所选的文本编辑器) 每个模块都处于空白状态(小部件驻留在不同的模块上),一切正常。 当我把它们放在一起时,在解析异常的情况下,第三个窗口不会显示,应用程序会继续填充第二个窗口(部分是这样,因为一些XML由于格式错误而被跳过,这就是我试图捕获的异常) 奇怪的是,当我试图从PyCharm调试它时,在异常处中断,然后进入,第三个窗口会定期弹出。我做错了什么 这是我的代码(注意:我用来设置UI布局) 第一个主窗口(摘要:单击按钮事件以启动设置): 这是第二个窗口(设置控制器): 以下是调用解析函数的位置:Python PyQt5应用程序:第三个小部件没有';t在运行时显示,但在调试模式(PyCharm)下可见,python,pyqt5,Python,Pyqt5,我有一个以QMainWindow开始的应用程序。在为数据库和东西选择合适的位置(目录)后,它允许用户启动PLC控制器的设置,该控制器位于第二个窗口(QWidget)上。到目前为止没有问题 在第二个窗口(SetupWindow)构建的同时,它还检查一系列解析它们的xml文件,构建字典等等 如果在解析时遇到错误,我想捕获它,请停止安装窗口完成填充表、列表等,并弹出第三个窗口,显示解析错误,并允许用户编辑错误的XML并修复它(启动所选的文本编辑器) 每个模块都处于空白状态(小部件驻留在不同的模块上),
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()