Я недавно переключился с Spyder на PyCharm, и часть моего кода, которая анализирует ElementTree с динамическими переменными, не работает в PyCharm.
В моем графическом интерфейсе настройки оборудования по умолчанию для различных протоколов исследований считываются из существующего файла XML.Код импортирует файл XML как ElementTree и перебирает его, чтобы заполнить QComboBox именами исследований.Эта часть по-прежнему работает нормально (все названия исследований отображаются в моем поле со списком), поэтому я знаю, что ElementTree импортируется правильно, и файл XML читается.
import xml.etree.ElementTree as ET
def combofill(self):
"""Re-read xml file and re-populate drop-down menu"""
self.tree = ET.parse('studydefaults.xml')
self.root = self.tree.getroot()
self.studyCombo.clear()
self.studyCombo.addItem("None")
for study in self.root.findall('study'):
self.studyCombo.addItem(study.get('name'))
Но, когда пользователь выбирает исследованиеиз ComboBox параметры, связанные с этим исследованием, должны быть считаны из ElementTree для заполнения других QLineEdits в GUI.При этом используются имена динамических переменных для поиска потомков выбранного в настоящий момент исследования.Эта часть прекрасно работает в Spyder, но с PyCharm QLineEdits не заполняются, и я получаю ошибки:
def read_defaults(self):
"""Read and import default settings from XML file(s) to LineEdits."""
if self.studyCombo.currentIndex() >= 1: #item 1 = 'none'
name = self.studyCombo.currentText() #get name of current study
#access parameters using elementtree xpaths to xml tags
self.xrate_box.setText(self.root.find(".//*[@name='"+ name +"']/xrate").text)
self.xduration_box.setText(self.root.find(".//*[@name='"+ name +"']/xduration").text)
#etc for 7 other parameters/comboboxes
Traceback (most recent call last):
File "B:/Wilson/WinPython-64bit-2.7.10.3/sarah_development/V2-MasterClock/dwf_MainWindow.py", line 671, in read_defaults
self.qrate_box.setText(str(self.root.findall(".//*[@name='"+ name +"']/qrate")))
File "B:\Wilson\WinPython-64bit-2.7.10.3\python-2.7.10.amd64\lib\xml\etree\ElementTree.py", line 390, in findall
return ElementPath.findall(self, path, namespaces)
File "B:\Wilson\WinPython-64bit-2.7.10.3\python-2.7.10.amd64\lib\xml\etree\ElementPath.py", line 293, in findall
return list(iterfind(elem, path, namespaces))
File "B:\Wilson\WinPython-64bit-2.7.10.3\python-2.7.10.amd64\lib\xml\etree\ElementPath.py", line 263, in iterfind
selector.append(ops[token[0]](next, token))
KeyError: PyQt4.QtCore.QString(u'.')
У меня есть догадка, что это ошибка типа, поэтому я пробовал различные способыпреобразования элемента в строку в командах setText, в том числе:
self.xrate_box.setText(self.root.find(str(".//*[@name='"+ name +"']/xrate")))
и
self.xrate_box.setText(str(self.root.find(".//*[@name='"+ name +"']/xrate")))
Это дало мне те же ошибки, что и подход ".text".
К сожалению, из-за некоторых других проблем и управленческих решений мне нужно придерживаться PyCharm и не могу просто вернуться к Spyder.Будем очень благодарны за любые предложения о том, как преодолеть это!