前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python TCP服务器v1.8 - PyQt5登录界面美化+淡入淡出

python TCP服务器v1.8 - PyQt5登录界面美化+淡入淡出

作者头像
zmh-program
发布2023-02-06 09:58:14
1K0
发布2023-02-06 09:58:14
举报
文章被收录于专栏:信息技术博客

TCP聊天服务器套接字v1.8

所有版本记录: v1.0 : TCP聊天服务器套接字|PyQt5+socket(TCP端口映射+端口放行)+logging+Thread(含日志,html)+anaconda打包32位exe(3.4万字)|python高阶 v1.1 : python TCP套接字服务器v1.1-新增服务端命令功能及修改bug(socket+PyQt5) v1.2 : python TCP服务器v1.2 - 服务端新增用户登录注册(json, md5加密) v1.3 : python TCP服务器v1.3 - 服务器抗压测试及关闭套接字处理 v1.4 : python TCP服务器v1.4 - 客户端连接服务器异常(异常情况分类)处理 v1.5 : PyQt5可编辑下拉框(comboBox):editable - python TCP服务器v1.5 - 客户端连接界面增加自定义参数(设置超时, 连接地址可选) v1.6 : Python TCP服务器v1.6 - multiprocessing多进程及Ctrl-c(SIGINT)退出 v1.7 : Python TCP服务器v1.7 - PyQt5 server服务端来临

上效果:

文章目录

ui

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>252</width>
    <height>339</height>
   </rect>
  </property>
  <property name="font">
   <font>
    <family>Consolas</family>
   </font>
  </property>
  <property name="windowTitle">
   <string>Login</string>
  </property>
  <property name="styleSheet">
   <string notr="true">QWidget
{border:15px;
margin:10px;
background-color:rgb(255, 255, 255);
}
QWidget#right_widget
{border-radius:15;}

</string>
  </property>
  <layout class="QGridLayout" name="gridLayout">
   <item row="2" column="0">
    <widget class="QLabel" name="label_3">
     <property name="font">
      <font>
       <family>Adobe Arabic</family>
       <pointsize>11</pointsize>
      </font>
     </property>
     <property name="styleSheet">
      <string notr="true">font-color:rgb(0, 0, 0)
font-size:20px</string>
     </property>
     <property name="text">
      <string>连接地址</string>
     </property>
    </widget>
   </item>
   <item row="3" column="0" colspan="3">
    <widget class="QLabel" name="label_2">
     <property name="styleSheet">
      <string notr="true">color: rgb(99, 99, 99);</string>
     </property>
     <property name="text">
      <string>[!]未注册将会自动注册</string>
     </property>
    </widget>
   </item>
   <item row="0" column="0" colspan="3">
    <widget class="QLabel" name="label">
     <property name="font">
      <font>
       <family>Consolas</family>
       <pointsize>22</pointsize>
       <weight>50</weight>
       <bold>false</bold>
      </font>
     </property>
     <property name="styleSheet">
      <string notr="true">color: rgb(0, 0, 0);</string>
     </property>
     <property name="text">
      <string>Zmh server</string>
     </property>
    </widget>
   </item>
   <item row="1" column="0" colspan="3">
    <widget class="QLineEdit" name="lineEdit">
     <property name="styleSheet">
      <string notr="true">            QLineEdit
            {border:0px;
            border-radius:0;
            margin:10px;
            border-bottom: 2px solid #B3B3B3;
            font-family:'等线';
            font-size:20px;
            font-weight:bold;}
            QLineEdit:hover{
                border-bottom:3px solid #66A3FF;
            }
            QLineEdit:focus{
                border-bottom:3px solid #E680BD
            }</string>
     </property>
     <property name="placeholderText">
      <string>用户名(4-16字符)</string>
     </property>
     <property name="clearButtonEnabled">
      <bool>true</bool>
     </property>
    </widget>
   </item>
   <item row="4" column="0" colspan="3">
    <widget class="QPushButton" name="pushButton">
     <property name="enabled">
      <bool>false</bool>
     </property>
     <property name="accessibleName">
      <string/>
     </property>
     <property name="styleSheet">
      <string notr="true">                            QPushButton
                            {text-align : center;
                            background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #fbc2eb, stop:1 #a6c1ee);
                            font: bold;
                            border-color: grey;
                            border-width: 2px;
                            border-radius: 10px;
                            padding: 6px;
                            height: 28px;
                            border-style: outset;
            				margin-left:30px;
            				margin-right:30px;
                            font-family:'黑体';
                            font : 18px;}

                            QPushButton:pressed
                            {text-align : center;
                            background-color : light gray;
                            background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #e1aad2, stop:1 #92adda);
                            font: bold;
                            color:lightblue;
                            border-color: gray;
                            border-width: 2px;
                            border-radius: 10px;
                            padding: 6px;
                            height : 28px;
                            border-style: outset;
                            font-family:'黑体';
                            font : 18px;}
                            QPushButton:hover:!pressed
                            {color:red;}</string>
     </property>
     <property name="text">
      <string> 登录</string>
     </property>
    </widget>
   </item>
   <item row="2" column="1" colspan="2">
    <widget class="QComboBox" name="comboBox">
     <property name="styleSheet">
      <string notr="true">            QComboBox
            {border:0px;
            border-radius:0;
            margin:10px;
            border-bottom: 2px solid #B3B3B3;
            font-family:'等线';
            font-size:25px;
            font-weight:bold;}
            QComboBox:hover{
                border-bottom:3px solid #66A3FF;
            }
            QComboBox:focus{
                border-bottom:3px solid #E680BD;
            }
</string>
     </property>
     <property name="editable">
      <bool>true</bool>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

python

