Kyrym
Эм… А как правильно сослаться из внешней функции на поле GUI?
ну для начала в фукцию можно передать калбек функцию класса GUI, или ссылку на сам элемент GUI.
Но есть несколько НО.
Во первых: _thread достаточно низкоуровневый модуль, лучше использовать threading или multiprocessing.
Во вторых: в вашем конкретном случае логичнее былобы использоваь вместо _thread (threading/multiprocessing) QThread , раз уж вы используете QT, у которого есть система сигналов-слотов. Тогда вы просто сможете соединить сигнал вашего потока с нужным вам слотом ГУИ.
Ну и в третьх, для вашей конкретной задачи, многопоточность вообще не нужна. QTimer дергающий нужный метод через заданый интервал, обновляющий текст, вполне справиться.
Это в общих чертах..
вариант с передчай окна
# Python 3. PyQt4
# -*- coding: utf-8 -*-
import sys, _thread
from PyQt4 import QtGui, QtCore
from datetime import datetime
from time import sleep
# ЦВЕТА ПОЛЕЙ
sss_vivod = ("background-color: #456173; color: #f2f2f0; font: 14pt 'Courier New'")
# ГРАФИКА
class Window(QtGui.QWidget): # Класс Window наследует класс QWidget
def __init__(self, parent=None): # Создаёт конструктор класса, parent - ссылка на родительский эл-т
QtGui.QWidget.__init__(self, parent)
self.resize(200, 300) # шир / выс окна
# БЛОК РАЗМЕТКИ
self.vbox = QtGui.QVBoxLayout()
# ---
self.pole_vivod = QtGui.QTextEdit('')
self.pole_vivod.setStyleSheet(sss_vivod)
self.vbox.addWidget(self.pole_vivod)
# ---
self.btn = QtGui.QPushButton('Пуск')
self.vbox.addWidget(self.btn)
# ---
self.setLayout(self.vbox)
# ---
Window.on_start(self)
# ЛОГИКА
def on_start(self):
def ap(i): # ap(строка)
data.append(i)
def aps(i): # aps(список)
i = ''.join(map(str, i))
data.append(str(i))
data = []
self.pole_vivod.setText('')
for i in data:
self.pole_vivod.append(str(i))
self.pole_vivod.moveCursor(QtGui.QTextCursor.Start)
# ФУНКЦИЯ ВРЕМЕНИ
def hel(window): #описываем функцию, которую собираемся запустить параллельно основному потоку
d = datetime.today()
time_x = d.strftime('%H:%M') # часы, минуты сейчас
print('Hello,world!')
y = 0
while y < 6:
y += 1
print(time_x)
window.pole_vivod.append(time_x)
sleep(2)
# КОНЕЦ
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = Window() # создаёт экземпляр окна из класса
# ПОТОКИ
_thread.start_new_thread(hel,(window,))
window.show() # запускает окно
sys.exit(app.exec_())
вариант с калбеком:
# Python 3. PyQt4
# -*- coding: utf-8 -*-
import sys, _thread
from PyQt4 import QtGui, QtCore
from datetime import datetime
from time import sleep
# ЦВЕТА ПОЛЕЙ
sss_vivod = ("background-color: #456173; color: #f2f2f0; font: 14pt 'Courier New'")
# ГРАФИКА
class Window(QtGui.QWidget): # Класс Window наследует класс QWidget
def __init__(self, parent=None): # Создаёт конструктор класса, parent - ссылка на родительский эл-т
QtGui.QWidget.__init__(self, parent)
self.resize(200, 300) # шир / выс окна
# БЛОК РАЗМЕТКИ
self.vbox = QtGui.QVBoxLayout()
# ---
self.pole_vivod = QtGui.QTextEdit('')
self.pole_vivod.setStyleSheet(sss_vivod)
self.vbox.addWidget(self.pole_vivod)
# ---
self.btn = QtGui.QPushButton('Пуск')
self.vbox.addWidget(self.btn)
# ---
self.setLayout(self.vbox)
# ---
Window.on_start(self)
# ЛОГИКА
def printTime(self, time_x):
self.pole_vivod.append(time_x)
def on_start(self):
def ap(i): # ap(строка)
data.append(i)
def aps(i): # aps(список)
i = ''.join(map(str, i))
data.append(str(i))
data = []
self.pole_vivod.setText('')
for i in data:
self.pole_vivod.append(str(i))
self.pole_vivod.moveCursor(QtGui.QTextCursor.Start)
# ФУНКЦИЯ ВРЕМЕНИ
def hel(callback): #описываем функцию, которую собираемся запустить параллельно основному потоку
d = datetime.today()
time_x = d.strftime('%H:%M') # часы, минуты сейчас
print('Hello,world!')
y = 0
while y < 6:
y += 1
print(time_x)
callback(time_x)
sleep(2)
# КОНЕЦ
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = Window() # создаёт экземпляр окна из класса
# ПОТОКИ
_thread.start_new_thread(hel,(window.printTime,))
window.show() # запускает окно
sys.exit(app.exec_())
Пример с QThread
# Python 3. PyQt4
# -*- coding: utf-8 -*-
import sys, _thread
from PyQt4 import QtGui, QtCore
from datetime import datetime
from time import sleep
# ПОТОКИ
class MyThread(QtCore.QThread):
currentTime = QtCore.pyqtSignal(str) # сигнал который мы будем передавать
def __init__(self):
super().__init__()
def run(self): # наша функция(полезная работа),
d = datetime.today()
time_x = d.strftime('%H:%M') # часы, минуты сейчас
print('Hello,world!')
y = 0
while y < 6:
y += 1
print(time_x)
self.currentTime.emit(time_x) # генерируем сигнал
sleep(2)
# ЦВЕТА ПОЛЕЙ
sss_vivod = ("background-color: #456173; color: #f2f2f0; font: 14pt 'Courier New'")
# ГРАФИКА
class Window(QtGui.QWidget): # Класс Window наследует класс QWidget
def __init__(self, parent=None): # Создаёт конструктор класса, parent - ссылка на родительский эл-т
QtGui.QWidget.__init__(self, parent)
self.resize(200, 300) # шир / выс окна
# БЛОК РАЗМЕТКИ
self.vbox = QtGui.QVBoxLayout()
# ---
self.pole_vivod = QtGui.QTextEdit('')
self.pole_vivod.setStyleSheet(sss_vivod)
self.vbox.addWidget(self.pole_vivod)
# ---
self.btn = QtGui.QPushButton('Пуск')
self.vbox.addWidget(self.btn)
# ---
self.setLayout(self.vbox)
# ---
Window.on_start(self)
# потоки и конекты
self.timeFunc = MyThread() # создаем инстанс потока
self.timeFunc.currentTime.connect(self.printTime) # соединяем сигнал из потока с методом printTime
self.timeFunc.start() # запускаем поток
# ЛОГИКА
def printTime(self, time_x):
self.pole_vivod.append(time_x)
def on_start(self):
def ap(i): # ap(строка)
data.append(i)
def aps(i): # aps(список)
i = ''.join(map(str, i))
data.append(str(i))
data = []
self.pole_vivod.setText('')
for i in data:
self.pole_vivod.append(str(i))
self.pole_vivod.moveCursor(QtGui.QTextCursor.Start)
# КОНЕЦ
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = Window() # создаёт экземпляр окна из класса
window.show() # запускает окно
sys.exit(app.exec_())
Kyrym
Понял я, в чём была моя ошибка. Я thread пытался запустить из класса гуи.
Да ХЗ , оно также запускается из класса ГУИ.