如何在PyQt5中循环时按下按钮停止

时间:2019-11-16 16:50:38

标签: python multithreading pyqt5 qthread qtimer

我想在按下“ 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_())

0 个答案:

没有答案