代码语言:javascript
复制
from ProgressBar import Animation, Progress #ProgressBar.py
class login(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(login, self).__init__(parent)
        self.Fadein = Animation(self)
        self.setupUi()
    def destory_window(self):
        if hasattr(self, "success"):
            main.SetupUi()
        self.close()
    def closeEvent(self, event):
        if not hasattr(self,"Fadeout"):
            self.Fadeout = Animation(self, from_value=1, to_value=0, connect=self.destory_window)
            event.ignore()
        return

    def setupUi(self):
            self.setObjectName("Dialog")
            self.resize(252, 339)
            font = QtGui.QFont()
            font.setFamily("Consolas")
            self.setFont(font)
            self.setStyleSheet("QWidget\n"
                               "{border:15px;\n"
                               "margin:10px;\n"
                               "background-color:rgb(255, 255, 255);\n"
                               "}\n"
                               "QWidget#right_widget\n"
                               "{border-radius:15;}\n"
                               "\n"
                               "")
            self.gridLayout = QtWidgets.QGridLayout(self)
            self.gridLayout.setObjectName("gridLayout")
            self.label_3 = QtWidgets.QLabel(self)
            font = QtGui.QFont()
            font.setFamily("Adobe Arabic")
            font.setPointSize(11)
            self.label_3.setFont(font)
            self.label_3.setStyleSheet("font-color:rgb(0, 0, 0)\n"
                                       "font-size:20px")
            self.label_3.setObjectName("label_3")
            self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
            self.label_2 = QtWidgets.QLabel(self)
            self.label_2.setStyleSheet("color: rgb(99, 99, 99);")
            self.label_2.setObjectName("label_2")
            self.gridLayout.addWidget(self.label_2, 3, 0, 1, 3)
            self.label = QtWidgets.QLabel(self)
            font = QtGui.QFont()
            font.setFamily("Consolas")
            font.setPointSize(22)
            font.setBold(False)
            font.setWeight(50)
            self.label.setFont(font)
            self.label.setStyleSheet("color: rgb(0, 0, 0);")
            self.label.setObjectName("label")
            self.gridLayout.addWidget(self.label, 0, 0, 1, 3)
            self.lineEdit = QtWidgets.QLineEdit(self)
            self.lineEdit.setStyleSheet("            QLineEdit\n"
                                        "            {border:0px;\n"
                                        "            border-radius:0;\n"
                                        "            margin:10px;\n"
                                        "            border-bottom: 2px solid #B3B3B3;\n"
                                        "            font-family:\'等线\';\n"
                                        "            font-size:20px;\n"
                                        "            font-weight:bold;}\n"
                                        "            QLineEdit:hover{\n"
                                        "                border-bottom:3px solid #66A3FF;\n"
                                        "            }\n"
                                        "            QLineEdit:focus{\n"
                                        "                border-bottom:3px solid #E680BD\n"
                                        "            }")
            self.lineEdit.setClearButtonEnabled(True)
            self.lineEdit.setObjectName("lineEdit")
            self.gridLayout.addWidget(self.lineEdit, 1, 0, 1, 3)
            self.pushButton = QtWidgets.QPushButton(self)
            self.pushButton.setEnabled(False)
            self.pushButton.setAccessibleName("")
            self.pushButton.setStyleSheet("                            QPushButton\n"
                                          "                            {text-align : center;\n"
                                          "                            background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #fbc2eb, stop:1 #a6c1ee);\n"
                                          "                            font: bold;\n"
                                          "                            border-color: grey;\n"
                                          "                            border-width: 2px;\n"
                                          "                            border-radius: 10px;\n"
                                          "                            padding: 6px;\n"
                                          "                            height: 28px;\n"
                                          "                            border-style: outset;\n"
                                          "                            margin-left:30px;\n"
                                          "                            margin-right:30px;\n"
                                          "                            font-family:\'黑体\';\n"
                                          "                            font : 18px;}\n"
                                          "\n"
                                          "                            QPushButton:pressed\n"
                                          "                            {text-align : center;\n"
                                          "                            background-color : light gray;\n"
                                          "                            background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #e1aad2, stop:1 #92adda);\n"
                                          "                            font: bold;\n"
                                          "                            color:lightblue;\n"
                                          "                            border-color: gray;\n"
                                          "                            border-width: 2px;\n"
                                          "                            border-radius: 10px;\n"
                                          "                            padding: 6px;\n"
                                          "                            height : 28px;\n"
                                          "                            border-style: outset;\n"
                                          "                            font-family:\'黑体\';\n"
                                          "                            font : 18px;}\n"
                                          "                            QPushButton:hover:!pressed\n"
                                          "                            {color:red;}")
            self.pushButton.setObjectName("pushButton")
            self.gridLayout.addWidget(self.pushButton, 4, 0, 1, 3)
            self.comboBox = QtWidgets.QComboBox(self)
            self.comboBox.addItems(dicts)
            self.comboBox.setStyleSheet("            QComboBox\n"
                                        "            {border:0px;\n"
                                        "            border-radius:0;\n"
                                        "            margin:10px;\n"
                                        "            border-bottom: 2px solid #B3B3B3;\n"
                                        "            font-family:\'等线\';\n"
                                        "            font-size:20px;}\n"
                                        "            QComboBox:hover{\n"
                                        "                border-bottom:3px solid #66A3FF;\n"
                                        "            }\n"
                                        "            QComboBox:focus{\n"
                                        "                border-bottom:3px solid #E680BD;\n"
                                        "            }\n"
                                        "")
            self.comboBox.setEditable(True)
            self.comboBox.setObjectName("comboBox")
            self.gridLayout.addWidget(self.comboBox, 2, 1, 1, 2)
            QtCore.QMetaObject.connectSlotsByName(self)
            _translate = QtCore.QCoreApplication.translate
            self.setWindowTitle(_translate("Dialog", "Login"))
            self.label_3.setText(_translate("Dialog", "连接地址"))
            self.label_2.setText(_translate("Dialog", "[!]未注册将会自动注册"))
            self.label.setText(_translate("Dialog", "Zmh server"))
            self.lineEdit.setPlaceholderText(_translate("Dialog", "用户名(3-15字符)"))
            self.pushButton.setText(_translate("Dialog", " 登录"))
            self.lineEdit.textChanged.connect(self.setEnableds)
            self.pushButton.clicked.connect(self._connect)
            self.show()
    def setEnableds(self, _):
        if 3 <= len(self.lineEdit.text().strip()) <= 15:
            self.pushButton.setEnabled(True)
    @to_logging
    def _connect(self,i):
        texts = self.comboBox.currentText()
        addr = address_split(dicts.get(texts, texts))
        if addr is False:
            QtWidgets.QMessageBox.warning(self, "Error", f"[IP地址:端口]格式不正确!")
        user = self.lineEdit.text().strip()

        self.pushButton.setEnabled(False)
        if s.connect(**addr, data=user,show=self.info):
            self.success = 1
            self.close()
            return
        self.pushButton.setEnabled(True)
    def info(self, text):
        QtWidgets.QMessageBox.information(self, "Login", text)
    def main_surface(self):
        main.SetupUi()
        self.destory_window()

api更改

user.pyw

代码语言:javascript
复制
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui files 'USER.ui', 'Connect.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
import time
import traceback

from PyQt5 import QtCore, QtGui, QtWidgets
import socket, sys, logging
from traceback import format_exc
from datetime import datetime
from time import sleep
from threading import Thread
from ProgressBar import Animation, Progress
from random import randint as rand
import logging  # 引入logging模块
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
TIMEOUT = 2

def get_host_ip() -> str:
    """get current IP address"""
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('8.8.8.8', 80))
        ip = s.getsockname()[0]
    finally:
        s.close()
    return ip
