我想在按下“ while
”按钮时进行一个Recordbutton
循环,并通过按下“ while
”按钮来停止Stoprecord
循环。但是当while
循环开始时,它将冻结窗口(无法执行任何操作)。
按下“ Stoprecord
”按钮时,让 stop=True
退出 while
循环,但条件stop == True
除外。 / p>
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'gui.ui'
#
# Created by: PyQt5 UI code generator 5.13.2
#
# WARNING! All changes made in this file will be lost!
from PyQt5.QtCore import Qt, QThread
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui, QtWidgets
import socket
import struct
import textwrap
import wave
from playsound import playsound
sampleRate = 8000.0 # hertz
duration = 1.0 # seconds
frequency = 8000.0 # hertz
frame = []
TAB_1 = '\t - '
TAB_2 = '\t\t - '
TAB_3 = '\t\t\t - '
TAB_4 = '\t\t\t\t - '
DATA_TAB_1 = '\t '
DATA_TAB_2 = '\t\t '
DATA_TAB_3 = '\t\t\t '
DATA_TAB_4 = '\t\t\t\t '
class Ui_MainWindow(object):
print("open window")
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(473, 331)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.frame = QtWidgets.QFrame(self.centralwidget)
self.frame.setGeometry(QtCore.QRect(20, 160, 421, 101))
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.Playbutton = QtWidgets.QPushButton(self.frame)
self.Playbutton.setGeometry(QtCore.QRect(320, 50, 93, 28))
self.Playbutton.setObjectName("Playbutton")
self.Playlabel = QtWidgets.QLabel(self.frame)
self.Playlabel.setGeometry(QtCore.QRect(30, 20, 55, 16))
self.Playlabel.setObjectName("Playlabel")
self.Playtext = QtWidgets.QTextEdit(self.frame)
self.Playtext.setGeometry(QtCore.QRect(30, 50, 241, 31))
self.Playtext.setObjectName("Playtext")
self.frame_2 = QtWidgets.QFrame(self.centralwidget)
self.frame_2.setGeometry(QtCore.QRect(20, 30, 421, 131))
self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame_2.setObjectName("frame_2")
self.Recordbutton = QtWidgets.QPushButton(self.frame_2)
self.Recordbutton.setGeometry(QtCore.QRect(320, 50, 93, 28))
self.Recordbutton.setObjectName("Recordbutton")
self.Recordlabel = QtWidgets.QLabel(self.frame_2)
self.Recordlabel.setGeometry(QtCore.QRect(30, 20, 55, 16))
self.Recordlabel.setObjectName("Recordlabel")
self.Recordtext = QtWidgets.QTextEdit(self.frame_2)
self.Recordtext.setGeometry(QtCore.QRect(30, 50, 241, 31))
self.Recordtext.setObjectName("Recordtext")
self.Stoprecord = QtWidgets.QPushButton(self.frame_2)
self.Stoprecord.setGeometry(QtCore.QRect(320, 90, 93, 28))
self.Stoprecord.setObjectName("Stoprecord")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 473, 26))
self.menubar.setObjectName("menubar")
self.menuRecoed_Play = QtWidgets.QMenu(self.menubar)
self.menuRecoed_Play.setObjectName("menuRecoed_Play")
self.menuStatus = QtWidgets.QMenu(self.menubar)
self.menuStatus.setObjectName("menuStatus")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.RecordPlay = QtWidgets.QAction(MainWindow)
self.RecordPlay.setObjectName("RecordPlay")
self.actionSave = QtWidgets.QAction(MainWindow)
self.actionSave.setObjectName("actionSave")
self.Status = QtWidgets.QAction(MainWindow)
self.Status.setObjectName("Status")
self.menuRecoed_Play.addAction(self.RecordPlay)
self.menuRecoed_Play.addSeparator()
self.menuRecoed_Play.addAction(self.actionSave)
self.menuStatus.addAction(self.Status)
self.menubar.addAction(self.menuRecoed_Play.menuAction())
self.menubar.addAction(self.menuStatus.menuAction())
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.Playbutton.setText(_translate("MainWindow", "Play"))
self.Playlabel.setText(_translate("MainWindow", "File .wav"))
self.Recordbutton.setText(_translate("MainWindow", "Record"))
self.Recordlabel.setText(_translate("MainWindow", "File .wav"))
self.Stoprecord.setText(_translate("MainWindow", "Stop Record"))
self.menuRecoed_Play.setTitle(_translate("MainWindow", "Record_Play"))
self.menuStatus.setTitle(_translate("MainWindow", "Status"))
self.RecordPlay.setText(_translate("MainWindow", "Open File"))
self.actionSave.setText(_translate("MainWindow", "Save"))
self.Status.setText(_translate("MainWindow", "Open"))
self.Recordbutton.clicked.connect(self.main)
self.Playbutton.clicked.connect(self.playback)
self.Stoprecord.clicked.connect(self.stoprec)
def main(self):
self.thread = MyThread()
print("main start")
stop = False
HOST = socket.gethostbyname(socket.gethostname())
print(HOST)
conn = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
conn.bind((HOST, 0))
conn.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
obj = wave.open('sys.wav', 'w')
obj.setnchannels(1) # mono
obj.setsampwidth(2)
obj.setframerate(sampleRate)
try:
while True:
raw_data, addr = conn.recvfrom(65535)
(version, header_length, ttl, proto, src, target, data) = ipv4_packet(raw_data)
# print(src)
print(TAB_1 + 'IPv4 Packet:')
print(TAB_2 + 'Version: {}, Header Length: {}, TTL: {}'.format(version, header_length, ttl))
print(TAB_2 + 'Protocol: {}, Source: {}, Target: {}'.format(proto, src, target))
if src == "192.168.1.10":
# UDP
if proto == 17:
src_port, dest_port, size, data_udp, voice_data = udp_segment(data)
print(TAB_1 + 'UDP Segment: ')
print(TAB_2 + 'Source Port: {}, Destination Port: {}, Length: {} bytes'.format(src_port,
dest_port, size))
print(TAB_2 + 'Data: ')
print(format_multi_line(DATA_TAB_3, data_udp))
# print(TAB_1 + 'RADIO STATUS')
print(TAB_2 + 'Voice_Data: ')
# print(format_multi_line(DATA_TAB_3, voice_data))
print(TAB_1 + 'RADIO STATUS')
if len(voice_data) > 0:
for i in range(len(voice_data)):
y = voice_data[i] ^ 0x55
z = y & 0x7F
iexp = z >> 4
mant = z & 0x0F
if iexp > 0:
mant = mant + 16
mant = (mant << 4) + 0x08
if iexp > 1:
mant = mant << (iexp - 1)
if data[i] <= 127:
mant = -mant
data1 = struct.pack('<h', mant)
obj.writeframesraw(data1)
pt_status = keep_alive_status(data_udp)
if pt_status == 123:
print(TAB_2 + 'KEEP_ALIVE_STATUS : ON')
sq_status = squelch_status(data_udp)
if sq_status == 1:
print(TAB_2 + 'SQ_STATUS : ON')
else:
print(TAB_2 + 'SQ_STATUS : OFF')
ptt_status = push_to_talk_status(data_udp)
if ptt_status == 1:
print(TAB_2 + 'PTT_STATUS : ON')
else:
print(TAB_2 + 'PTT_STATUS : OFF')
elif pt_status == 0 or pt_status == 8:
print(TAB_2 + 'KEEP_ALIVE_STATUS : ON')
sq_status = squelch_status(data_udp)
if sq_status == 1:
print(TAB_2 + 'SQ_STATUS : ON')
else:
print(TAB_2 + 'SQ_STATUS : OFF')
ptt_status = push_to_talk_status(data_udp)
if ptt_status == 1:
print(TAB_2 + 'PTT_STATUS : ON')
elif ptt_status == 3:
print(TAB_2 + 'PTT_STATUS : PRIORITY')
elif ptt_status == 4:
print(TAB_2 + 'PTT_STATUS : EMERGENCY')
else:
print(TAB_2 + 'PTT_STATUS : OFF')
else:
print(TAB_2 + 'KEEP_ALIVE_STATUS : OFF')
# Other
else:
print(TAB_1 + 'Data: ')
print(format_multi_line(DATA_TAB_2, data))
except stop == True:
obj.close()
def playback(self):
print("play sound")
playsound('sys.wav')
print("finish")
def stoprec(self):
print("stop")
stop = True
self.thread = MyThread()
self.thread.start()
class MyThread(QThread):
print("Stop record")
stop = True
#Unpacking_IPv4 Packet
def ipv4_packet(data):
version_header_length = data[0]
version = version_header_length >> 4
header_length = (version_header_length & 15) * 4
ttl, proto, src, target = struct.unpack('! 8x B B 2x 4s 4s', data[:20])
return version, header_length, ttl, proto, ipv4(src), ipv4(target), data[header_length:]
#Return properly formatted IPv4 address
def ipv4(addr):
return '.'.join(map(str, addr))
#Unpacks UDP segment
def udp_segment(data):
src_port, dest_port, size = struct.unpack('! H H H', data[:6])
return src_port, dest_port, size, data[8:], data[28:]
def squelch_status(data):
sq_bit = data[16]
#print(sq_bit)
#first byte
sq_status = (sq_bit >> 4) & 1
return sq_status
def push_to_talk_status(data):
ptt_bit = data[16]
#print(ptt_bit)
#first byte
ptt_status = (ptt_bit >> 5) & 111
return ptt_status
def keep_alive_status(data):
pt_bit = data[1]
#print(pt_bit)
pt_status = pt_bit
return pt_status
#Formats multi-line data
def format_multi_line(prefix, string, size=80):
size -= len(prefix)
if isinstance(string, bytes):
string = ''.join(r'\x{:02x}'.format(byte) for byte in string)
if size % 2:
size -= 1
return '\n'.join([prefix + line for line in textwrap.wrap(string, size)])
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())