Python3 .8 с использованием класса PySide2 к классу - PullRequest
2 голосов
/ 30 апреля 2020

My GUI по сути оборачивает различные серверные сценарии PowerShell, которые выполняют некоторые автоматизированные функции. В некотором роде, но хорошо, вот где я застрял.

Мой интерфейс, разработанный в Qt Designer, выведен в файл .ui, преобразован в файл .py через PySide2- UI C и класс главного окна, который является подклассом класса главного окна, который я создал в Qt Designer. Все хорошо. Никаких проблем с этим.

Теперь я приступаю к той части моего программирования, которая записывает данные формы из QWidgets (которая работает) в список. У меня есть полностью собственный написанный класс, предназначенный для обработки этого пользовательского ввода, установки других переменных, таких как имена файлов или пути к определенным необходимым файлам конфигурации, и выполнения команды PowerShell подпроцесса со всей этой информацией. Где я застрял, пытаясь определить, что является правильным местом для создания экземпляра этого пользовательского объекта внутри моего класса MainWindow, вне моего класса MainWindow? Но если так, то где? Вот несколько упрощенных кодов, которые помогут объяснить мою дилемму.

Последовательность интерфейса

  1. Запуск приложения
  2. Появляется главное окно
  3. Пользователь просматривает форму с элементами управления вводом
  4. Пользователь вводит информацию, например (IP-адрес, имя пользователя, пароль)
  5. Пользователь нажимает кнопку, которая подключена к методу в классе
  6. Метод рекурсивно просматривает дочерние виджеты на странице и получает информацию в словарь, найдя qLabels и qLineEdit (buddies)

Вопросы :

  • Как вызвать следующий метод (только один раз, хотя захват данных является рекурсивным)? Я думаю о том, чтобы просто подключить сигнал ко второму методу, который обрабатывает получение захваченных данных и отправку / установку их в объект пользовательского класса. Однако, когда я создаю экземпляр своего пользовательского объекта внутри класса MainWindow и пытаюсь ссылаться на объект с помощью self.customObject.sendUsesrInput (self.userInputVariable), PyCharm не думает, что self определено внутри этого конкретного метода. Он неправильно выделяет слово «self», как в остальной части определения класса, и предлагает мне импортировать self.

Update
I был в состоянии очистить ошибки вокруг «импортировать себя» в PyCharm. Это как-то связано с неправильными пробелами и табуляциями, хотя я всегда использую клавишу табуляции для отступов. Может понадобиться go и проверить мои настройки проверки ближе. Другие вопросы все еще стоят, хотя. Где лучше всего вызывать методы в моем пользовательском классе для «формирования команды» и «запуска команды», если это выполняется классом mainWindow, или я должен установить флаг в классе customObject, который затем вызывает те другие действия? Или, в более общем смысле, если объект отвечает за выполнение своих собственных функций / методов, что-то мне обычно не говорит, но я не уверен. Кроме того, если есть какие-либо книги по этому вопросу, я был бы рад провести собственное исследование. В настоящее время я читаю «Быстрое GUI Программирование», но не уверен, что эта топи c уже описана в последующих главах.

  • Так что я думаю, мой вопрос, где мне обращаться класс customObject, в классе mainWindow или в каком-то другом месте? Если да, то где?

Прошу прощения, если этот вопрос НЕ ясен. Я обещаю обновить по мере необходимости, чтобы помочь справиться с этим.

Вот несколько упрощенных примеров кода:

class customClass(object): # this is actually in a separate file but for argv sake
   def __init__(self):
      self.userInput = ""
      self.file1 = ""
      self.file2 = ""
      self.otherstuff...

   def setUserInput(self, uinput):
      self.userInput = uinput

   def dostuffwithdata(self):
      # method to execute subprocess command


class MainWindow( QMainWindow ): 
   def __init__(self):
      super(MainWindow, self).__init__()
      self.ui = Ui_MainWindow()
      self.ui.setupUi(self)
      self.customObject = customClass.customCmdClass()
      self.cmddata = dict()
      self.ui.toolButton.clicked.connect(self.getformdata)

   def getformdata(self):
      # recurses through QWidgets and grabs QLabels and QLineEdit.Text() and updates dict()
      for w in widgets:
         if w is qlabel:
            k = w.text()
            v = w.buddy().text()
            self.cmddata.update({k: v})

   """ all the above works fine. what doesn't work is this part"""
   # at this point I want to send the collected data to the customObject for processing
   def senddatatocustomObject(self):
      self.customObject.setUserInput(self.cmddata)  """but this says that 'self' isn't defined. 
I know it has to be because of the object in an object, or something I'm doing wrong here.     
**Update**: figured this out. PyCharm was freaking out about some sort of  
perceived indentation error despite there not appearing to actually be one.   
Was able to correct this. """


if __name__ == '__main__':
   import sys

   app = QApplication(sys.argv)
   win = MainWindow()
   win.show()

   sys.exit(app.exec_())
...