Username = str()
bytecount = 1024
dicts = {"127.0.0.1:429 (默认)" : "127.0.0.1:429",
         f"103.46.128.21:51203 (公网)": "103.46.128.21:51203",
         f"{get_host_ip()}:429 (私网)": f"{get_host_ip()}:429",
         "EXAM-41:429 (微机室)": "EXAM-41:429"}
get_time = lambda: datetime.now().strftime('%H:%M:%S')


def threading(Daemon, **kwargs):
    thread = Thread(**kwargs)
    thread.setDaemon(Daemon)
    thread.start()
    return thread


def to_logging(command):
    def logs(*args, **kwargs):
        try:
            _result = command(*args, **kwargs)
            if _result:
                return _result
            return True
        except ConnectionResetError:
            if "s" in dir():
                s._connect = False
        except Exception as e:
            if "main" in dir():
                main.Show_Message(format_exc())
            else:
                logging.exception(str())
            return False

    return logs

@to_logging
def address_split(address):
    def func(ip="", port=0) -> (str, int):
        return ip, int(port)

    ip, port = func(*address.strip().split(':')[:2])
    return {"ip": ip,
            "port": port}
class Socket:
    def __init__(self, Function=lambda i: None, code='utf-8'):
        self.socket = socket.socket()
        self.code = code
        self._logger = Function
        self.socket.settimeout(TIMEOUT)
        self._connect = False

    def set_func(self, f):
        self._logger = f

    def retry(self):
        del self.socket
        self.socket = socket.socket()
        self.socket.settimeout(TIMEOUT)

    def socket_connect(self):
        if hasattr(self, "_socc"):
            self.retry()  # socket多次连接不同地址会出现 `OSError: [WinError 10022] 提供了一个无效的参数.`
        else:
            self._socc = True
        try:
            self.socket.connect(self.addr)
        except socket.gaierror:
            return f"获取地址信息失败.请确保{self.addr[0]}是有效地址或ipv4/ipv6"
        except socket.timeout:
            return f"连接超时({TIMEOUT}s).服务器[{self.addr[0]}:{self.addr[1]}]连接失败."
        except OverflowError:
            return f"输入的端口号为{self.addr[1]},端口号必须在0~65535间."
        except ConnectionResetError:
            pass
        except OSError as e:
            if int(self.addr[1]) == 0:
                return "[WinError 10049] 在其上下文中,该请求的地址无效"
            return str(e.args[1]).rstrip('。')
        except TypeError:
            return f"网络地址格式错误: 格式[ip:port] port必须为整型变量0~65535间."
        except:
            logging.exception(msg=str())
        else:
            return True

    def connect(self, data=None, ip=None, port: int = 0000, show=lambda: None):
        if data is None:
            assert hasattr(self, "dt"), "user data is empty."
        else:
            self.dt = data

        if ip is None:
            assert hasattr(self, "addr"), "ip address is empty."
        else:
            self.addr = (ip, port)

        result = self.socket_connect()
        if result is True:
            show("[{}]: 连接成功".format(get_time()))
            s._connect = True
            return True
        else:
            show(f"[{get_time()}]: {result}")
            s._connect = False
            return False
    def info(self):
        return repr(self.dt)
    @to_logging
    def _handler(self):
        self.socket.send(self.dt.encode(self.code))
        while True:
            try:
                byte = self.socket.recv(bytecount ** 2)
                if len(byte) == 0:
                    break
                kb = len(byte) / bytecount
                self._logger(f'{byte.decode(encoding=self.code)}                  {"<font size=1>%0.2f kb</font>" % kb}')
            except Exception as e:
                if not type(e) == socket.timeout:
                    for n in ["", "ERROR".center(20, "-")] + format_exc().split('\n') + ["".center(20, "-"), ""]:
                        self._logger(f"<font color='red'>{n}</font>")
                    self.socket.close()
                    return

    def run(self):  # 线程
        self._connect = True
        self.thread = threading(True, target=self._handler)

