PyQt получает значение из графического интерфейса

Я создал пользовательский интерфейс, используя QtDesigner, а затем преобразовал .ui в .py. Пользовательский интерфейс имеет разные comboBox и textBox, значения из которых я хочу прочитать после нажатия кнопки «Выполнить». Запустите функцию, а затем заполните другие текстовые поля пользовательского интерфейса после завершения вычислений. Однако, когда я изменяю значение comboBox и нажимаю кнопку, скрипт по-прежнему считывает начальное значение.

Я сделал простой графический интерфейс с comboBox с двумя элементами и текстовым полем. Я пытаюсь прочитать текст comboBox и на основе выбранного элемента установить текст textBox.

Вот код, который я использую для запуска GUI и чтения значения:

from PyQt4 import QtGui
from pyQt4 import QtCore
import sys
import GUI

class MyThread(QtCore.QThread):
    updated = QtCore.pyqtSignal(str)
    def run(self):
        self.gui = Window()
        name = self.gui.gui_Name.currentText()
        print (name)

        if name == 'Cristina':
            country = 'Italy'
        else:
            country = 'Other'

        self.updated.emit(str(1))


class Window(QtGui.QMainWindow, GUI.Home):
    def __init__(self,parent = None):
        super(Window,self).__init__(parent)
        self.setupUi(self)
        self._thread = MyThread(self)
        self._thread.updated.connect(self.updateText)
        self.update()
        self.
        self.pushButton.clicked.connect(self._thread.start)


    def updateText(self,text):
        self.Country.setText(str(country))

Есть предположения?

Спасибо


person Eman    schedule 07.06.2018    source источник
comment
Как вы думаете, какой способ лучше не изменять .py, сгенерированный из .ui?   -  person Eman    schedule 07.06.2018
comment
Это всего лишь образец, объясняющий проблему, но полная задача займет много времени.   -  person Eman    schedule 07.06.2018


Ответы (1)


Если код, который вы реализуете в прогоне, - это тот, который, я думаю, вы злоупотребляете потоками, поскольку с сигналом currentTextChanged этого будет достаточно, как показано ниже:

class Window(QtGui.QMainWindow, GUI.Home):
    def __init__(self,parent = None):
        super(Window,self).__init__(parent)
        self.setupUi(self)
        self.gui_Name.currentTextChanged.connect(self.onCurrentTextChanged)

    def onCurrentTextChanged(self, text):
        if if name == 'Cristina':
            country = 'Italy'
        else:
            country = 'Other'
        self.Country.setText(str(country))

С другой стороны, если реальный код - это трудоемкая задача, тогда использование потоков будет адекватным. Если задача принимает в качестве ссылки значение QComboBox в момент нажатия кнопки, тогда она устанавливает это значение как свойство потока, в вашем случае вы создаете новый графический интерфейс в другом потоке вместо использования существующего графического интерфейса:

class MyThread(QtCore.QThread):
    updated = QtCore.pyqtSignal(str)

    def run(self):
        name = self.currentText
        print(name)
        if name == 'Cristina':
            country = 'Italy'
        else:
            country = 'Other'
        self.updated.emit(country)

class Window(QtGui.QMainWindow, GUI.Home):
    def __init__(self,parent = None):
        super(Window,self).__init__(parent)
        self.setupUi(self)
        self._thread = MyThread(self)
        self._thread.updated.connect(self.Country.setText)
        self.pushButton.clicked.connect(self.start_thread)

    def start_thread(self):
        self._thread.currentText = self.gui_Name.currentText()
        self._thread.start()
person eyllanesc    schedule 07.06.2018
comment
Спасибо за вашу помощь. Он обновляет переменную страны, однако, когда я передаю значение updateText (), я получаю: Ошибка имени: глобальное имя «Страна» не определено. Любое предложение? - person Eman; 07.06.2018
comment
Я изменил self.updated.emit (country) на self.updated.emit (str (country)), и теперь он работает. Спасибо за вашу помощь - person Eman; 07.06.2018
comment
Я обязательно сделаю это. - person Eman; 07.06.2018