Разбор ElementTree с динамическими переменными работает в Spyder, но не в PyCharm - PullRequest
1 голос
/ 14 июня 2019

Я недавно переключился с 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.Будем очень благодарны за любые предложения о том, как преодолеть это!

...