class login(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(login, self).__init__(parent)
        self.Fadein = Animation(self)
        self.setupUi()
    def destory_window(self):
        if hasattr(self, "success"):
            main.SetupUi()
        self.close()
    def closeEvent(self, event):
        if not hasattr(self,"Fadeout"):
            self.Fadeout = Animation(self, from_value=1, to_value=0, connect=self.destory_window)
            event.ignore()
        return

    def setupUi(self):
            self.setObjectName("Dialog")
            self.resize(252, 339)
            font = QtGui.QFont()
            font.setFamily("Consolas")
            self.setFont(font)
            self.setStyleSheet("QWidget\n"
                               "{border:15px;\n"
                               "margin:10px;\n"
                               "background-color:rgb(255, 255, 255);\n"
                               "}\n"
                               "QWidget#right_widget\n"
                               "{border-radius:15;}\n"
                               "\n"
                               "")
            self.gridLayout = QtWidgets.QGridLayout(self)
            self.gridLayout.setObjectName("gridLayout")
            self.label_3 = QtWidgets.QLabel(self)
            font = QtGui.QFont()
            font.setFamily("Adobe Arabic")
            font.setPointSize(11)
            self.label_3.setFont(font)
            self.label_3.setStyleSheet("font-color:rgb(0, 0, 0)\n"
                                       "font-size:20px")
            self.label_3.setObjectName("label_3")
            self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
            self.label_2 = QtWidgets.QLabel(self)
            self.label_2.setStyleSheet("color: rgb(99, 99, 99);")
            self.label_2.setObjectName("label_2")
            self.gridLayout.addWidget(self.label_2, 3, 0, 1, 3)
            self.label = QtWidgets.QLabel(self)
            font = QtGui.QFont()
            font.setFamily("Consolas")
            font.setPointSize(22)
            font.setBold(False)
            font.setWeight(50)
            self.label.setFont(font)
            self.label.setStyleSheet("color: rgb(0, 0, 0);")
            self.label.setObjectName("label")
            self.gridLayout.addWidget(self.label, 0, 0, 1, 3)
            self.lineEdit = QtWidgets.QLineEdit(self)
            self.lineEdit.setStyleSheet("            QLineEdit\n"
                                        "            {border:0px;\n"
                                        "            border-radius:0;\n"
                                        "            margin:10px;\n"
                                        "            border-bottom: 2px solid #B3B3B3;\n"
                                        "            font-family:\'等线\';\n"
                                        "            font-size:20px;\n"
                                        "            font-weight:bold;}\n"
                                        "            QLineEdit:hover{\n"
                                        "                border-bottom:3px solid #66A3FF;\n"
                                        "            }\n"
                                        "            QLineEdit:focus{\n"
                                        "                border-bottom:3px solid #E680BD\n"
                                        "            }")
            self.lineEdit.setClearButtonEnabled(True)
            self.lineEdit.setObjectName("lineEdit")
            self.gridLayout.addWidget(self.lineEdit, 1, 0, 1, 3)
            self.pushButton = QtWidgets.QPushButton(self)
            self.pushButton.setEnabled(False)
            self.pushButton.setAccessibleName("")
            self.pushButton.setStyleSheet("                            QPushButton\n"
                                          "                            {text-align : center;\n"
                                          "                            background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #fbc2eb, stop:1 #a6c1ee);\n"
                                          "                            font: bold;\n"
                                          "                            border-color: grey;\n"
                                          "                            border-width: 2px;\n"
                                          "                            border-radius: 10px;\n"
                                          "                            padding: 6px;\n"
                                          "                            height: 28px;\n"
                                          "                            border-style: outset;\n"
                                          "                            margin-left:30px;\n"
                                          "                            margin-right:30px;\n"
                                          "                            font-family:\'黑体\';\n"
                                          "                            font : 18px;}\n"
                                          "\n"
                                          "                            QPushButton:pressed\n"
                                          "                            {text-align : center;\n"
                                          "                            background-color : light gray;\n"
                                          "                            background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #e1aad2, stop:1 #92adda);\n"
                                          "                            font: bold;\n"
                                          "                            color:lightblue;\n"
                                          "                            border-color: gray;\n"
                                          "                            border-width: 2px;\n"
                                          "                            border-radius: 10px;\n"
                                          "                            padding: 6px;\n"
                                          "                            height : 28px;\n"
                                          "                            border-style: outset;\n"
                                          "                            font-family:\'黑体\';\n"
                                          "                            font : 18px;}\n"
                                          "                            QPushButton:hover:!pressed\n"
                                          "                            {color:red;}")
            self.pushButton.setObjectName("pushButton")
            self.gridLayout.addWidget(self.pushButton, 4, 0, 1, 3)
            self.comboBox = QtWidgets.QComboBox(self)
            self.comboBox.addItems(dicts)
            self.comboBox.setStyleSheet("            QComboBox\n"
                                        "            {border:0px;\n"
                                        "            border-radius:0;\n"
                                        "            margin:10px;\n"
                                        "            border-bottom: 2px solid #B3B3B3;\n"
                                        "            font-family:\'等线\';\n"
                                        "            font-size:20px;}\n"
                                        "            QComboBox:hover{\n"
                                        "                border-bottom:3px solid #66A3FF;\n"
                                        "            }\n"
                                        "            QComboBox:focus{\n"
                                        "                border-bottom:3px solid #E680BD;\n"
                                        "            }\n"
                                        "")
            self.comboBox.setEditable(True)
            self.comboBox.setObjectName("comboBox")
            self.gridLayout.addWidget(self.comboBox, 2, 1, 1, 2)
            QtCore.QMetaObject.connectSlotsByName(self)
            _translate = QtCore.QCoreApplication.translate
            self.setWindowTitle(_translate("Dialog", "Login"))
            self.label_3.setText(_translate("Dialog", "连接地址"))
            self.label_2.setText(_translate("Dialog", "[!]未注册将会自动注册"))
            self.label.setText(_translate("Dialog", "Zmh server"))
            self.lineEdit.setPlaceholderText(_translate("Dialog", "用户名(3-15字符)"))
            self.pushButton.setText(_translate("Dialog", " 登录"))
            self.lineEdit.textChanged.connect(self.setEnableds)
            self.pushButton.clicked.connect(self._connect)
            self.show()
    def setEnableds(self, _):
        if 3 <= len(self.lineEdit.text().strip()) <= 15:
            self.pushButton.setEnabled(True)
    @to_logging
    def _connect(self,i):
        texts = self.comboBox.currentText()
        addr = address_split(dicts.get(texts, texts))
        if addr is False:
            QtWidgets.QMessageBox.warning(self, "Error", f"[IP地址:端口]格式不正确!")
        user = self.lineEdit.text().strip()

        self.pushButton.setEnabled(False)
        if s.connect(**addr, data=user,show=self.info):
            self.success = 1
            self.close()
            return
        self.pushButton.setEnabled(True)
    def info(self, text):
        QtWidgets.QMessageBox.information(self, "Login", text)
    def main_surface(self):
        main.SetupUi()
        self.destory_window()

class Ui_MainWindow(object):
    def SetupUi(self):
        MainWindow = QtWidgets.QMainWindow()
        self.anim = Animation(MainWindow, )
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 619)
        font = QtGui.QFont()
        font.setFamily("Consolas")
        MainWindow.setFont(font)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_3.setReadOnly(True)
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.gridLayout.addWidget(self.lineEdit_3, 7, 3, 1, 1)
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setStyleSheet("background-color:rgb(44, 176, 13);\n"
                                      "color:rgb(255, 255, 255);\n"
                                      "font: 200 10pt \"Consolas\";")
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 8, 6, 1, 1)
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem, 8, 5, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 6, 1, 1, 1)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem1, 8, 3, 1, 1)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setReadOnly(True)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.gridLayout.addWidget(self.lineEdit_2, 6, 3, 1, 1)
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 5, 1, 1, 1)
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setCursor(QtGui.QCursor(QtCore.Qt.IBeamCursor))
        self.lineEdit.setDragEnabled(False)
        self.lineEdit.setReadOnly(True)
        self.lineEdit.setObjectName("lineEdit")
        self.gridLayout.addWidget(self.lineEdit, 5, 3, 1, 1)
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setObjectName("label_3")
        self.gridLayout.addWidget(self.label_3, 7, 1, 1, 1)
        self.line = QtWidgets.QFrame(self.centralwidget)
        self.line.setFrameShape(QtWidgets.QFrame.VLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.gridLayout.addWidget(self.line, 5, 4, 3, 1)
        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit.setObjectName("textEdit")
        self.gridLayout.addWidget(self.textEdit, 5, 5, 3, 2)
        spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem2, 1, 1, 1, 1)
        self.textEdit_2 = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit_2.setObjectName("textEdit_2")
        self.textEdit_2.setReadOnly(True)
        self.gridLayout.addWidget(self.textEdit_2, 0, 3, 2, 4)
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout.addWidget(self.pushButton_2, 8, 1, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 24))
        self.menubar.setObjectName("menubar")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        self.menulanguage = QtWidgets.QMenu(self.menu)
        self.menulanguage.setObjectName("menulanguage")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionsocket_connet = QtWidgets.QAction(MainWindow)
        self.actionsocket_connet.setObjectName("actionsocket_connet")
        self.actionChinese = QtWidgets.QAction(MainWindow)
        self.actionChinese.setObjectName("actionChinese")
        self.actionip_socket_gethostbyname_socket_gethostname = QtWidgets.QAction(MainWindow)
        self.actionip_socket_gethostbyname_socket_gethostname.setObjectName(
            "actionip_socket_gethostbyname_socket_gethostname")
        self.menulanguage.addSeparator()
        self.menulanguage.addAction(self.actionChinese)
        self.menu.addSeparator()
        self.menu.addAction(self.menulanguage.menuAction())
        self.menu.addAction(self.actionip_socket_gethostbyname_socket_gethostname)
        self.menubar.addAction(self.menu.menuAction())
        self.socket_peername = s.addr[0]
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.MainWindow = MainWindow
        self.pushButton.clicked.connect(self.send)
        self.pushButton_2.clicked.connect(self.re_connect)
        self.connectEnabled(True)
        MainWindow.show()

    @to_logging
    def sendmsg(self):
        data = self.textEdit.toPlainText().strip()
        if data:
            s.socket.send(data.encode('utf8'))
            self.textEdit.clear()
        return True

    @to_logging
    def send(self, _):
        if hasattr(s, "_connect") and s._connect:
            if not self.sendmsg():
                QtWidgets.QMessageBox.information(self.MainWindow, 'TraceBack',
                                                  f'Socket Server<{self.socket_peername}> 断开连接')
                self.connectEnabled(False)
                s._connect = False
        else:
            self.Show_Message("<font color='red'>发送异常. 未连接至服务器.请点击[重新连接服务器]按钮尝试重新连接.</font>")

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Socket"))
        self.lineEdit_2.setText(socket.gethostname())
        self.lineEdit.setText(socket.gethostbyname(socket.gethostname()))
        self.lineEdit_3.setText(self.socket_peername)
        self.pushButton.setText(_translate("MainWindow", "send"))
        self.label_2.setText(_translate("MainWindow", "主机名:"))
        self.label.setText(_translate("MainWindow", "本地端口:"))
        self.label_3.setText(_translate("MainWindow", "连接端口:"))
        self.pushButton_2.setText(_translate("MainWindow", "重新连接服务器"))
        self.menu.setTitle(_translate("MainWindow", "设置"))
        self.menulanguage.setTitle(_translate("MainWindow", "language"))
        self.actionsocket_connet.setText(_translate("MainWindow", "socket connect"))
        self.actionChinese.setText(_translate("MainWindow", "Chinese"))
        self.actionip_socket_gethostbyname_socket_gethostname.setText(
            _translate("MainWindow", "ip: " + socket.gethostbyname(socket.gethostname())))
        s.set_func(self.Show_Message)
        s.run()

    @to_logging
    def re_connect(self, _):
        self.Show_Message(
            "[{}]: 尝试连接服务器[{}],最大超时报错 {}s".format(datetime.now().strftime('%Y %m %d %H:%M:%S'), s.addr[0], TIMEOUT))
        status = s.connect(show=self.Show_Message)
        self.connectEnabled(status)
        if status:
            s.run()

    def connectEnabled(self, status):
        self.pushButton_2.setEnabled(not status)

    def Show_Message(self, data):
        if data:
            for i in data.split('\n'):
                if i:
                    sleep(0.06 / len(data.split('\n')))  # 防止信息过快使Textedit刷新空白
                    self.textEdit_2.append(i)
        self.textEdit_2.moveCursor(QtGui.QTextCursor.End)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    s = Socket()
    conn = login()
    main = Ui_MainWindow()
    sys.exit(app.exec_())

