Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt Messagebox正在崩溃_Python_Sockets_Pyqt_Pyqt5 - Fatal编程技术网

Python PyQt Messagebox正在崩溃

Python PyQt Messagebox正在崩溃,python,sockets,pyqt,pyqt5,Python,Sockets,Pyqt,Pyqt5,我正在开发一个文件传输应用程序,包括它的服务器。当我尝试在两个客户端之间发送文件时,我希望确保接收客户端将收到一个消息框,如“x用户希望发送文件。是否接受?”。到目前为止,我已经完成了这项工作,但是当我出于测试目的单击“是”按钮时,是按钮消失,接收客户端崩溃。当我试图在控制台上查看错误时,我看到接收客户端上的错误是“QObject::setParent:无法设置父级,新父级位于不同的线程中”。我在网站上搜索了错误,但没有找到解决方案。你能告诉我怎么解决这个问题吗 代码: 您案例中的问题是,QMe

我正在开发一个文件传输应用程序,包括它的服务器。当我尝试在两个客户端之间发送文件时,我希望确保接收客户端将收到一个消息框,如“x用户希望发送文件。是否接受?”。到目前为止,我已经完成了这项工作,但是当我出于测试目的单击“是”按钮时,是按钮消失,接收客户端崩溃。当我试图在控制台上查看错误时,我看到接收客户端上的错误是“QObject::setParent:无法设置父级,新父级位于不同的线程中”。我在网站上搜索了错误,但没有找到解决方案。你能告诉我怎么解决这个问题吗

代码:


您案例中的问题是,QMessageBox是在另一个Qt禁止的线程中创建的,它的父窗口位于主线程中,而Qt也禁止这样做。本例中的一般方法是通过信号、事件、元对象等将次线程的信息发送到主线程。这些信号、事件、元对象是线程安全的,在主线程中是创建GUI(在您的示例中是QMessageBox)

在这种情况下,可能会比较复杂,因此最好使用Qt的QtNetwork模块,该模块将通过信号向您发送接收到的信息,从而使while循环变得不必要,因此不需要使用线程

导入json
导入base64
从PyQt5导入QtCore、QtGui、QtWidgets、QtNetwork
类小部件(qtwidts.QWidget):
def uuu init uuu(self,parent=None):
超级(小部件,自我)。\uuuuu初始化\uuuuuuu(父级)
self.initUi()
self.m_username=“admin”
self.m_socket=QtNetwork.qtcsocket(self)
self.m_插座。已连接。连接(self.onConnected)
self.m_socket.readyRead.connect(self.onReadyRead)
self.m_socket.connectToHost(“144.122.86.204”,5000)
@QtCore.pyqtSlot()
def未连接(自):
username=“admin”
self.m_socket.write(self.m_username.encode(“utf-8”))
self.m_socket.flush()
@QtCore.pyqtSlot()
def onReadyRead(自身):
data=self.m_socket.readAll().data()
文本=数据解码(“utf-8”)
如果文本中的“想要向您发送文件,您接受吗?”
choice=qtwidts.QMessageBox.question(
自己
“文件传输”,
文本,
qtwidts.QMessageBox.Yes | qtwidts.QMessageBox.No,
)
如果选项==QtWidgets.QMessageBox.Yes:
self.m_socket.write(“已确认”).encode(“utf-8”))
@QtCore.pyqtSlot()
def添加内容(自身):
用户,确定=qtwidts.QInputDialog.getText(
self,“添加联系人”,“输入用户名:”
)
如果确定:
self.m_listwidget.addItem(用户)
@QtCore.pyqtSlot()
def发送文件(自身):
如果self.m_socket.state()!=QtNetwork.QAbstractSocket.ConnectedState:
打印(“未连接插座”)
返回
item=self.m_listwidget.currentItem()
如果项目为无:
打印(“非当前项目”)
返回
target_user=item.text()
文件名,\=qtwidts.QFileDialog.getOpenFileName(self,“打开文件”)
打开(文件名为“rb”)作为文件:
base64_bytes=base64.b64encode(file.read())
base64_字符串=base64_字节。解码(“utf-8”)
data={“FRM”:self.m_用户名,“TO”:target_用户,“data”:base64_字符串}
encoded_data=json.dumps(data).encode()
self.m_socket.write(编码的_数据)
self.m_socket.flush()
def initUi(self):
self.m_listwidget=qtwidts.QListWidget()
self.m_listwidget.setFixedWidth(100)
self.m_add_button=qtwidts.QPushButton(“添加联系人”)
self.m_添加按钮。单击。连接(self.add_contant)
self.m_添加按钮。设置固定大小(100,50)
self.m_send_file=QtWidgets.QPushButton(“发送文件”)
self.m_send_file.clicked.connect(self.send_file)
self.m_send_file.setFixedSize(200,50)
hlay=qtwidts.QHBoxLayout()
hlay.addWidget(self.m_listwidget)
hlay.addStretch()
hlay2=qtwidts.QHBoxLayout()
hlay2.addWidget(self.m_add_按钮)
hlay2.addWidget(self.m_send_文件)
hlay2.addStretch()
vlay=qtwidts.QVBoxLayout(self)
vlay.addLayout(hlay)
vlay.addLayout(hlay2)
自我调整大小(500350)
def关闭事件(自身、事件):
如果self.m_socket.state()==QtNetwork.QAbstractSocket.ConnectedState:
self.m_socket.disconnectFromHost()
超级(小部件,自我)。关闭事件(事件)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=Widget()
w、 show()
sys.exit(app.exec())

不要在线程中使用qt小部件。尝试在线程中创建一个信号,并在qt环境中连接它,然后运行messagebox操作。这里有一个参考资料供您参考,请查看:是否有任何GUI框架不禁止此操作?
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
import socket
import json
import base64
from threading import Thread
from time import sleep

username = "admin"
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("144.122.86.204",5000)) #Fill here later
s.send(username.encode("utf-8"))

app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("File Sharing")
window.setGeometry(0,0,500,350)

contactlist= QListWidget(window)
contactlist.setGeometry(5,5,100,250)


def add():
    user, ok = QInputDialog.getText(window, "Add a contact","Enter a 
username:")
    if ok:
        contactlist.addItem(str(user))

def send():
    target_user=contactlist.currentItem().text()
    name = QFileDialog.getOpenFileName(window, 'Open File')
    file = open(name[0], 'rb')
    base64_bytes = base64.b64encode(file.read())
    base64_string = base64_bytes.decode('utf-8')
    data= {"FRM": username, "TO": target_user, "DATA": base64_string}
    encoded_data = json.dumps(data).encode()
    s.sendall(encoded_data)

def receive():
    while True:
        data = s.recv(1024)
        if data:
            if 'wants to send you a file. Do you accept that?' in 
data.decode('utf-8'):
                choice = QMessageBox.question(window, 'FileTransfer', 
data.decode('utf-8'),QMessageBox. Yes|QMessageBox. No)
                if choice == QMessageBox.Yes:
                    s.send("CONFIRMED".encode('utf-8'))




t = Thread(target=receive)
t.start()

add_contact = QPushButton("Add a Contact", window)
add_contact.setGeometry(5,270,100,50)
add_contact.clicked.connect(add)

send_file = QPushButton("Send a File",window)
send_file.setGeometry(110,270,200,50)
send_file.clicked.connect(send)



window.show()

sys.exit(app.exec())