Не понимаю почему поток не соединяется с главным после join
Почему поток не завершается, ведь sys.exit(app.exec_()) тоже поток.
import sys
import random
import time
import threading
from PySide6.QtWidgets import (QLineEdit, QPushButton, QApplication,
QVBoxLayout, QDialog)
class Window(QDialog):
flag = False
messages = ["Привет"]
def __init__(self):
super().__init__()
self.button = QPushButton("Click me, sempai...")
self.edit = QLineEdit("Yeah")
layout = QVBoxLayout(self)
layout.addWidget(self.edit)
layout.addWidget(self.button)
self.button.clicked.connect(self.send_message)
def create_thread(self):
self.t = threading.Thread(target = self.messages_print, args = ())
self.t.start()
def send_message(self):
Window.messages.append(self.edit.text())
def messages_print(self):
time.sleep(2)
if len(Window.messages) == 0:
print("нет")
else :
print(f"{random.choice(Window.messages)}")
self.messages_print()
if __name__ == "__main__":
app = QApplication()
window = Window()
window.show()
window.create_thread()
try:
sys.exit(app.exec_())
except(SystemExit):
window.t.join()
print(f"Все слова шо были {Window.messages}")
print("вышел")
sys.exit(app.exec_())
Ответы (2 шт):
Автор решения: GrAnd
→ Ссылка
Я не совсем понял чего вы хотели добиться...
Но, во-первых, у вас поток никогда не завершится, т.к. messages_print рекурсивно вызывает сама себя, а список сообщений никогда не опустошается, а только дополняется.
Во-вторых, вы зачем-то запускаете event loop второй раз в обработчике исключений.
Хотя я ни с QT, ни с PySide'ом вообще никогда не работал, но предположу, что вы хотели сделать что-то подобное:
...
def messages_print(self):
while len(Window.messages):
time.sleep(2)
i = random.randint(0, len(Window.messages)-1)
print(f"{Window.messages[i]}")
del Window.messages[i]
print("нет")
if __name__ == "__main__":
app = QApplication()
window = Window()
window.show()
window.create_thread()
try:
sys.exit(app.exec_())
except(SystemExit):
window.t.join()
print("вышел")
sys.exit(0)
Автор решения: S. Nick
→ Ссылка
Я не совсем понял, что вы хотите сделать, но вариант работы с дополнительным потоком выглядит примерно так:
import random
''' установите ваши импорты
from PySide6.QtWidgets import (QLineEdit, QPushButton, QApplication,
QVBoxLayout, QDialog, QPlainTextEdit)
from PySide6 import QtCore
'''
from PyQt5.QtWidgets import (QLineEdit, QPushButton, QApplication,
QVBoxLayout, QDialog, QPlainTextEdit)
from PyQt5 import QtCore
class WorkThread(QtCore.QThread):
threadSignal = QtCore.pyqtSignal(str)
def __init__(self):
super().__init__()
self.messages = ["Привет",]
def run(self):
while(True):
msgs = self.listMessages()
self.msleep(2000)
msg = random.choice(msgs)
self.threadSignal.emit(msg)
def listMessages(self, msg=''):
if msg:
self.messages.append(msg)
return self.messages
class Window(QDialog):
def __init__(self):
super().__init__()
self.button = QPushButton("Click me, sempai...")
self.button.clicked.connect(self.send_message)
self.lineEdit = QLineEdit(placeholderText='Введите сообщение и наэмите Enter')
self.lineEdit.editingFinished.connect(self.send_message)
self.textEdit = QPlainTextEdit()
layout = QVBoxLayout(self)
layout.addWidget(self.textEdit)
layout.addWidget(self.lineEdit)
layout.addWidget(self.button)
self.lineEdit.setFocus()
self.thread = WorkThread()
self.thread.threadSignal.connect(self.messages_print)
self.thread.start()
def send_message(self):
text = self.lineEdit.text()
if text:
self.thread.listMessages(text)
self.lineEdit.clear()
self.lineEdit.setFocus()
def messages_print(self, msg):
self.textEdit.appendPlainText(msg)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