我的文章 ProgressBar.py

server.py

服务器也做了点小改动

代码语言:javascript
复制
import os, socket, sys, time, logging
from threading import Thread
from Qlogging import QLogger
import data #同目录data.py
from psutil import cpu_percent
from PyQt5 import QtCore, QtGui, QtWidgets
#from signal import SIGINT, signal
__version__ = 1.8


def threading(Daemon, **kwargs):
    thread = Thread(**kwargs)
    thread.setDaemon(Daemon)
    thread.start()
    return thread


def ignore(function):
    def i(*args, **kwargs):
        try:
            function(*args, **kwargs)
        except:
            return

    return i


logger = logging.getLogger(__name__)
logger.setLevel(level=logging.DEBUG)
Qlog = QLogger()
logger.addHandler(Qlog)
filehandle = logging.FileHandler("log.txt")
filehandle.setFormatter(logging.Formatter("[%(asctime)s(%(levelname)s)]:  %(message)s"))
logger.addHandler(filehandle)
logger.setLevel(logging.DEBUG)
bytecount = 1024

def to_logging(command):
    def logs(*args, **kwargs):
        try:
            command(*args, **kwargs)
        except:
            logger.exception(str())
            return False
        return True
    return logs
class Command_Handler(object):
    def __init__(self, bind):
        """Bind Client class"""
        assert isinstance(bind, Client)
        self.client = bind

    def _function(self, _list):

        data = {"/info": {"-v": self.get_version(),
                          "-id": self.get_id(),
                          "-i": self.info(),
                          "-h": self.help(),
                          "-name": self.name()},
                }
        _dict = data
        for n in range(len(_list)):
            if type(_dict) == dict:
                _dict = _dict.get(_list[n], self.unknown(" ".join(_list)))
            else:
                break
        if type(_dict) == dict:
            _dict = "Error:\n<font color='blue'>This command must take more arguments. Such as %s.</font>" % list(
                _dict.keys())
        return _dict

    @staticmethod
    def help():
        return """/info [-v] [-id] [-i]
-v : get version of program.
-id : get your id.
-i : get information.
-h : help.
-name : get your name
For example, <font color=red>/info -id</font>"""

    @staticmethod
    def get_version():
        return "version : " + str(__version__)

    def get_id(self):
        return "Your id is {}.".format(id(self.client))

    def name(self):
        return "Your name is {}.".format(self.client.username)

    def info(self):
        return f"Socket Server[version {self.get_version()}] By zmh."

    def unknown(self, s):
        return """Error:
No command named "%s". Please search [/info -h] to help.
%s""" % (s, self.help())

    def cut(self, string):
        return string.strip().split()

    def handler(self, c):
        return "<font color='gray'>[command]</font><font color='brown'>%s</font>\n%s" % (
        c, str(self._function(self.cut(c))))

    def iscommand(self, i):
        return i.strip().startswith("/")


