问题描述
我正在为omegle编写一个桌面客户端,这是我第一次处理多线程编程。我的程序(似乎是Python本身)以代码-1073741819退出。
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtPrintSupport import *
import os
import sys
from python_omegle.randomchat import RandomChat
from python_omegle.chatevent import ChatEvent
import threading
import enum
class ChatState(enum.Enum):
NONE = 1
WAITING = 2
CONNECTED = 3
CLOSING = 4
opening = 5
QUIT = 6
class MainWindow(QMainWindow):
def __init__(self,*args,**kwargs):
super(MainWindow,self).__init__(*args,**kwargs)
self.layout1 = QVBoxLayout()
self.layout2 = QHBoxLayout()
self.container = QWidget()
self.container.setLayout(self.layout1)
self.setCentralWidget(self.container)
self.topics = QLineEdit()
self.output = QTextEdit()
self.message = QLabel()
self.button = QPushButton("Start")
self.input = QLineEdit()
self.layout1.addWidget(self.topics)
self.layout1.addWidget(self.output)
self.layout1.addWidget(self.message)
self.layout2.addWidget(self.button)
self.layout2.addWidget(self.input)
self.layout1.addLayout(self.layout2)
self.output.setReadOnly(True)
self.input.setFocus()
self.button.clicked.connect(self.on_button_pressed)
self.chat_thread = threading.Thread(target=self.chat)
self.chat_state = ChatState.NONE
self.chat_thread.start()
def closeEvent(self,event):
self.chat_state = ChatState.QUIT
event.accept()
def on_window_close(self):
self.chat_state = ChatState.QUIT
def on_button_pressed(self):
state = self.button.text()
if state == "Start":
self.chat_state = ChatState.opening
self.button.setText("Stop")
elif state == "Stop":
self.button.setText("Really?")
elif state == "Really?":
self.button.setText("Start")
self.chat_state = ChatState.CLOSING
def chat(self):
chat = RandomChat()
while True:
if self.chat_state == ChatState.opening:
chat.start()
self.chat_state = ChatState.WAITING
self.output.clear()
elif self.chat_state == ChatState.CLOSING:
chat.disconnect()
self.message.setText("You have disconnected.")
self.chat_state = ChatState.NONE
elif self.chat_state == ChatState.WAITING:
while True:
event,argument = chat.get_event()
if event == ChatEvent.CHAT_READY:
self.message.setText("You're Now chatting with a random partner.")
self.chat_state = ChatState.CONNECTED
break
elif event == ChatEvent.CHAT_WAITING:
self.message.setText("Looking for someone you can chat with...")
elif self.chat_state == ChatState.CONNECTED:
while True:
event,argument = chat.get_event()
if event == ChatEvent.GOT_MESSAGE:
message = argument
self.output.append("Partner: {}".format(message))
elif event == ChatEvent.CHAT_ENDED:
self.message.setText("Partner has disconnected.")
self.button.setText("Start")
self.chat_state = ChatState.NONE
break
elif self.chat_state == ChatState.QUIT:
break
def GUI():
app = QApplication(sys.argv)
app.setApplicationName("oclient")
window = MainWindow()
window.show()
app.exec_()
if __name__ == '__main__':
GUI()
我怀疑由于在主线程和MainWindow.chat_state
中都更改了chat_thread
的值而导致错误。之所以需要多线程方法,是因为函数RandomChat.get_event
直到至少有一个事件可用时才返回。
可以在这里找到omegle api:https://github.com/coal0/python-omegle我也在使用pyqt5。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)