【发布时间】:2019-07-27 13:27:47
【问题描述】:
我正在开发一个文件传输应用程序,包括它的服务器。当我尝试在两个客户端之间发送文件时,我想确保接收客户端会收到一个消息框,例如“x 用户想要发送文件。你接受吗?”。到目前为止,我已经完成了这项工作,但是当我出于测试目的单击“是”按钮时,“是”按钮消失了,接收客户端崩溃了。当我试图在控制台上查看错误时,我看到它在接收客户端上是“QObject::setParent: 无法设置父级,新父级在不同的线程中”。我在网站上搜索了错误,但无法理解解决方案。你能告诉我如何解决这个问题吗?
代码:
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())
【问题讨论】:
-
不要在线程中使用 qt 小部件。尝试在线程中创建信号并在 qt 环境中连接它,然后运行消息框操作。这里给你一个参考,看看:github.com/ozcanyarimdunya/pyqt5-cpu/blob/master/cpu_notifier/…