class Server():
    join_message = "<font color='red'>Server></font> <font color='blue'>%s(%s)</font> 连接服务器. 当前在线人数: <font color='red'>%s</font>"
    user_message = "<font color='%s'>%s(%s)%s></font> %s"
    quit_message = "%s(%s) 下线了, %s"
    def __init__(self, gui=None):
        self._call_func = bool(gui)
        if self._call_func:
            self.add_user = gui.add_user
            self.remove_user = gui.remove_user
            self.user_num_change = gui.usernumChanged
    def Setup(self, addr, port, backlog=10, max_count=bytecount**2, encode='utf8'):
        self.address = addr, port
        self.backlog = backlog
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.bind(self.address)
        self.socket.listen(backlog)
        self.max_count = max_count
        self.connect = []
        self.encode = encode
        self.user_record = data.user()
        return self.run()
    def clear_socket(self, clear_ms = 500):
        logger.info(f"Clear the closed socket once every {clear_ms} ms.")
        while True:
            del_list = list(filter(lambda c: hasattr(c, 'Quitted') or (not c.isOpen()), self.connect))
            for user in del_list:
                self.connect.remove(user)
            #if del_list:
            #   logger.info(f"Clear the closed client socket, number is {len(del_list)}.")
            #else:
            #   logger.info('None of the sockets have been cleaned.')
            time.sleep(clear_ms / 1000)

    def run(self):
        logger.debug(f"pid {os.getpid()}.")
        logger.info(f"Server [{':'.join(map(lambda i: str(i), self.address))}] on.")
        logger.info("Backlog number: " + str(self.backlog))
        logger.info('The CODEC is sent as ' + self.encode)
        threading(Daemon=True, target=self.clear_socket)
        return threading(Daemon=True, target=self.accept_client)

    def _get_Clients(self) -> list:
        def func(c):
            return c.__filter__()

        return list(filter(func, self.connect))

    def _get_sockets(self):  # return int
        i = len(self._get_Clients())
        if self._call_func:
            self.user_num_change(i)
        return i

    def _str_sockets(self):
        return f"当前人数 {self._get_sockets()}"

    def ServerMessage(self, mes, inc=True):
        for user in self._get_Clients():
            if user.__filter__():
                user._send(mes)

    def UserMessage(self, address, _user, mes, inc=True):
        if not mes:
            return
        for user in self.connect:
            if user.__filter__():
                username = user.username
                send_message = Server.user_message % ("brown" if _user == username else "red",
                                                      _user,
                                                      address,
                                                      "(我自己)" if _user == username else "",
                                                      mes)
                user._send(send_message)
        logger.info(f"{address}[{_user}] : {mes}")

    def error_handle(self):
        for user in filter(lambda c: not c.isOpen(), self.connect):
            print(user)
            self.connect.remove(user)

    def accept_client(self):
        while True:
            logger.info("The server is listening on the port.")
            client, address = self.socket.accept()  # 阻塞,等待客户端连接
            NewClient = Client(client, address[0], self)
            self.connect.append(NewClient)
            NewClient.run()
            logger.info(f'The address {address[0]} is connected to the server')

    def quit(self, username, address):
        if self._call_func:
            self.remove_user(username)
        QuitMessage = Server.quit_message % (username, address, self._str_sockets())
        logger.info(QuitMessage)
        self.ServerMessage(QuitMessage, False)

    def login(self, username, address):
        if self._call_func:
            self.add_user(username)
        logger.info(f"{address}[{username}] 登录服务器 , " + self._str_sockets())
        self.ServerMessage(Server.join_message % (username, address, self._get_sockets()))


