Виджеты Qt не являются потокобезопасными , и вы не должны получать к ним доступ из какого-либо потока, кроме основного потока (более подробную информацию вы можете найти в документации по Qt). Правильный способ использования потоков и виджетов Qt - через сигналы / слоты.
Чтобы перенести значения GUI во второй поток, вам нужно будет присвоить их этому потоку из основного потока (см. [1])
Если вы хотите изменить такое значение в потоке, вам нужно использовать сигналы (см. [2])
class MainThread(QtGui.QMainWindow, Ui_MainWindow):
...
def __init__(self, parent = None):
...
# Create QLineEdit instance and assign string
self.myLine = QLineEdit()
self.myLine.setText("Hello World!")
# Create thread instance and connect to signal to function
self.myThread = ThreadClassControl()
self.myThread.lineChanged.connect(self.myLine.setText) # <--- [2]
...
def onStartThread(self):
# Before starting the thread, we assign the value of QLineEdit to the other thread
self.myThread.line_thread = self.myLine.text() # <--- [1]
print "Starting thread..."
self.myThread.start()
...
class ThreadClassControl(QtCore.QThread):
# Declaration of the signals, with value type that will be used
lineChanged = QtCore.pyqtSignal(str) # <--- [2]
def __init__(self):
QtCore.QThread.__init__(self)
def __del__(self):
self.wait()
def run(self):
print "---> Executing ThreadClassControl"
# Print the QLineEdit value assigned previously
print "QLineEdit:", self.line_thread # <--- [1]
# If you want to change the value of your QLineEdit, emit the Signal
self.lineChanged.emit("Good bye!") # <--- [2]
В результате эта программа напечатает "Hello World!" но последнее сохраненное значение будет «До свидания!», сделанное потоком.
Надеюсь, это помогло. Удачи!