diff --git a/doc/安全性测试用例.docx b/doc/安全性测试用例.docx
deleted file mode 100644
index 33a5fbc..0000000
Binary files a/doc/安全性测试用例.docx and /dev/null differ
diff --git a/doc/软件测试计划——学员队的通知广播与应答反馈系统类.docx b/doc/测试用例.docx
similarity index 100%
rename from doc/软件测试计划——学员队的通知广播与应答反馈系统类.docx
rename to doc/测试用例.docx
diff --git a/doc/第一周说明书(V4.2).docx b/doc/第一周说明书(V4.2).docx
deleted file mode 100644
index 49fbc11..0000000
Binary files a/doc/第一周说明书(V4.2).docx and /dev/null differ
diff --git a/doc/第一周说明书(V4.3).docx b/doc/第一周说明书(V4.3).docx
deleted file mode 100644
index 2e16de4..0000000
Binary files a/doc/第一周说明书(V4.3).docx and /dev/null differ
diff --git a/doc/第一周说明书(V4.6).docx b/doc/第一周说明书(V4.6).docx
deleted file mode 100644
index 21369ae..0000000
Binary files a/doc/第一周说明书(V4.6).docx and /dev/null differ
diff --git a/doc/第一周说明书(V4.8).docx b/doc/第一周说明书(V4.8).docx
deleted file mode 100644
index cb5811a..0000000
Binary files a/doc/第一周说明书(V4.8).docx and /dev/null differ
diff --git a/doc/第一周说明书(V4.9)(1).docx b/doc/第一周说明书(V4.9)(1).docx
deleted file mode 100644
index 0fef7e0..0000000
Binary files a/doc/第一周说明书(V4.9)(1).docx and /dev/null differ
diff --git a/doc/软件创意说明书.docx b/doc/软件创意说明书.docx
new file mode 100644
index 0000000..13d2f49
Binary files /dev/null and b/doc/软件创意说明书.docx differ
diff --git a/doc/详细设计.docx b/doc/软件设计说明书.docx
similarity index 96%
rename from doc/详细设计.docx
rename to doc/软件设计说明书.docx
index 42a4085..c5722a5 100644
Binary files a/doc/详细设计.docx and b/doc/软件设计说明书.docx differ
diff --git a/doc/软件需求规格说明书.docx b/doc/软件需求说明书.docx
similarity index 100%
rename from doc/软件需求规格说明书.docx
rename to doc/软件需求说明书.docx
diff --git a/src/5b8614f82dcbe.png b/src/5b8614f82dcbe.png
new file mode 100644
index 0000000..3b713f8
Binary files /dev/null and b/src/5b8614f82dcbe.png differ
diff --git a/src/5b9727f3d0d36.png b/src/5b9727f3d0d36.png
new file mode 100644
index 0000000..04841e6
Binary files /dev/null and b/src/5b9727f3d0d36.png differ
diff --git a/src/60095432812563c.png b/src/60095432812563c.png
new file mode 100644
index 0000000..7e10ecc
Binary files /dev/null and b/src/60095432812563c.png differ
diff --git a/src/600954328562131233c.png b/src/600954328562131233c.png
new file mode 100644
index 0000000..beace9d
Binary files /dev/null and b/src/600954328562131233c.png differ
diff --git a/src/600954328563c.png b/src/600954328563c.png
new file mode 100644
index 0000000..22b7f18
Binary files /dev/null and b/src/600954328563c.png differ
diff --git a/src/background.png b/src/background.png
new file mode 100644
index 0000000..47f7591
Binary files /dev/null and b/src/background.png differ
diff --git a/src/background2.png b/src/background2.png
new file mode 100644
index 0000000..bbe4d2c
Binary files /dev/null and b/src/background2.png differ
diff --git a/src/client.py b/src/client.py
new file mode 100644
index 0000000..0d255dd
--- /dev/null
+++ b/src/client.py
@@ -0,0 +1,120 @@
+#当部署到别的计算机时手动改修改PORT 和 ADDR
+
+import socket
+import json
+import rsa
+from binascii import hexlify
+import os
+import threading
+import sys
+from PyQt5.QtCore import QObject , pyqtSignal
+
+class Client(QObject):
+ DISCONNECT_MESSAGE = "!DISCONNECT"
+ send_data_Signal = pyqtSignal(dict)
+ send_userlist_Signal = pyqtSignal(dict)
+ def __init__(self,parent=None):
+ super(Client,self).__init__(parent)
+ IP = socket.gethostbyname(socket.gethostname())
+ PORT = 1
+ ADDR = (IP, PORT)
+ self.ADDR = ADDR
+ self.username = ""
+ self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ self.active_users = {}
+ self.dict={}
+ def disconnection(self):
+ data = {"sender": self.username, "receiver": "disconnect", "msg": self.DISCONNECT_MESSAGE}
+ self.client.send(json.dumps(data).encode())
+
+ def set_username(self,username,password):
+ self.username = username
+ print("set user name")
+ print(self.username)
+
+
+ def send_broadcast(self):
+ print("start broadcast!")
+ print(self.active_users)
+ print("activeuser")
+ for receiver in self.active_users:
+
+ print(receiver)
+ self.send(receiver)
+
+
+ def send(self,receiver):
+ #data = {"sender": self.username, "receiver": receiver, "msg": msg.decode(),"startdatetime":startdatetime,"enddatetime":enddatetime}
+ data = self.dict
+ data["receiver"] = receiver
+ if receiver in self.active_users.keys():
+ self.client.send(json.dumps(data).encode())
+
+ def update_users(self, users):
+ #******这里是全体学员信号更新
+ self.send_userlist_Signal.emit(users)
+ del users[self.username]
+ self.active_users = users
+
+ def init_data(self):
+ data = {"username": self.username}
+ self.client.send(json.dumps(data).encode())
+
+ def listen(self):
+ self.init_data()
+ while True:
+ data = self.client.recv(1024).decode()
+ data = json.loads(data)
+ if "users" in data.keys():
+ self.update_users(data["users"])
+ print("update user!!!!!!!")
+ print(data["users"])
+ else:
+ msg = data["msg"]
+ if msg == "DISCONNECTING":
+ print("disconnect!")
+ break
+ #*******接收到信息更新列表
+ self.send_data_Signal.emit(data)
+ print(f"\n[NEW MESSAGE VERIFIED] {data['sender']}: \nMessage: {msg}", end="")
+
+
+ def receive_from_ui(self,dict):
+ #dict.update({{"sender": self.username}})
+ dict["sender"]=self.username
+ print("receive_from_ui:")
+ print(dict)
+ self.dict = dict
+
+ def run(self):
+ try:
+ print("client runing!")
+ print("username:"+self.username)
+ print(f"[CONNECTION] Starting connection to {self.ADDR}")
+
+ self.client.connect(self.ADDR)
+ thread = threading.Thread(target=self.listen)
+ thread.start()
+
+ #self.run_step()
+ except Exception as e:
+ pass
+ def run_step(self):
+ try:
+ receiver = self.dict["receiver"]
+ if receiver == "broadcast":
+ self.send_broadcast()
+ else:
+ self.send(receiver)
+ except:
+ print("run_step erro!")
+
+"""
+IP = socket.gethostbyname(socket.gethostname())
+PORT = 1
+ADDR = (IP, PORT)
+
+username = input("Insert username: ")
+client = Client(ADDR, username)
+client.run()
+"""
\ No newline at end of file
diff --git a/src/client_voice_cmd.py b/src/client_voice_cmd.py
new file mode 100644
index 0000000..2e73aa8
--- /dev/null
+++ b/src/client_voice_cmd.py
@@ -0,0 +1,56 @@
+import socket
+import threading
+import pyaudio
+
+
+class Client_voice_cmd:
+ def __init__(self):
+ self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+
+ while 1:
+ try:
+ self.target_ip = socket.gethostbyname(socket.gethostname())
+ self.target_port = 2
+
+ self.s.connect((self.target_ip, self.target_port))
+
+ break
+ except:
+ print("Couldn't connect to server")
+
+ chunk_size = 1024 # 512
+ audio_format = pyaudio.paInt16
+ channels = 1
+ rate = 20000
+
+ # initialise microphone recording
+ self.p = pyaudio.PyAudio()
+ self.playing_stream = self.p.open(format=audio_format, channels=channels, rate=rate, output=True,
+ frames_per_buffer=chunk_size)
+ self.recording_stream = self.p.open(format=audio_format, channels=channels, rate=rate, input=True,
+ frames_per_buffer=chunk_size)
+
+ print("Connected to Server")
+
+ # start threads
+ receive_thread = threading.Thread(target=self.receive_server_data).start()
+ self.send_data_to_server()
+
+ def receive_server_data(self):
+ while True:
+ try:
+ data = self.s.recv(1024)
+ self.playing_stream.write(data) # write就是播放数据
+ except:
+ pass
+
+ def send_data_to_server(self):
+ while True:
+ try:
+ data = self.recording_stream.read(1024) # read就是写回数据
+ self.s.sendall(data)
+ except:
+ pass
+
+
+#client = Client_voice_cmd()
diff --git a/src/client_voice_stu.py b/src/client_voice_stu.py
new file mode 100644
index 0000000..fbe4457
--- /dev/null
+++ b/src/client_voice_stu.py
@@ -0,0 +1,56 @@
+import socket
+import threading
+import pyaudio
+
+
+class Client_voice_stu:
+ def __init__(self):
+ self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+
+ while 1:
+ try:
+ self.target_ip = socket.gethostbyname(socket.gethostname())
+ self.target_port = 2
+
+ self.s.connect((self.target_ip, self.target_port))
+
+ break
+ except:
+ print("Couldn't connect to server")
+
+ chunk_size = 1024 # 512
+ audio_format = pyaudio.paInt16
+ channels = 1
+ rate = 20000
+
+ # initialise microphone recording
+ self.p = pyaudio.PyAudio()
+ self.playing_stream = self.p.open(format=audio_format, channels=channels, rate=rate, output=True,
+ frames_per_buffer=chunk_size)
+ self.recording_stream = self.p.open(format=audio_format, channels=channels, rate=rate, input=True,
+ frames_per_buffer=chunk_size)
+
+ print("Connected to Server")
+
+ # start threads
+ receive_thread = threading.Thread(target=self.receive_server_data).start()
+ #self.send_data_to_server()
+
+ def receive_server_data(self):
+ while True:
+ try:
+ data = self.s.recv(1024)
+ self.playing_stream.write(data) # write就是播放数据
+ except:
+ pass
+
+ def send_data_to_server(self):
+ while True:
+ try:
+ data = self.recording_stream.read(1024) # read就是写回数据
+ self.s.sendall(data)
+ except:
+ pass
+
+
+#client = Client_voice_stu()
diff --git a/src/cmd_send_msg.py b/src/cmd_send_msg.py
new file mode 100644
index 0000000..9ad94f4
--- /dev/null
+++ b/src/cmd_send_msg.py
@@ -0,0 +1,652 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'cmd_send_msg.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.2
+#
+# 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 sys
+from PyQt5 import QtCore, QtGui, QtWidgets
+from PyQt5.QtGui import *
+from PyQt5.QtWidgets import *
+from PyQt5.QtCore import QDate, QDateTime , QTime
+from PyQt5.QtCore import pyqtSignal,QObject
+import datetime
+
+
+
+class Ui_Main_cmd_msg(QMainWindow):
+ send_data_Signal = pyqtSignal(dict)
+ send_voice_data_Signal = pyqtSignal()
+ table_row = 0
+ def setupUi(self, Main_cmd_msg):
+ Main_cmd_msg.setObjectName("Main_cmd_msg")
+ Main_cmd_msg.resize(1011, 866)
+ self.centralwidget = QtWidgets.QWidget(Main_cmd_msg)
+ self.centralwidget.setObjectName("centralwidget")
+ self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
+ self.tabWidget.setGeometry(QtCore.QRect(20, 60, 991, 731))
+ self.tabWidget.setMouseTracking(False)
+ self.tabWidget.setTabPosition(QtWidgets.QTabWidget.North)
+ self.tabWidget.setTabShape(QtWidgets.QTabWidget.Triangular)
+ self.tabWidget.setElideMode(QtCore.Qt.ElideNone)
+ self.tabWidget.setDocumentMode(False)
+ self.tabWidget.setTabsClosable(False)
+ self.tabWidget.setMovable(False)
+ self.tabWidget.setTabBarAutoHide(False)
+ self.tabWidget.setObjectName("tabWidget")
+ self.tab_3 = QtWidgets.QWidget()
+ self.tab_3.setObjectName("tab_3")
+ self.layoutWidget = QtWidgets.QWidget(self.tab_3)
+ self.layoutWidget.setGeometry(QtCore.QRect(10, 10, 171, 261))
+ self.layoutWidget.setObjectName("layoutWidget")
+ self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget)
+ self.verticalLayout.setContentsMargins(0, 0, 0, 0)
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.radioButton_gb = QtWidgets.QRadioButton(self.layoutWidget)
+ self.radioButton_gb.setObjectName("radioButton_gb")
+ self.verticalLayout.addWidget(self.radioButton_gb)
+ self.radioButton_db = QtWidgets.QRadioButton(self.layoutWidget)
+ self.radioButton_db.setObjectName("radioButton_db")
+ self.verticalLayout.addWidget(self.radioButton_db)
+ self.radioButton_dsbb = QtWidgets.QRadioButton(self.layoutWidget)
+ self.radioButton_dsbb.setObjectName("radioButton_dsbb")
+ self.verticalLayout.addWidget(self.radioButton_dsbb)
+ self.textEdit = QtWidgets.QTextEdit(self.tab_3)
+ self.textEdit.setGeometry(QtCore.QRect(370, 300, 441, 271))
+ self.textEdit.setObjectName("textEdit")
+ self.layoutWidget_2 = QtWidgets.QWidget(self.tab_3)
+ self.layoutWidget_2.setGeometry(QtCore.QRect(360, 140, 445, 131))
+ self.layoutWidget_2.setObjectName("layoutWidget_2")
+ self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget_2)
+ self.gridLayout.setContentsMargins(0, 0, 0, 0)
+ self.gridLayout.setObjectName("gridLayout")
+ self.dateTimeEdit = QtWidgets.QDateTimeEdit(self.layoutWidget_2)
+ self.dateTimeEdit.setObjectName("dateTimeEdit")
+ self.gridLayout.addWidget(self.dateTimeEdit, 2, 1, 1, 1)
+ self.pushButton_2 = QtWidgets.QPushButton(self.layoutWidget_2)
+ self.pushButton_2.setObjectName("pushButton_2")
+ self.gridLayout.addWidget(self.pushButton_2, 2, 2, 1, 1)
+ self.pushButton = QtWidgets.QPushButton(self.layoutWidget_2)
+ self.pushButton.setObjectName("pushButton")
+ self.gridLayout.addWidget(self.pushButton, 1, 2, 1, 1)
+ self.label_3 = QtWidgets.QLabel(self.layoutWidget_2)
+ self.label_3.setObjectName("label_3")
+ self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1)
+ self.label = QtWidgets.QLabel(self.layoutWidget_2)
+ self.label.setObjectName("label")
+ self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
+ self.lineEdit = QtWidgets.QLineEdit(self.layoutWidget_2)
+ self.lineEdit.setObjectName("lineEdit")
+ self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 2)
+ self.dateTimeEdit_2 = QtWidgets.QDateTimeEdit(self.layoutWidget_2)
+ self.dateTimeEdit_2.setObjectName("dateTimeEdit_2")
+ self.gridLayout.addWidget(self.dateTimeEdit_2, 1, 1, 1, 1)
+ self.label_2 = QtWidgets.QLabel(self.layoutWidget_2)
+ self.label_2.setObjectName("label_2")
+ self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
+ self.label_7 = QtWidgets.QLabel(self.layoutWidget_2)
+ self.label_7.setObjectName("label_7")
+ self.gridLayout.addWidget(self.label_7, 3, 0, 1, 1)
+ self.dateTimeEdit_3 = QtWidgets.QDateTimeEdit(self.layoutWidget_2)
+ self.dateTimeEdit_3.setObjectName("dateTimeEdit_3")
+ self.gridLayout.addWidget(self.dateTimeEdit_3, 3, 1, 1, 1)
+ self.pushButton_4 = QtWidgets.QPushButton(self.layoutWidget_2)
+ self.pushButton_4.setObjectName("pushButton_4")
+ self.gridLayout.addWidget(self.pushButton_4, 3, 2, 1, 1)
+ self.layoutWidget_4 = QtWidgets.QWidget(self.tab_3)
+ self.layoutWidget_4.setGeometry(QtCore.QRect(370, 570, 441, 91))
+ self.layoutWidget_4.setObjectName("layoutWidget_4")
+ self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.layoutWidget_4)
+ self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
+ self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+ self.pushButton_send_1 = QtWidgets.QPushButton(self.layoutWidget_4)
+ self.pushButton_send_1.setObjectName("pushButton_send_1")
+ self.horizontalLayout_2.addWidget(self.pushButton_send_1)
+ self.pushButton_3 = QtWidgets.QPushButton(self.layoutWidget_4)
+ self.pushButton_3.setObjectName("pushButton_3")
+ self.horizontalLayout_2.addWidget(self.pushButton_3)
+ self.label_4 = QtWidgets.QLabel(self.tab_3)
+ self.label_4.setGeometry(QtCore.QRect(270, 290, 72, 51))
+ self.label_4.setObjectName("label_4")
+ self.gridLayoutWidget = QtWidgets.QWidget(self.tab_3)
+ self.gridLayoutWidget.setGeometry(QtCore.QRect(0, 370, 261, 171))
+ self.gridLayoutWidget.setObjectName("gridLayoutWidget")
+ self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget)
+ self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
+ self.gridLayout_2.setObjectName("gridLayout_2")
+ self.checkBox_2 = QtWidgets.QCheckBox(self.gridLayoutWidget)
+ self.checkBox_2.setObjectName("checkBox_2")
+ self.gridLayout_2.addWidget(self.checkBox_2, 0, 1, 1, 1)
+ self.checkBox_6 = QtWidgets.QCheckBox(self.gridLayoutWidget)
+ self.checkBox_6.setObjectName("checkBox_6")
+ self.gridLayout_2.addWidget(self.checkBox_6, 1, 2, 1, 1)
+ self.checkBox_7 = QtWidgets.QCheckBox(self.gridLayoutWidget)
+ self.checkBox_7.setObjectName("checkBox_7")
+ self.gridLayout_2.addWidget(self.checkBox_7, 2, 0, 1, 1)
+ self.checkBox_9 = QtWidgets.QCheckBox(self.gridLayoutWidget)
+ self.checkBox_9.setObjectName("checkBox_9")
+ self.gridLayout_2.addWidget(self.checkBox_9, 2, 2, 1, 1)
+ self.checkBox_5 = QtWidgets.QCheckBox(self.gridLayoutWidget)
+ self.checkBox_5.setObjectName("checkBox_5")
+ self.gridLayout_2.addWidget(self.checkBox_5, 1, 1, 1, 1)
+ self.checkBox_4 = QtWidgets.QCheckBox(self.gridLayoutWidget)
+ self.checkBox_4.setObjectName("checkBox_4")
+ self.gridLayout_2.addWidget(self.checkBox_4, 1, 0, 1, 1)
+ self.checkBox_8 = QtWidgets.QCheckBox(self.gridLayoutWidget)
+ self.checkBox_8.setObjectName("checkBox_8")
+ self.gridLayout_2.addWidget(self.checkBox_8, 2, 1, 1, 1)
+ self.checkBox_10 = QtWidgets.QCheckBox(self.gridLayoutWidget)
+ self.checkBox_10.setObjectName("checkBox_10")
+ self.gridLayout_2.addWidget(self.checkBox_10, 3, 0, 1, 1)
+ self.checkBox_3 = QtWidgets.QCheckBox(self.gridLayoutWidget)
+ self.checkBox_3.setObjectName("checkBox_3")
+ self.gridLayout_2.addWidget(self.checkBox_3, 0, 2, 1, 1)
+ self.checkBox = QtWidgets.QCheckBox(self.gridLayoutWidget)
+ self.checkBox.setObjectName("checkBox")
+ self.gridLayout_2.addWidget(self.checkBox, 0, 0, 1, 1)
+ self.label_6 = QtWidgets.QLabel(self.tab_3)
+ self.label_6.setGeometry(QtCore.QRect(440, 30, 281, 41))
+ font = QtGui.QFont()
+ font.setFamily("华文宋体")
+ font.setPointSize(18)
+ self.label_6.setFont(font)
+ self.label_6.setObjectName("label_6")
+ self.label_12 = QtWidgets.QLabel(self.tab_3)
+ self.label_12.setGeometry(QtCore.QRect(0, 310, 211, 41))
+ font = QtGui.QFont()
+ font.setFamily("Adobe Arabic")
+ font.setPointSize(12)
+ self.label_12.setFont(font)
+ self.label_12.setObjectName("label_12")
+ self.tabWidget.addTab(self.tab_3, "")
+ self.tab_4 = QtWidgets.QWidget()
+ self.tab_4.setObjectName("tab_4")
+ self.gridLayoutWidget_3 = QtWidgets.QWidget(self.tab_4)
+ self.gridLayoutWidget_3.setGeometry(QtCore.QRect(140, 90, 691, 171))
+ self.gridLayoutWidget_3.setObjectName("gridLayoutWidget_3")
+ self.gridLayout_5 = QtWidgets.QGridLayout(self.gridLayoutWidget_3)
+ self.gridLayout_5.setContentsMargins(0, 0, 0, 0)
+ self.gridLayout_5.setObjectName("gridLayout_5")
+ self.page2_checkBox_4 = QtWidgets.QCheckBox(self.gridLayoutWidget_3)
+ self.page2_checkBox_4.setObjectName("page2_checkBox_4")
+ self.gridLayout_5.addWidget(self.page2_checkBox_4, 1, 0, 1, 1)
+ self.page2_checkBox_6 = QtWidgets.QCheckBox(self.gridLayoutWidget_3)
+ self.page2_checkBox_6.setObjectName("page2_checkBox_6")
+ self.gridLayout_5.addWidget(self.page2_checkBox_6, 1, 2, 1, 1)
+ self.page2_checkBox_9 = QtWidgets.QCheckBox(self.gridLayoutWidget_3)
+ self.page2_checkBox_9.setObjectName("page2_checkBox_9")
+ self.gridLayout_5.addWidget(self.page2_checkBox_9, 2, 2, 1, 1)
+ self.page2_checkBox_5 = QtWidgets.QCheckBox(self.gridLayoutWidget_3)
+ self.page2_checkBox_5.setObjectName("page2_checkBox_5")
+ self.gridLayout_5.addWidget(self.page2_checkBox_5, 1, 1, 1, 1)
+ self.page2_checkBox_2 = QtWidgets.QCheckBox(self.gridLayoutWidget_3)
+ self.page2_checkBox_2.setObjectName("page2_checkBox_2")
+ self.gridLayout_5.addWidget(self.page2_checkBox_2, 0, 1, 1, 1)
+ self.page2_checkBox_3 = QtWidgets.QCheckBox(self.gridLayoutWidget_3)
+ self.page2_checkBox_3.setObjectName("page2_checkBox_3")
+ self.gridLayout_5.addWidget(self.page2_checkBox_3, 0, 2, 1, 1)
+ self.page2_checkBox_7 = QtWidgets.QCheckBox(self.gridLayoutWidget_3)
+ self.page2_checkBox_7.setObjectName("page2_checkBox_7")
+ self.gridLayout_5.addWidget(self.page2_checkBox_7, 2, 0, 1, 1)
+ self.page2_checkBox_1 = QtWidgets.QCheckBox(self.gridLayoutWidget_3)
+ self.page2_checkBox_1.setObjectName("page2_checkBox_1")
+ self.gridLayout_5.addWidget(self.page2_checkBox_1, 0, 0, 1, 1)
+ self.page2_checkBox_8 = QtWidgets.QCheckBox(self.gridLayoutWidget_3)
+ self.page2_checkBox_8.setObjectName("page2_checkBox_8")
+ self.gridLayout_5.addWidget(self.page2_checkBox_8, 2, 1, 1, 1)
+ self.page2_checkBox_10 = QtWidgets.QCheckBox(self.gridLayoutWidget_3)
+ self.page2_checkBox_10.setObjectName("page2_checkBox_10")
+ self.gridLayout_5.addWidget(self.page2_checkBox_10, 3, 0, 1, 1)
+ self.label_13 = QtWidgets.QLabel(self.tab_4)
+ self.label_13.setGeometry(QtCore.QRect(50, 30, 211, 41))
+ font = QtGui.QFont()
+ font.setFamily("Adobe Arabic")
+ font.setPointSize(12)
+ self.label_13.setFont(font)
+ self.label_13.setObjectName("label_13")
+ self.label_14 = QtWidgets.QLabel(self.tab_4)
+ self.label_14.setGeometry(QtCore.QRect(50, 270, 211, 41))
+ font = QtGui.QFont()
+ font.setFamily("Adobe Arabic")
+ font.setPointSize(12)
+ self.label_14.setFont(font)
+ self.label_14.setObjectName("label_14")
+ self.tableWidget = QtWidgets.QTableWidget(self.tab_4)
+ self.tableWidget.setGeometry(QtCore.QRect(150, 320, 701, 111))
+ self.tableWidget.setObjectName("tableWidget")
+ self.tableWidget.setColumnCount(5)
+ self.tableWidget.setRowCount(2)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget.setVerticalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget.setVerticalHeaderItem(1, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget.setHorizontalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget.setHorizontalHeaderItem(1, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget.setHorizontalHeaderItem(2, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget.setHorizontalHeaderItem(3, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget.setHorizontalHeaderItem(4, item)
+ self.pushButton_send_2 = QtWidgets.QPushButton(self.tab_4)
+ self.pushButton_send_2.setGeometry(QtCore.QRect(380, 600, 201, 61))
+ self.pushButton_send_2.setObjectName("pushButton_send_2")
+ self.tableWidget_2 = QtWidgets.QTableWidget(self.tab_4)
+ self.tableWidget_2.setGeometry(QtCore.QRect(150, 440, 701, 111))
+ self.tableWidget_2.setObjectName("tableWidget_2")
+ self.tableWidget_2.setColumnCount(5)
+ self.tableWidget_2.setRowCount(2)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget_2.setVerticalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget_2.setVerticalHeaderItem(1, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget_2.setHorizontalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget_2.setHorizontalHeaderItem(1, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget_2.setHorizontalHeaderItem(2, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget_2.setHorizontalHeaderItem(3, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget_2.setHorizontalHeaderItem(4, item)
+ self.tabWidget.addTab(self.tab_4, "")
+ self.tab_7 = QtWidgets.QWidget()
+ self.tab_7.setObjectName("tab_7")
+ self.tableWidget_3 = QtWidgets.QTableWidget(self.tab_7)
+ self.tableWidget_3.setGeometry(QtCore.QRect(50, 60, 911, 501))
+ self.tableWidget_3.setObjectName("tableWidget_3")
+ self.tableWidget_3.setColumnCount(6)
+ self.tableWidget_3.setRowCount(50)
+ for i in range(50):
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget_3.setVerticalHeaderItem(i, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget_3.setHorizontalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget_3.setHorizontalHeaderItem(1, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget_3.setHorizontalHeaderItem(2, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget_3.setHorizontalHeaderItem(3, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget_3.setHorizontalHeaderItem(4, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget_3.setHorizontalHeaderItem(5, item)
+ self.tabWidget.addTab(self.tab_7, "")
+ self.label_5 = QtWidgets.QLabel(self.centralwidget)
+ self.label_5.setGeometry(QtCore.QRect(330, 10, 281, 41))
+ font = QtGui.QFont()
+ font.setFamily("华文宋体")
+ font.setPointSize(18)
+ self.label_5.setFont(font)
+ self.label_5.setObjectName("label_5")
+ Main_cmd_msg.setCentralWidget(self.centralwidget)
+ self.menubar = QtWidgets.QMenuBar(Main_cmd_msg)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 1011, 26))
+ self.menubar.setObjectName("menubar")
+ Main_cmd_msg.setMenuBar(self.menubar)
+ self.statusbar = QtWidgets.QStatusBar(Main_cmd_msg)
+ self.statusbar.setObjectName("statusbar")
+ Main_cmd_msg.setStatusBar(self.statusbar)
+
+ self.retranslateUi(Main_cmd_msg)
+ self.tabWidget.setCurrentIndex(0)
+ QtCore.QMetaObject.connectSlotsByName(Main_cmd_msg)
+ self.Ui_Changes(Main_cmd_msg)
+ def retranslateUi(self, Main_cmd_msg):
+ _translate = QtCore.QCoreApplication.translate
+ Main_cmd_msg.setWindowTitle(_translate("Main_cmd_msg", "值班员界面"))
+ self.radioButton_gb.setText(_translate("Main_cmd_msg", "广播模式"))
+ self.radioButton_db.setText(_translate("Main_cmd_msg", "点播模式"))
+ self.radioButton_dsbb.setText(_translate("Main_cmd_msg", "定时播报模式"))
+ self.textEdit.setHtml(_translate("Main_cmd_msg", "\n"
+"
\n"
+"
"))
+ self.pushButton_2.setText(_translate("Main_cmd_msg", "确认"))
+ self.pushButton.setText(_translate("Main_cmd_msg", "确认"))
+ self.label_3.setText(_translate("Main_cmd_msg", "任务结束时间:"))
+ self.label.setText(_translate("Main_cmd_msg", "任务编号/主题:"))
+ self.label_2.setText(_translate("Main_cmd_msg", "任务开始时间:"))
+ self.label_7.setText(_translate("Main_cmd_msg", "定点播报时间:"))
+ self.pushButton_4.setText(_translate("Main_cmd_msg", "确认"))
+ self.pushButton_send_1.setText(_translate("Main_cmd_msg", "发送"))
+ self.pushButton_3.setText(_translate("Main_cmd_msg", "清除"))
+ self.label_4.setText(_translate("Main_cmd_msg", "通知内容:"))
+ self.checkBox_2.setText(_translate("Main_cmd_msg", "二班"))
+ self.checkBox_6.setText(_translate("Main_cmd_msg", "六班"))
+ self.checkBox_7.setText(_translate("Main_cmd_msg", "七班"))
+ self.checkBox_9.setText(_translate("Main_cmd_msg", "九班"))
+ self.checkBox_5.setText(_translate("Main_cmd_msg", "五班"))
+ self.checkBox_4.setText(_translate("Main_cmd_msg", "四班"))
+ self.checkBox_8.setText(_translate("Main_cmd_msg", "八班"))
+ self.checkBox_10.setText(_translate("Main_cmd_msg", "十班"))
+ self.checkBox_3.setText(_translate("Main_cmd_msg", "三班"))
+ self.checkBox.setText(_translate("Main_cmd_msg", "一班"))
+ self.label_6.setText(_translate("Main_cmd_msg", "值班员编辑任务界面"))
+ self.label_12.setText(_translate("Main_cmd_msg", "告知班级选择"))
+ self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("Main_cmd_msg", "文本告知"))
+ self.page2_checkBox_4.setText(_translate("Main_cmd_msg", "四班"))
+ self.page2_checkBox_6.setText(_translate("Main_cmd_msg", "六班"))
+ self.page2_checkBox_9.setText(_translate("Main_cmd_msg", "九班"))
+ self.page2_checkBox_5.setText(_translate("Main_cmd_msg", "五班"))
+ self.page2_checkBox_2.setText(_translate("Main_cmd_msg", "二班"))
+ self.page2_checkBox_3.setText(_translate("Main_cmd_msg", "三班"))
+ self.page2_checkBox_7.setText(_translate("Main_cmd_msg", "七班"))
+ self.page2_checkBox_1.setText(_translate("Main_cmd_msg", "一班"))
+ self.page2_checkBox_8.setText(_translate("Main_cmd_msg", "八班"))
+ self.page2_checkBox_10.setText(_translate("Main_cmd_msg", "十班"))
+ self.label_13.setText(_translate("Main_cmd_msg", "告知班级选择"))
+ self.label_14.setText(_translate("Main_cmd_msg", "班级在线情况"))
+ item = self.tableWidget.verticalHeaderItem(0)
+ item.setText(_translate("Main_cmd_msg", "班级"))
+ item = self.tableWidget.verticalHeaderItem(1)
+ item.setText(_translate("Main_cmd_msg", "在线情况"))
+ item = self.tableWidget.horizontalHeaderItem(0)
+ item.setText(_translate("Main_cmd_msg", "一班"))
+ item = self.tableWidget.horizontalHeaderItem(1)
+ item.setText(_translate("Main_cmd_msg", "二班"))
+ item = self.tableWidget.horizontalHeaderItem(2)
+ item.setText(_translate("Main_cmd_msg", "三班"))
+ item = self.tableWidget.horizontalHeaderItem(3)
+ item.setText(_translate("Main_cmd_msg", "四班"))
+ item = self.tableWidget.horizontalHeaderItem(4)
+ item.setText(_translate("Main_cmd_msg", "五班"))
+ self.pushButton_send_2.setText(_translate("Main_cmd_msg", "开始连线"))
+ item = self.tableWidget_2.verticalHeaderItem(0)
+ item.setText(_translate("Main_cmd_msg", "班级"))
+ item = self.tableWidget_2.verticalHeaderItem(1)
+ item.setText(_translate("Main_cmd_msg", "在线情况"))
+ item = self.tableWidget_2.horizontalHeaderItem(0)
+ item.setText(_translate("Main_cmd_msg", "六班"))
+ item = self.tableWidget_2.horizontalHeaderItem(1)
+ item.setText(_translate("Main_cmd_msg", "七班"))
+ item = self.tableWidget_2.horizontalHeaderItem(2)
+ item.setText(_translate("Main_cmd_msg", "八班"))
+ item = self.tableWidget_2.horizontalHeaderItem(3)
+ item.setText(_translate("Main_cmd_msg", "九班"))
+ item = self.tableWidget_2.horizontalHeaderItem(4)
+ item.setText(_translate("Main_cmd_msg", "十班"))
+ self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), _translate("Main_cmd_msg", "语音连线"))
+
+ item = self.tableWidget_3.horizontalHeaderItem(0)
+ item.setText(_translate("Main_cmd_msg", "发送方"))
+ item = self.tableWidget_3.horizontalHeaderItem(1)
+ item.setText(_translate("Main_cmd_msg", "接收方"))
+ item = self.tableWidget_3.horizontalHeaderItem(2)
+ item.setText(_translate("Main_cmd_msg", "开始时间"))
+ item = self.tableWidget_3.horizontalHeaderItem(3)
+ item.setText(_translate("Main_cmd_msg", "截止时间"))
+ item = self.tableWidget_3.horizontalHeaderItem(4)
+ item.setText(_translate("Main_cmd_msg", "任务主题"))
+ item = self.tableWidget_3.horizontalHeaderItem(5)
+ item.setText(_translate("Main_cmd_msg", "任务内容"))
+
+ #icon
+ Main_cmd_msg.setWindowIcon(QIcon("5b8614f82dcbe.png"))
+
+ #background
+ window_pale = QtGui.QPalette()
+ window_pale.setBrush(Main_cmd_msg.backgroundRole(), QtGui.QBrush(QtGui.QPixmap("background2.png")))
+ Main_cmd_msg.setPalette(window_pale)
+
+ self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_7), _translate("Main_cmd_msg", "反馈/消息统计"))
+ self.label_5.setText(_translate("Main_cmd_msg", "值班员下达任务界面"))
+ def Ui_Changes(self,Main_cmd_msg):
+ # 设置文本告知
+ #设置时间
+ self.dateTimeEdit.setDateTime(QDateTime.currentDateTime())
+ self.dateTimeEdit_2.setDateTime(QDateTime.currentDateTime())
+ self.dateTimeEdit_3.setDateTime(QDateTime.currentDateTime())
+ #设置左侧按钮 广播 点播 定时播报
+ self.radioButton_gb.clicked.connect(lambda :self.label_12.setVisible(False))
+ self.radioButton_gb.toggled.connect(lambda :self.label_12.setVisible(True))
+
+ self.radioButton_gb.clicked.connect(lambda :self.checkBox.setVisible(False))
+ self.radioButton_gb.toggled.connect(lambda: self.checkBox.setVisible(True))
+
+ self.radioButton_gb.clicked.connect(lambda: self.checkBox_2.setVisible(False))
+ self.radioButton_gb.toggled.connect(lambda: self.checkBox_2.setVisible(True))
+
+ self.radioButton_gb.clicked.connect(lambda: self.checkBox_3.setVisible(False))
+ self.radioButton_gb.toggled.connect(lambda: self.checkBox_3.setVisible(True))
+
+ self.radioButton_gb.clicked.connect(lambda: self.checkBox_4.setVisible(False))
+ self.radioButton_gb.toggled.connect(lambda: self.checkBox_4.setVisible(True))
+
+ self.radioButton_gb.clicked.connect(lambda: self.checkBox_5.setVisible(False))
+ self.radioButton_gb.toggled.connect(lambda: self.checkBox_5.setVisible(True))
+
+ self.radioButton_gb.clicked.connect(lambda: self.checkBox_6.setVisible(False))
+ self.radioButton_gb.toggled.connect(lambda: self.checkBox_6.setVisible(True))
+
+ self.radioButton_gb.clicked.connect(lambda: self.checkBox_7.setVisible(False))
+ self.radioButton_gb.toggled.connect(lambda: self.checkBox_7.setVisible(True))
+
+ self.radioButton_gb.clicked.connect(lambda: self.checkBox_8.setVisible(False))
+ self.radioButton_gb.toggled.connect(lambda: self.checkBox_8.setVisible(True))
+
+ self.radioButton_gb.clicked.connect(lambda: self.checkBox_9.setVisible(False))
+ self.radioButton_gb.toggled.connect(lambda: self.checkBox_9.setVisible(True))
+
+ self.radioButton_gb.clicked.connect(lambda: self.checkBox_10.setVisible(False))
+ self.radioButton_gb.toggled.connect(lambda: self.checkBox_10.setVisible(True))
+
+
+ self.label_7.setVisible(False)
+ self.dateTimeEdit_3.setVisible(False)
+ self.pushButton_4.setVisible(False)
+
+ self.radioButton_dsbb.clicked.connect(lambda: self.label_7.setVisible(True))
+ self.radioButton_dsbb.toggled.connect(lambda: self.label_7.setVisible(False))
+
+ self.radioButton_dsbb.clicked.connect(lambda: self.dateTimeEdit_3.setVisible(True))
+ self.radioButton_dsbb.toggled.connect(lambda: self.dateTimeEdit_3.setVisible(False))
+
+ self.radioButton_dsbb.clicked.connect(lambda: self.pushButton_4.setVisible(True))
+ self.radioButton_dsbb.toggled.connect(lambda: self.pushButton_4.setVisible(False))
+
+ self.pushButton_3.clicked.connect(self.textEdit.clear)
+ self.pushButton_3.clicked.connect(self.lineEdit.clear)
+ self.dateTimeEdit.setDisplayFormat("yyyy-MM-dd HH:mm:ss")
+ self.dateTimeEdit_2.setDisplayFormat("yyyy-MM-dd HH:mm:ss")
+ self.dateTimeEdit_3.setDisplayFormat("yyyy-MM-dd HH:mm:ss")
+ self.pushButton_send_1.clicked.connect(self.Select_send_msgmod)
+
+ self.send_data_Signal.connect(self.Update_staform)
+ self.pushButton_send_2.clicked.connect(self.Emit_voice_data)
+ #将在线列表所有的格子设置为红色:
+ """
+ # 创建新条目,设置背景颜色,添加到表格指定行列中
+ newItem = QTableWidgetItem("160")
+ #newItem.setForeground(QBrush(QColor(255, 0, 0)))
+ tableWidget.setItem(0, 2, newItem)
+ """
+
+ for x in range(5):
+ newItem = QTableWidgetItem("不在线")
+ newItem.setForeground(QBrush(QColor(255, 0, 0)))
+ self.tableWidget.setItem(1, x, newItem)
+ for x in range(5):
+ newItem = QTableWidgetItem("不在线")
+ newItem.setForeground(QBrush(QColor(255, 0, 0)))
+ self.tableWidget_2.setItem(1, x, newItem)
+
+ def Emit_voice_data(self):
+ self.send_voice_data_Signal.emit()
+
+ def Select_send_msgmod(self):
+ if self.radioButton_gb.isChecked():#设置为广播模式
+ self.Broadcast()
+ elif self.radioButton_db.isChecked():#设置为点播模式
+ self.Dianbo()
+ elif self.radioButton_dsbb.isChecked():#设置为定时播报模式
+ self.Dianbo()
+ else:
+ self.Nonemod()
+ def Nonemod(self):#什么模式都没点
+ info = "请先选择模式!"
+ ch_win = QMessageBox.about(self.pushButton_send_1, "提示", info)
+ print(ch_win)
+
+ def Broadcast(self):#广播模式
+ title = self.lineEdit.text()
+
+ startdate = self.dateTimeEdit.date()
+ starttime = self.dateTimeEdit.time()
+
+ enddate = self.dateTimeEdit_2.date()
+ endtime = self.dateTimeEdit_2.time()
+
+ msg =self.textEdit.toPlainText()
+ data = {"sender":"zhibanyuan", "receiver":"broadcast", "startdatetime":startdate.toString('yyyy-MM-dd')+" "+starttime.toString('HH:mm:ss'),
+ "enddatetime":enddate.toString('yyyy-MM-dd')+" "+endtime.toString('HH:mm:ss'), "title":title, "msg":msg}
+ self.send_data_Signal.emit(data)
+
+ print(title,startdate.toString(),starttime.toString(),enddate.toString(),endtime.toString())
+
+
+ def Dianbo(self):#点播模式
+ name_dict = self.Get_dianbo_name()
+ print(name_dict)
+ title = self.lineEdit.text()
+
+ startdate = self.dateTimeEdit.date()
+ starttime = self.dateTimeEdit.time()
+
+ enddate = self.dateTimeEdit_2.date()
+ endtime = self.dateTimeEdit_2.time()
+
+ msg =self.textEdit.toPlainText()
+ for class_name in name_dict.keys():
+ #self.tableWidget.item(d_row, d_col).text() # 获取某行某列item中的x信息
+ if name_dict[class_name] == 1:
+ classnum = int(class_name[-1])
+ if classnum >= 1 and classnum <= 5:
+ Isonline = self.tableWidget.item(1, classnum - 1).text()
+ if Isonline == "不在线":
+ info = str(classnum) + "班不在线!请重新选择!"
+ ch_win = QMessageBox.about(self.pushButton_send_1, "提示", info)
+ print(ch_win)
+ if classnum >= 6 and classnum <= 10:
+ Isonline = self.tableWidget_2.item(1, classnum - 6).text()
+ if Isonline == "不在线":
+ info = str(classnum) + "班不在线!请重新选择!"
+ ch_win = QMessageBox.about(self.pushButton_send_1, "提示", info)
+ print(ch_win)
+
+ data = {"sender":"zhibanyuan", "receiver":class_name, "startdatetime":startdate.toString('yyyy-MM-dd')+" "+starttime.toString('HH:mm:ss'),
+ "enddatetime":enddate.toString('yyyy-MM-dd')+" "+endtime.toString('HH:mm:ss'), "title":title, "msg":msg}
+ self.send_data_Signal.emit(data)
+ print(class_name,title, startdate.toString(), starttime.toString(), enddate.toString(), endtime.toString())
+
+ def Get_dianbo_name(self):
+ retdict={}
+ name_list=[0]*10
+ if self.checkBox.isChecked():
+ name_list[0]=1
+ if self.checkBox_2.isChecked():
+ name_list[1]=1
+ if self.checkBox_3.isChecked():
+ name_list[2]=1
+ if self.checkBox_4.isChecked():
+ name_list[3]=1
+ if self.checkBox_5.isChecked():
+ name_list[4]=1
+ if self.checkBox_6.isChecked():
+ name_list[5]=1
+ if self.checkBox_7.isChecked():
+ name_list[6]=1
+ if self.checkBox_8.isChecked():
+ name_list[7]=1
+ if self.checkBox_9.isChecked():
+ name_list[8]=1
+ if self.checkBox_10.isChecked():
+ name_list[9]=1
+ for i in range(10):
+ classnm =i+1
+ name = "class"+str(classnm)
+ retdict[name] = name_list[i]
+ return retdict
+
+ def Update_staform(self,data):#用来更新值班员的统计表
+ row = self.table_row
+
+ newItem=QTableWidgetItem(data["sender"])
+ self.tableWidget_3.setItem(row,0,newItem)
+
+ newItem=QTableWidgetItem(data["receiver"])
+ self.tableWidget_3.setItem(row,1,newItem)
+
+ newItem=QTableWidgetItem(data["startdatetime"])
+ self.tableWidget_3.setItem(row,2,newItem)
+
+ newItem=QTableWidgetItem(data["enddatetime"])
+ self.tableWidget_3.setItem(row,3,newItem)
+
+ newItem=QTableWidgetItem(data["title"])
+ self.tableWidget_3.setItem(row,4,newItem)
+
+ newItem=QTableWidgetItem(data["msg"])
+ self.tableWidget_3.setItem(row,5,newItem)
+ self.table_row=row+1
+
+ def Update_receive_data(self, data):#用来更新来自学员端传来的信息
+ row = self.table_row
+
+ newItem=QTableWidgetItem(data["sender"])
+ self.tableWidget_3.setItem(row,0,newItem)
+
+ newItem=QTableWidgetItem(data["receiver"])
+ self.tableWidget_3.setItem(row,1,newItem)
+
+ newItem=QTableWidgetItem(data["startdatetime"])
+ self.tableWidget_3.setItem(row,2,newItem)
+
+ newItem=QTableWidgetItem(data["title"])
+ self.tableWidget_3.setItem(row,4,newItem)
+
+ newItem=QTableWidgetItem(data["msg"])
+ self.tableWidget_3.setItem(row,5,newItem)
+ self.table_row=row+1
+
+ def Update_user_list(self,userdict):
+ userlist = userdict.keys()
+ for x in range(5):
+ newItem = QTableWidgetItem("不在线")
+ newItem.setForeground(QBrush(QColor(255, 0, 0)))
+ self.tableWidget.setItem(1, x, newItem)
+ for x in range(5):
+ newItem = QTableWidgetItem("不在线")
+ newItem.setForeground(QBrush(QColor(255, 0, 0)))
+ self.tableWidget_2.setItem(1, x, newItem)
+
+ for x in range(5):
+ if "class"+str((x+1)) in userlist:
+ newItem = QTableWidgetItem("在线")
+ newItem.setForeground(QBrush(QColor(0, 255, 0)))
+ self.tableWidget.setItem(1, x, newItem)
+ for x in range(5):
+ if "class"+str((x+6)) in userlist:
+ newItem = QTableWidgetItem("在线")
+ newItem.setForeground(QBrush(QColor(0, 255, 0)))
+ self.tableWidget_2.setItem(1, x, newItem)
+
+
+"""
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+ MainWindow = QtWidgets.QMainWindow()
+ win = Ui_Main_cmd_msg()
+ win.setupUi(MainWindow)
+ MainWindow.show()
+ sys.exit(app.exec_())
+"""
\ No newline at end of file
diff --git a/src/login_ui.py b/src/login_ui.py
new file mode 100644
index 0000000..d8f8cb8
--- /dev/null
+++ b/src/login_ui.py
@@ -0,0 +1,140 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'login_ui.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.2
+#
+# 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.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+from PyQt5.QtGui import QIcon
+from PyQt5.QtWidgets import QApplication,QLineEdit,QMainWindow,QWidget
+from PyQt5.QtWidgets import QWidget,QMessageBox
+import sys
+from PyQt5.QtCore import pyqtSignal,QObject
+
+class Ui_login_ui(QWidget):
+
+ open_cmd_Signal = pyqtSignal(str, str)
+ open_user_Signal = pyqtSignal(str, str)
+ close_this_win_signal = pyqtSignal()
+
+ def setupUi(self, login_ui):
+ login_ui.setObjectName("login_ui")
+ login_ui.resize(537, 298)
+ self.formLayoutWidget = QtWidgets.QWidget(login_ui)
+ self.formLayoutWidget.setGeometry(QtCore.QRect(130, 80, 241, 61))
+ self.formLayoutWidget.setObjectName("formLayoutWidget")
+ self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget)
+ self.formLayout.setContentsMargins(0, 0, 0, 0)
+ self.formLayout.setObjectName("formLayout")
+ self.label = QtWidgets.QLabel(self.formLayoutWidget)
+ self.label.setObjectName("label")
+ self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
+
+ self.label_2 = QtWidgets.QLabel(self.formLayoutWidget)
+ self.label_2.setObjectName("label_2")
+ self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2)
+
+ self.lineEdit_identity = QtWidgets.QLineEdit(self.formLayoutWidget)
+ self.lineEdit_identity.setObjectName("lineEdit_identity")
+ self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEdit_identity)
+
+ self.lineEdit_password = QtWidgets.QLineEdit(self.formLayoutWidget)
+ self.lineEdit_password.setObjectName("lineEdit_password")
+ self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEdit_password)
+ self.lineEdit_password.setEchoMode(QLineEdit.Password)
+
+
+
+ #按键
+ self.pushButton_login = QtWidgets.QPushButton(login_ui)
+
+ self.pushButton_login.setFont(QtGui.QFont('Microsoft YaHei', 10))
+
+ self.pushButton_login.setStyleSheet(
+ "QPushButton{color:rgb(255,255,255)}" # 按键前景色
+ "QPushButton{background-color:rgb(137,152,152)}" # 按键背景色
+ "QPushButton:hover{color:rgb(255,255,255)}" # 光标移动到上面后的前景色
+ "QPushButton{border-radius:6px}" # 圆角半径
+ "QPushButton:pressed{background-color:rgb(183,199,198);border: None;}" # 按下时的样式
+ )
+ #self.pushButton_login.setGeometry(QtCore.QRect(200, 160, 93, 28))
+ self.pushButton_login.setGeometry(QtCore.QRect(210, 170, 103, 30))
+ self.pushButton_login.setObjectName("pushButton_login")
+ self.pushButton_login.clicked.connect(self.Is_legal_user)
+ self.retranslateUi(login_ui)
+ QtCore.QMetaObject.connectSlotsByName(login_ui)
+
+
+
+ self.close_this_win_signal.connect(login_ui.close)
+
+ def retranslateUi(self, login_ui):
+
+ _translate = QtCore.QCoreApplication.translate
+ login_ui.setWindowTitle(_translate("login_ui", "广播通知与应答反馈系统"))
+
+
+ #icon
+ login_ui.setWindowIcon(QIcon("5b8614f82dcbe.png"))
+
+ #background
+ window_pale = QtGui.QPalette()
+ window_pale.setBrush(login_ui.backgroundRole(), QtGui.QBrush(QtGui.QPixmap("background2.png")))
+ login_ui.setPalette(window_pale)
+
+ #label1
+ strT = '%s' % ('账号') # 绿色
+ self.label.setText("%s" % (strT))
+ self.label.setFont(QtGui.QFont('Microsoft YaHei', 10))
+
+ #label2
+ strT = '%s' % ('密码') # 绿色
+ self.label_2.setText("%s" % (strT))
+ self.label_2.setFont(QtGui.QFont('Microsoft YaHei', 10))
+
+ #button
+ self.pushButton_login.setText(_translate("login_ui", "登录"))
+
+ def Is_legal_user(self):
+ userid = self.lineEdit_identity.text()
+ password = self.lineEdit_password.text()
+#下面是登录验证环节:
+
+ if password == "":#这步是验证用户是否合法,如果合法:
+
+ #启动类client
+ if userid == "zhibanyuan":#如果是值班员,发送值班员信号,用于打开值班员界面
+ self.open_cmd_Signal.emit(userid,password)
+ else:#发送学员信号,打开学员界面
+ self.open_user_Signal.emit(userid, password)
+ self.close_this_win_signal.emit()
+
+ else:
+ info = "密码错误!"
+ ch_win = QMessageBox.about(self.pushButton_login,"提示",info)
+ print(ch_win)
+
+
+
+"""
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+ widget = QtWidgets.QMainWindow()
+ win = Ui_login_ui()
+ win.setupUi(widget)
+ widget.show()
+ sys.exit(app.exec_())
+
+"""
+"""
+app = QtWidgets.QApplication(sys.argv) # 创建一个QApplication,也就是你要开发的软件app
+MainWindow = QtWidgets.QMainWindow() # 创建一个QMainWindow,用来装载你需要的各种组件、控件
+ui = Ui_MainWindow() # ui是Ui_MainWindow()类的实例化对象
+ui.setupUi(MainWindow) # 执行类中的setupUi方法,方法的参数是第二步中创建的QMainWindow
+MainWindow.show() # 执行QMainWindow的show()方法,显示这个QMainWindow
+sys.exit(app.exec_()) # 使用exit()或者点击关闭按钮退出QApplication
+"""
\ No newline at end of file
diff --git a/src/main_cmd.py b/src/main_cmd.py
new file mode 100644
index 0000000..a5698e7
--- /dev/null
+++ b/src/main_cmd.py
@@ -0,0 +1,67 @@
+
+from login_ui import Ui_login_ui
+from cmd_send_msg import Ui_Main_cmd_msg
+from stu_receive_msg import Ui_stu_win
+from client_voice_cmd import Client_voice_cmd
+
+import sys
+from PyQt5 import QtCore, QtGui, QtWidgets
+from PyQt5.QtGui import *
+from PyQt5.QtWidgets import *
+from PyQt5.QtCore import QDate, QDateTime , QTime
+import datetime
+
+from PyQt5.QtCore import pyqtSignal
+
+from client import Client
+import socket
+import json
+import rsa
+from binascii import hexlify
+import os
+import threading
+import sys
+
+
+
+def start_client_cmd(username,password):
+ client.set_username(username,password)
+ client.run()
+
+def start_voice_client_cmd():
+ thread = threading.Thread(target=Client_voice_cmd)
+ thread.start()
+ #client_voice_cmd = Client_voice_cmd()
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+ MainWindow = QtWidgets.QMainWindow()
+
+ # 初始化client类
+ username = ""
+ client = Client()
+
+ log_win = Ui_login_ui()
+ log_win.setupUi(MainWindow)
+ log_win.open_cmd_Signal.connect(start_client_cmd)
+ MainWindow.show()
+
+ #初始化值班员界面
+ MainWindow1 = QtWidgets.QMainWindow()
+ win = Ui_Main_cmd_msg()
+ win.setupUi(MainWindow1)
+ client.send_data_Signal.connect(win.Update_receive_data)
+ client.send_userlist_Signal.connect(win.Update_user_list)
+
+
+ win.send_data_Signal.connect(client.receive_from_ui)
+ #点播模式,消除了self.dict的文件
+ #win.pushButton_send_1.clicked.connect(client.run_step)
+ win.send_data_Signal.connect(client.run_step)
+
+ log_win.open_cmd_Signal.connect(MainWindow1.show)
+
+ win.send_voice_data_Signal.connect(start_voice_client_cmd)
+
+ sys.exit(app.exec_())
+
diff --git a/src/main_stu.py b/src/main_stu.py
new file mode 100644
index 0000000..c6fa052
--- /dev/null
+++ b/src/main_stu.py
@@ -0,0 +1,55 @@
+
+from login_ui import Ui_login_ui
+from cmd_send_msg import Ui_Main_cmd_msg
+from stu_receive_msg import Ui_stu_win
+from client_voice_stu import Client_voice_stu
+
+import sys
+from PyQt5 import QtCore, QtGui, QtWidgets
+from PyQt5.QtGui import *
+from PyQt5.QtWidgets import *
+from PyQt5.QtCore import QDate, QDateTime, QTime, pyqtSignal
+import datetime
+from client import Client
+import socket
+import json
+import rsa
+from binascii import hexlify
+import os
+import threading
+import sys
+
+
+def start_client_user(username,password):
+ client.set_username(username,password)
+ client.run()
+ client_voice_stu = Client_voice_stu()
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+ MainWindow = QtWidgets.QMainWindow()
+
+ # 初始化client类
+ username = ""
+ client = Client()
+
+ log_win = Ui_login_ui()
+ log_win.setupUi(MainWindow)
+ log_win.open_user_Signal.connect(start_client_user)
+ MainWindow.show()
+
+ #初始化学员界面
+ MainWindow2 = QtWidgets.QMainWindow()
+ win1 =Ui_stu_win()
+ win1.setupUi(MainWindow2)
+ client.send_data_Signal.connect(win1.Update_receive_data)
+ win1.send_to_cmd_sig.connect(client.receive_from_ui)
+ win1.pushButton.clicked.connect(client.run_step)
+ log_win.open_user_Signal.connect(MainWindow2.show)
+ win1.pushButton_3.clicked.connect(MainWindow2.close)
+ win1.pushButton_3.clicked.connect(client.disconnection)
+ #win1.close.connect(client.disconnection)
+
+ sys.exit(app.exec_())
+
diff --git a/src/server.py b/src/server.py
new file mode 100644
index 0000000..f0e83c0
--- /dev/null
+++ b/src/server.py
@@ -0,0 +1,77 @@
+#当部署到不同的计算机的时候,修改程序中的IP 和 PORT
+
+import socket
+import json
+import threading
+import time
+
+
+class Server:
+ def __init__(self):
+ IP = socket.gethostbyname(socket.gethostname())
+ PORT = 1
+ self.ADDR = (IP, PORT)
+ self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ self.server.bind(self.ADDR)
+ self.active_users = {} # {username : [conn, pub_key]}
+
+ def send_list_active_users(self):
+ user_info = {user: self.active_users[user][1] for user in self.active_users}
+ users = {"users": user_info}
+ for user, info in self.active_users.items():
+ print(users)
+ info[0].send(json.dumps(users).encode())
+
+ def send_message(self, data): # 向receiver发送json数据
+ receiver = data["receiver"]
+ if receiver not in self.active_users.keys():
+ return
+ conn = self.active_users[receiver][0]
+ conn.send(json.dumps(data).encode())
+ print(data)
+
+ def disconnect_client(self, username, client):
+ print(f"[DISCONNECTING] {username}")
+ data={"msg":"DISCONNECTING"}
+ client.send(json.dumps(data).encode())
+ client.close()
+ del self.active_users[username]
+ self.send_list_active_users()
+
+ def init_data(self, client): #
+ data = client.recv(1024).decode()
+ data = json.loads(data)
+ self.active_users[data["username"]] = [client, 0]
+ self.send_list_active_users()
+ return data["username"]
+
+ def listen_client(self, conn):
+ username = self.init_data(conn)
+ while True:
+ msg = conn.recv(1024).decode()
+ data = json.loads(msg)
+ if data["msg"] == "!DISCONNECT":
+ self.disconnect_client(username, conn)
+ else:
+ print(f"[MESSAGE] {data}")
+ self.send_message(data)
+
+
+
+ def run(self):
+ try:
+ self.server.listen()
+ while True:
+ conn, addr = self.server.accept()
+ thread = threading.Thread(target=self.listen_client, args=(conn,))
+ thread.start()
+ time.sleep(1)
+ #print(f"[ACTIVE CONNECTIONS] {threading.activeCount() - 1}")
+ print(f"[USERS] {list(self.active_users.keys())}")
+ except Exception as e:
+ self.server.close()
+
+
+
+server = Server()
+server.run()
\ No newline at end of file
diff --git a/src/server_voice.py b/src/server_voice.py
new file mode 100644
index 0000000..420b6c3
--- /dev/null
+++ b/src/server_voice.py
@@ -0,0 +1,53 @@
+import socket
+import threading
+
+
+class Server_voice:
+ def __init__(self):
+ self.ip = socket.gethostbyname(socket.gethostname())
+ while 1:
+ try:
+ self.port = 2
+
+ self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ self.s.bind((self.ip, self.port))
+
+ break
+ except:
+ print("Couldn't bind to that port")
+
+ self.connections = []
+ self.accept_connections()
+
+ def accept_connections(self):
+ self.s.listen(100) # 开始tcp监听
+
+ print('Running on IP: ' + self.ip)
+ print('Running on port: ' + str(self.port))
+
+ while True:
+ c, addr = self.s.accept() # 返回端口和地址(用户端)
+
+ self.connections.append(c)
+
+ threading.Thread(target=self.handle_client, args=(c, addr,)).start() # 接收到就广播
+
+ def broadcast(self, sock, data): # 向除了sock的所有端口发送data
+ for client in self.connections:
+ if client != self.s and client != sock:
+ try:
+ client.send(data)
+ except:
+ pass
+
+ def handle_client(self, c, addr): # 传送数据
+ while 1:
+ try:
+ data = c.recv(1024)
+ self.broadcast(c, data)
+
+ except socket.error:
+ c.close()
+
+
+server = Server_voice()
diff --git a/src/stu_receive_msg.py b/src/stu_receive_msg.py
new file mode 100644
index 0000000..73e5252
--- /dev/null
+++ b/src/stu_receive_msg.py
@@ -0,0 +1,216 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'stu_msg.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.2
+#
+# 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 datetime
+import sys
+from PyQt5 import QtCore, QtGui, QtWidgets
+from PyQt5.QtGui import *
+from PyQt5.QtWidgets import *
+from PyQt5.QtCore import QDate, QDateTime , QTime
+import datetime
+from PyQt5.QtCore import pyqtSignal
+
+class Ui_stu_win(QMainWindow):
+ table_row = 0
+ send_to_cmd_sig = pyqtSignal(dict)
+ def setupUi(self, MainWindow):
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.resize(849, 641)
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
+ self.centralwidget.setObjectName("centralwidget")
+ self.label = QtWidgets.QLabel(self.centralwidget)
+ self.label.setGeometry(QtCore.QRect(260, 10, 351, 81))
+ font = QtGui.QFont()
+ font.setFamily("Adobe 宋体 Std L")
+ font.setPointSize(26)
+
+ #设置字体
+ self.label.setFont(font)
+
+ self.label.setObjectName("label")
+
+ #接收
+ self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
+ self.tabWidget.setGeometry(QtCore.QRect(10, 80, 831, 511))
+ self.tabWidget.setTabShape(QtWidgets.QTabWidget.Triangular)
+ self.tabWidget.setObjectName("tabWidget")
+
+ self.tab = QtWidgets.QWidget()
+ self.tab.setObjectName("tab")
+ self.tableWidget = QtWidgets.QTableWidget(self.tab)
+ self.tableWidget.setGeometry(QtCore.QRect(0, 10, 821, 481))
+ self.tableWidget.setObjectName("tableWidget")
+ self.tableWidget.setColumnCount(4)
+ self.tableWidget.setRowCount(50)
+ #50行的消息列表吧
+ for i in range(50):
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget.setVerticalHeaderItem(i, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget.setHorizontalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget.setHorizontalHeaderItem(1, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget.setHorizontalHeaderItem(2, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.tableWidget.setHorizontalHeaderItem(3, item)
+ self.tabWidget.addTab(self.tab, "")
+
+ #tab_2是两个大筐筐之一,里面有2个pushButton,
+ self.tab_2 = QtWidgets.QWidget()
+ self.tab_2.setObjectName("tab_2")
+
+ #编辑反馈信息
+ self.label_2 = QtWidgets.QLabel(self.tab_2)
+ self.label_2.setGeometry(QtCore.QRect(0, 10, 111, 31))
+ self.label_2.setObjectName("label_2")
+
+ self.widget = QtWidgets.QWidget(self.tab_2)
+ self.widget.setGeometry(QtCore.QRect(480, 400, 321, 30))
+ self.widget.setObjectName("widget")
+
+
+ self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
+ self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
+ self.horizontalLayout.setObjectName("horizontalLayout")
+
+ #发送
+ self.pushButton = QtWidgets.QPushButton(self.widget)
+ self.pushButton.setObjectName("pushButton")
+
+ self.horizontalLayout.addWidget(self.pushButton)
+
+ #清除
+ self.pushButton_2 = QtWidgets.QPushButton(self.widget)
+ self.pushButton_2.setObjectName("pushButton_2")
+
+ self.horizontalLayout.addWidget(self.pushButton_2)
+
+ self.widget1 = QtWidgets.QWidget(self.tab_2)
+ self.widget1.setGeometry(QtCore.QRect(0, 40, 821, 341))
+ self.widget1.setObjectName("widget1")
+
+ self.verticalLayout = QtWidgets.QVBoxLayout(self.widget1)
+ self.verticalLayout.setContentsMargins(0, 0, 0, 0)
+ self.verticalLayout.setObjectName("verticalLayout")
+
+ #关于任务
+ self.lineEdit = QtWidgets.QLineEdit(self.widget1)
+ self.lineEdit.setObjectName("lineEdit")
+
+ self.verticalLayout.addWidget(self.lineEdit)
+
+ #textEdit 主体
+ self.textEdit = QtWidgets.QTextEdit(self.widget1)
+ self.textEdit.setObjectName("textEdit")
+ self.verticalLayout.addWidget(self.textEdit)
+ self.tabWidget.addTab(self.tab_2, "")
+ self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
+ self.pushButton_3.setGeometry(QtCore.QRect(740, 10, 93, 28))
+ self.pushButton_3.setObjectName("pushButton_3")
+
+ self.pushButton_3.clicked.connect(self.close)
+
+
+
+
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QtWidgets.QMenuBar(MainWindow)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 849, 26))
+ self.menubar.setObjectName("menubar")
+
+ MainWindow.setMenuBar(self.menubar)
+
+ self.statusbar = QtWidgets.QStatusBar(MainWindow)
+ self.statusbar.setObjectName("statusbar")
+ MainWindow.setStatusBar(self.statusbar)
+
+ self.retranslateUi(MainWindow)
+ self.tabWidget.setCurrentIndex(1)
+ self.pushButton_2.clicked.connect(self.textEdit.clear)
+ self.pushButton_2.clicked.connect(self.lineEdit.clear)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+
+ _translate = QtCore.QCoreApplication.translate
+
+ MainWindow.setWindowTitle(_translate("MainWindow", "学员接收系统"))
+ self.label.setText(_translate("MainWindow", "学员接收反馈系统"))
+
+ item = self.tableWidget.horizontalHeaderItem(0)
+ item.setText(_translate("MainWindow", "任务主题"))
+
+ item = self.tableWidget.horizontalHeaderItem(1)
+ item.setText(_translate("MainWindow", "开始时间"))
+
+ item = self.tableWidget.horizontalHeaderItem(2)
+ item.setText(_translate("MainWindow", "结束时间"))
+
+ item = self.tableWidget.horizontalHeaderItem(3)
+ item.setText(_translate("MainWindow", "要求"))
+
+ self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "接收"))
+
+ self.label_2.setText(_translate("MainWindow", "编辑反馈信息:"))
+
+ self.pushButton.setText(_translate("MainWindow", "发送"))
+
+ self.pushButton_2.setText(_translate("MainWindow", "清除"))
+
+ self.lineEdit.setText(_translate("MainWindow", "关于任务:"))
+ self.textEdit.setHtml(_translate("MainWindow", "\n"
+"\n"
+"主体:
"))
+ #textEdit background
+ self.textEdit.setStyleSheet("background-image:url(:5b8614f82dcbe.png);\n"
+ "background-attachment:fixed;\n"
+ "background-repeat:none;\n"
+ "background-position:center")
+
+
+ self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "反馈"))
+ self.pushButton.clicked.connect(self.Emit_feedback)
+ self.pushButton_3.setText(_translate("MainWindow", "退出"))
+
+
+ #icon
+ MainWindow.setWindowIcon(QIcon("5b8614f82dcbe.png"))
+
+ #background
+ window_pale = QtGui.QPalette()
+ window_pale.setBrush(MainWindow.backgroundRole(), QtGui.QBrush(QtGui.QPixmap("background2.png")))
+ MainWindow.setPalette(window_pale)
+
+ def Update_receive_data(self,data):
+ row = self.table_row
+ print("update studentuser table!!")
+ newItem=QTableWidgetItem(data["title"])
+ self.tableWidget.setItem(row,0,newItem)
+
+ newItem=QTableWidgetItem(data["startdatetime"])
+ self.tableWidget.setItem(row,1,newItem)
+
+ newItem=QTableWidgetItem(data["enddatetime"])
+ self.tableWidget.setItem(row,2,newItem)
+
+ newItem=QTableWidgetItem(data["msg"])
+ self.tableWidget.setItem(row,3,newItem)
+ self.table_row=row+1
+ print(row)
+ def Emit_feedback(self):
+ title = self.lineEdit.text()
+ msg = self.textEdit.toPlainText()
+ now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
+ data = {"sender":"","receiver":"zhibanyuan","title":title,"msg":msg,"startdatetime":now_time}
+ print(data)
+ self.send_to_cmd_sig.emit(data)
+