class Client(object):
    class QuitError(Exception):
        def __init__(self, *args):
            super().__init__(*args)

    def __init__(self, socket, addr, server: Server):
        self.socket = socket
        self.addr = addr
        if not isinstance(server, Server):
            raise ValueError
        self.server = server
        self.encode = self.server.encode
        self.max_count = self.server.max_count
        self.com = Command_Handler(self)

        @self.error
        def _recv(self) -> bytes:
            return self.socket.recv(self.max_count).decode(encoding=self.encode).strip()

        self._recv = lambda: _recv(self)

        @self.error
        def _send(self, message=None) -> None:
            if message:
                if isinstance(message,str):
                    message = message.encode(self.encode)
                message += b'\n'    #防止粘包
                self.socket.sendall(message)

        self._send = lambda m: _send(self, m)

    def __del__(self):
        self.socket.close()

    def isLogin(self) -> bool:
        return hasattr(self, "_login") and self._login

    def isOpen(self) -> bool:
        return not getattr(self.socket, "_closed", True)

    def __filter__(self) -> bool:
        """返回是否在线并已可接受消息"""
        return self.isLogin() and self.isOpen()

    def recv(self) -> str:
        data = self._recv()
        while not data:
            data = self._recv()
        # while not (data := self._recv()):
        #   pass
        # 我的PythonIDE是3.8, PyCharm是3.7(anaconda 32x),而赋值表达式是3.8加进来的.
        return data

    @ignore
    def login(self):
        self._send(f'<font color="red">欢迎来到服务器[{self.server.address[0]}].您的ip地址为{self.socket.getpeername()[0]}')
        self.username = self.recv()[:15]
        if self.server.user_record.__in__(self.username):
            self._send("<font color='red'>请输入您的密码: (右下[send]键发送)</font>")
            i = self.recv()
            if self.server.user_record.handler(self.username, i):
                self._send(f'<font color="green">欢迎回来, {self.username}.</font>')
            else:
                self._send('<font color="red">密码错误,请重试.</font>')
                self.__del__()
        else:
            def normal(string):
                return (4 <= len(string) <= 10) and not ('\n' in string)

            while True:
                self._send(
                    "<font color='blue'>[i]提示: 密码需在4 ~ 10位之间, 且不能换行.</font>\n<font color='red'>请输入您的密码: (右下[send]键发送)</font>")
                p1 = self.recv()
                if normal(p1):
                    break
            while True:
                self._send("<font color='red'>再次输入您的密码: (右下[send]键发送)</font>")
                p2 = self.recv()
                if p1 == p2:
                    break
                else:
                    self._send("<font color='red'>密码与前次不符!</font>")
            self.server.user_record.handler(self.username, p1)
            self._send(f'初来乍到, {self.username}')
        self._login = True
        self.server.login(self.username, self.addr)

    def quit(self) -> None:
        if hasattr(self, 'Quitted'):
            return
        self.Quitted = True
        if self.isOpen() is True:
            self.socket.close()
        self.server.quit(self.username, self.addr)


    @ignore
    def forever_receive(self):
        self.login()
        while self.__filter__():
            string = self.recv()
            if string == Client.QuitError:
                return
            if self.com.iscommand(string):
                self._send(self.com.handler(string))
            else:
                self.server.UserMessage(self.addr, self.username, string)

    def error(self, func):
        def function(*args, **kwargs):
            try:
                res = func(*args, **kwargs)
                return res
            except ConnectionAbortedError as e:
                self.quit()
            except Exception:
                logger.exception("error")
                return Client.QuitError

        return function

    def run(self):
        self.thread = threading(True, target=self.forever_receive)


def get_host_ip() -> str:
    """get current IP address"""
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('8.8.8.8', 80))
        ip = s.getsockname()[0]
    finally:
        s.close()
    return ip

