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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.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:侦听ip、端口时窗口停止响应_Python_Sockets_Pyqt_Qtimer - Fatal编程技术网

Python PyQt:侦听ip、端口时窗口停止响应

Python PyQt:侦听ip、端口时窗口停止响应,python,sockets,pyqt,qtimer,Python,Sockets,Pyqt,Qtimer,我正在尝试用套接字制作一个简单的聊天应用程序,当我尝试一件简单的事情时,做一个循环并监听我的主机名和端口,GUI将开始冻结,根本不会响应 但是,我也尝试了QTimer(),因为它是为PyQt设计的,但是它会带来相同的结果并冻结窗口 def startloop(self): IP = socket.gethostbyname(socket.gethostname()) self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

我正在尝试用套接字制作一个简单的聊天应用程序,当我尝试一件简单的事情时,做一个循环并监听我的主机名和端口,GUI将开始冻结,根本不会响应

但是,我也尝试了
QTimer()
,因为它是为PyQt设计的,但是它会带来相同的结果并冻结窗口

def startloop(self):
    IP = socket.gethostbyname(socket.gethostname())
    self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    self.s.bind((IP, 5005))
    self.loop = QtCore.QTimer(self)
    self.loop.timeout.connect(self.check)
    self.loop.start(10000)

def recv(self):
    data, addr = self.s.data.recvfrom(1024)
    print data

每隔
10
秒(超时时),它就会开始冻结窗口,可能是什么问题?我需要分离流程吗?有其他更好的解决方案吗?

问题很可能是因为您只在主应用程序中连接了套接字,这会使整个过程(包括GUI)停滞。 因此,解决方案最好是使用module和module在单独的进程中运行socket函数和chat函数


通过使用这些,除了主GUI进程之外,您将在不同的进程中运行Socket应用程序,并且两者都将并行工作,而不会使主应用程序暂停

您需要在不同的线程中执行GUI和通信。例如,当套接字等待某些数据时,GUI被阻塞。您可以使用QT的信号/插槽连接两个线程

例如,example是GUI的类。MyThread将在另一个线程中运行,并每秒钟调用一个示例槽。 导入系统 从PyQt4导入QtGui、QtCore 导入时间 导入线程

class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()
        QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10))
        btn = QtGui.QPushButton('Button', self)
        self.show()
        self.background = MyThread(self)
        t = threading.Thread(target=self.background.process)
        t.start()
        self.background.notify.connect(self.notify)

    @QtCore.pyqtSlot()
    def notify(self):
        print("I have been notified")

class MyThread(QtCore.QObject):

    notify = QtCore.pyqtSignal()

    def __init__(self, parent):
        super(MyThread, self).__init__(parent)
        self.should_continue = True

    def process(self):
        while self.should_continue:
            # Here, do your server stuff.
            time.sleep(1)
            self.notify.emit()

def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
更多关于信号/插槽的文档


注意在上述示例中,您需要在退出应用程序之前完成MyThread.process函数。这可以通过将should_continue变量设置为false来实现,并且阻止套接字通信不应在同一线程中。当套接字等待时,GUI也会被阻塞。尝试为套接字使用另一个线程,并通过signal/slotsThank@SnoozeTime与GUI通信,但我对pyqtslot不是很熟悉,我可以得到一个如何实现的示例吗?我曾尝试使用多处理库创建多个进程,但似乎不起作用
def start():app=QtGui.QApplication(sys.argv)GUI=Window()sys.exit(app.exec_()p1=Process(target=self.authcheck)p1.start()p2=Process(target=self.recv)p2.start()start()
它仍然会滞后