class Iterface(QtWidgets.QMainWindow):
        Database_signal = QtCore.pyqtSignal(str)
        def __init__(self):
            super(Iterface, self).__init__()
            self.setupUi()
            self.show()
        def setupUi(self):
            self.setObjectName("MainWindow")
            self.resize(788, 685)
            font = QtGui.QFont()
            font.setFamily("Consolas")
            font.setPointSize(11)
            self.setFont(font)
            self.setStyleSheet("")
            self.centralwidget = QtWidgets.QWidget(self)
            self.centralwidget.setObjectName("centralwidget")
            self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
            self.gridLayout.setObjectName("gridLayout")
            self.label_6 = QtWidgets.QLabel(self.centralwidget)
            self.label_6.setObjectName("label_6")
            self.gridLayout.addWidget(self.label_6, 4, 0, 1, 1)
            self.textEdit_2 = QtWidgets.QTextEdit(self.centralwidget)
            self.textEdit_2.setObjectName("textEdit_2")
            self.gridLayout.addWidget(self.textEdit_2, 5, 0, 1, 1)
            self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
            self.groupBox.setObjectName("groupBox")
            self.formLayout_2 = QtWidgets.QFormLayout(self.groupBox)
            self.formLayout_2.setObjectName("formLayout_2")
            self.label_2 = QtWidgets.QLabel(self.groupBox)
            self.label_2.setObjectName("label_2")
            self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_2)
            self.lineEdit = QtWidgets.QLineEdit(self.groupBox)
            self.lineEdit.setObjectName("lineEdit")
            self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEdit)
            self.label_8 = QtWidgets.QLabel(self.groupBox)
            self.label_8.setObjectName("label_8")
            self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_8)
            self.lineEdit_3 = QtWidgets.QLineEdit(self.groupBox)
            self.lineEdit_3.setObjectName("lineEdit_3")
            self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEdit_3)
            self.label_7 = QtWidgets.QLabel(self.groupBox)
            self.label_7.setObjectName("label_7")
            self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_7)
            self.lineEdit_2 = QtWidgets.QLineEdit(self.groupBox)
            self.lineEdit_2.setReadOnly(True)
            self.lineEdit_2.setObjectName("lineEdit_2")
            self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.lineEdit_2)
            spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
            self.formLayout_2.setItem(5, QtWidgets.QFormLayout.LabelRole, spacerItem)
            self.pushButton = QtWidgets.QPushButton(self.groupBox)
            self.pushButton.setObjectName("pushButton")
            self.formLayout_2.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.pushButton)
            self.lineEdit_4 = QtWidgets.QLineEdit(self.groupBox)
            self.lineEdit_4.setObjectName("lineEdit_4")
            self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.lineEdit_4)
            self.label_9 = QtWidgets.QLabel(self.groupBox)
            self.label_9.setObjectName("label_9")
            self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_9)
            self.label_10 = QtWidgets.QLabel(self.groupBox)
            self.label_10.setObjectName("label_10")
            self.formLayout_2.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_10)
            self.lineEdit_5 = QtWidgets.QLineEdit(self.groupBox)
            self.lineEdit_5.setObjectName("lineEdit_5")
            self.formLayout_2.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.lineEdit_5)
            self.gridLayout.addWidget(self.groupBox, 0, 0, 4, 1)
            self.line = QtWidgets.QFrame(self.centralwidget)
            self.line.setFrameShape(QtWidgets.QFrame.VLine)
            self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
            self.line.setObjectName("line")
            self.gridLayout.addWidget(self.line, 2, 1, 4, 1)
            self.label_5 = QtWidgets.QLabel(self.centralwidget)
            font = QtGui.QFont()
            font.setFamily("Comic Sans MS")
            font.setPointSize(14)
            font.setBold(False)
            font.setWeight(50)
            self.label_5.setFont(font)
            self.label_5.setStyleSheet("background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(0, 255, 241, 255), stop:0.930348 rgba(0, 158, 255, 255));\n"
    "color:rgb(85, 0, 255)")
            self.label_5.setObjectName("label_5")
            self.gridLayout.addWidget(self.label_5, 0, 1, 1, 3)
            self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget)
            self.groupBox_2.setEnabled(False)
            self.groupBox_2.setObjectName("groupBox_2")
            self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox_2)
            self.gridLayout_2.setObjectName("gridLayout_2")
            self.lcdNumber = QtWidgets.QLCDNumber(self.groupBox_2)
            self.lcdNumber.setObjectName("lcdNumber")
            self.gridLayout_2.addWidget(self.lcdNumber, 1, 1, 1, 1)
            self.line_3 = QtWidgets.QFrame(self.groupBox_2)
            self.line_3.setFrameShape(QtWidgets.QFrame.HLine)
            self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken)
            self.line_3.setObjectName("line_3")
            self.gridLayout_2.addWidget(self.line_3, 3, 0, 1, 2)
            self.listView_2 = QtWidgets.QListWidget(self.groupBox_2)
            self.listView_2.setObjectName("listView_2")
            self.gridLayout_2.addWidget(self.listView_2, 5, 0, 1, 2)
            self.label_4 = QtWidgets.QLabel(self.groupBox_2)
            self.label_4.setObjectName("label_4")
            self.gridLayout_2.addWidget(self.label_4, 4, 0, 1, 1)
            self.label_3 = QtWidgets.QLabel(self.groupBox_2)
            self.label_3.setObjectName("label_3")
            self.gridLayout_2.addWidget(self.label_3, 1, 0, 1, 1)
            self.label = QtWidgets.QLabel(self.groupBox_2)
            self.label.setObjectName("label")
            self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
            self.progressBar = QtWidgets.QProgressBar(self.groupBox_2)
            self.progressBar.setProperty("value", 0)
            self.progressBar.setObjectName("progressBar")
            self.gridLayout_2.addWidget(self.progressBar, 0, 1, 1, 1)
            self.gridLayout.addWidget(self.groupBox_2, 1, 2, 5, 2)
            self.textEdit_2.setReadOnly(True)
            self.setCentralWidget(self.centralwidget)
            self.statusbar = QtWidgets.QStatusBar(self)
            self.statusbar.setObjectName("statusbar")
            self.setStatusBar(self.statusbar)
            self.groupBox_2.setEnabled(False)
            self.retranslateUi()
            self.pushButton.clicked.connect(self.run)
            QtCore.QMetaObject.connectSlotsByName(self)
            self.lcdNumber.display(0)
            self.cpu = cpuThread()
            self.cpu.signal.connect(self.progessUpdate)
            self.Database_signal.connect(self.databaseUpdate)
            Qlog.connect(self.Database_signal.emit)
        def progessUpdate(self,v):
            self.progressBar.setValue(int(v))
        @to_logging
        def handle(self):
            self.max_recv = int(self.lineEdit.text())
            self.backlog = int(self.lineEdit_3.text())
            self.addr = self.lineEdit_4.text()
            self.port = int(self.lineEdit_5.text())
            server.Setup(self.addr, self.port, self.backlog, self.max_recv)
        def run(self, _):
            if self.handle():
                self.groupBox.setEnabled(False)
                self.groupBox_2.setEnabled(True)
                self.timer = QtCore.QTimer()
                self.cpu.start()


        def databaseUpdate(self, data:str):
            if data:
                    time.sleep(0.01) #Qpainter过快导致死机
                    self.textEdit_2.append(data.strip())
            self.textEdit_2.moveCursor(QtGui.QTextCursor.End)
        def usernumChanged(self, int):
            if int != int(self.lcdNumber.value()):
                self.lcdNumber.display(int)
        def add_user(self, name:str):
            self.listView_2.addItem(name)
        def remove_user(self, name:str):
            for i in range(self.listView_2.count()):
                if name == self.listView_2.item(i).text():
                    self.listView_2.takeItem(i)
                    return True
            return False
        def retranslateUi(self,):
            _translate = QtCore.QCoreApplication.translate
            self.setWindowTitle(_translate("MainWindow", "Socket Server"))
            self.label_6.setText(_translate("MainWindow", "Database(Logging and traceback):"))
            self.groupBox.setTitle(_translate("MainWindow", "Server Setup"))
            self.label_2.setText(_translate("MainWindow", "Maximum load(kb):"))
            self.lineEdit.setText(_translate("MainWindow", "1024"))
            self.label_8.setText(_translate("MainWindow", "backlog:"))
            self.lineEdit_3.setText(_translate("MainWindow", "10"))
            self.label_7.setText(_translate("MainWindow", "CODEC(Unalterable):"))
            self.lineEdit_2.setText(_translate("MainWindow", "utf8"))
            self.pushButton.setText(_translate("MainWindow", "Run"))
            self.lineEdit_4.setText(_translate("MainWindow", "127.0.0.1"))
            self.label_9.setText(_translate("MainWindow", "Address:"))
            self.label_10.setText(_translate("MainWindow", "Port:"))
            self.lineEdit_5.setText(_translate("MainWindow", "429"))
            self.label_5.setText(_translate("MainWindow", f"TCP Server v{__version__}"))
            self.groupBox_2.setTitle(_translate("MainWindow", "Run"))
            self.label_4.setText(_translate("MainWindow", "Logged in users:"))
            self.label_3.setText(_translate("MainWindow", "Online user(s):"))
            self.label.setText(_translate("MainWindow", "Running memory with CPU"))
class cpuThread(QtCore.QThread):
        signal = QtCore.pyqtSignal(int)
        def run(self) -> None:
            while True:
                self.signal.emit(int(cpu_percent(interval=1)))
if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        gui = Iterface()
        server = Server()
        sys.exit(app.exec_())
Hey!有看到这了的吗?

整了一天终于整完了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • ui
  • python
  • api更改
    • user.pyw
      • 我的文章 ProgressBar.py
        • server.py
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档