欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Python實現(xiàn)語音合成小工具

 更新時間:2022年12月02日 16:18:23   作者:虛夢年華  
TTS(Text To Speech)是一種語音合成技術(shù),可以讓機器將輸入文本以語音的方式播放出來,實現(xiàn)機器說話的效果。本文將使用pyttsx3庫作為示范,編寫一個語音合成小工具,感興趣的可以了解一下

TTS簡介

TTS(Text To Speech)是一種語音合成技術(shù),可以讓機器將輸入文本以語音的方式播放出來,實現(xiàn)機器說話的效果。

TTS分成語音處理及語音合成,先由機器識別輸入的文字,再根據(jù)語音庫進行語音合成?,F(xiàn)在有很多可供調(diào)用的TTS接口,比如百度智能云的語音合成接口。微軟在Windows系統(tǒng)中也提供了TTS的接口,可以調(diào)用此接口實現(xiàn)離線的TTS語音合成功能。

本文將使用pyttsx3庫作為示范,編寫一個語音合成小工具。

pyttsx3官方文檔:https://pyttsx3.readthedocs.io 

本文源碼已上傳至GitHub:

https://github.com/XMNHCAS/SpeechSynthesisTool

安裝需要的包

安裝PyQt5及其GUI設(shè)計工具

# 安裝PyQt5
pip install PyQt5
 
# 安裝PyQt5設(shè)計器
pip install PyQt5Designer

本文使用的編輯器是VSCode,不是PyCharm,使用PyQt5的方式可能存在差異,具體使用時可以根據(jù)實際情況進行配置。 

安裝pyttsx3

pip install pyttsx3

UI界面 

可參考下圖設(shè)計簡單的GUI界面,由于本文主要為功能實例,故不考慮界面美觀問題。

界面應(yīng)有一個文本輸入框,用以輸入將要轉(zhuǎn)化為語音的文本,同時需要一個播放按鈕,用以觸發(fā)語音播放的方法。語速、音量和語言可以按需選擇。 

使用PyQt5的設(shè)計工具,可以根據(jù)以上配置的GUI界面生成以下UI(XML)代碼:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>313</width>
    <height>284</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>語音合成器</string>
  </property>
  <property name="windowIcon">
   <iconset>
    <normaloff>voice.ico</normaloff>voice.ico</iconset>
  </property>
  <widget class="QWidget" name="verticalLayoutWidget">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>10</y>
     <width>291</width>
     <height>261</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <property name="spacing">
     <number>20</number>
    </property>
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout_2">
      <item>
       <widget class="QLabel" name="label">
        <property name="text">
         <string>播報文本</string>
        </property>
        <property name="alignment">
         <set>Qt::AlignJustify|Qt::AlignTop</set>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QTextEdit" name="tbx_text"/>
      </item>
     </layout>
    </item>
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout_4">
      <item>
       <widget class="QLabel" name="label_3">
        <property name="text">
         <string>語速</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QSlider" name="slider_rate">
        <property name="maximum">
         <number>300</number>
        </property>
        <property name="orientation">
         <enum>Qt::Horizontal</enum>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QLabel" name="label_rate">
        <property name="minimumSize">
         <size>
          <width>30</width>
          <height>0</height>
         </size>
        </property>
        <property name="text">
         <string>0</string>
        </property>
        <property name="alignment">
         <set>Qt::AlignCenter</set>
        </property>
       </widget>
      </item>
     </layout>
    </item>
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout_3">
      <item>
       <widget class="QLabel" name="label_2">
        <property name="text">
         <string>音量</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QSlider" name="slider_volumn">
        <property name="maximum">
         <number>100</number>
        </property>
        <property name="orientation">
         <enum>Qt::Horizontal</enum>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QLabel" name="label_volumn">
        <property name="minimumSize">
         <size>
          <width>30</width>
          <height>0</height>
         </size>
        </property>
        <property name="text">
         <string>0</string>
        </property>
        <property name="alignment">
         <set>Qt::AlignCenter</set>
        </property>
       </widget>
      </item>
     </layout>
    </item>
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
       <widget class="QLabel" name="label_4">
        <property name="text">
         <string>選擇語言</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QRadioButton" name="rbtn_zh">
        <property name="text">
         <string>中文</string>
        </property>
        <property name="checked">
         <bool>true</bool>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QRadioButton" name="rbtn_en">
        <property name="text">
         <string>英文</string>
        </property>
       </widget>
      </item>
     </layout>
    </item>
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout_5">
      <item>
       <widget class="QLabel" name="label_5">
        <property name="minimumSize">
         <size>
          <width>60</width>
          <height>0</height>
         </size>
        </property>
        <property name="text">
         <string/>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QPushButton" name="btn_play">
        <property name="minimumSize">
         <size>
          <width>0</width>
          <height>30</height>
         </size>
        </property>
        <property name="text">
         <string>播放</string>
        </property>
       </widget>
      </item>
     </layout>
    </item>
   </layout>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

最后再使用PyQt5的界面工具,可以根據(jù)以上UI的代碼,生成以下的窗體類:

# -*- coding: utf-8 -*-
 
# Form implementation generated from reading ui file 'd:\Program\VSCode\Python\TTS_PyQT\tts_form.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# 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
 
 
class Ui_Form(object):
 
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(313, 284)
        icon = QtGui.QIcon()
        icon.addPixmap(
            QtGui.QPixmap("./voice.ico"),
            QtGui.QIcon.Normal, QtGui.QIcon.Off)
        Form.setWindowIcon(icon)
        self.verticalLayoutWidget = QtWidgets.QWidget(Form)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 10, 291, 261))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setSpacing(20)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label.setAlignment(QtCore.Qt.AlignJustify | QtCore.Qt.AlignTop)
        self.label.setObjectName("label")
        self.horizontalLayout_2.addWidget(self.label)
        self.tbx_text = QtWidgets.QTextEdit(self.verticalLayoutWidget)
        self.tbx_text.setObjectName("tbx_text")
        self.horizontalLayout_2.addWidget(self.tbx_text)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.label_3 = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label_3.setObjectName("label_3")
        self.horizontalLayout_4.addWidget(self.label_3)
        self.slider_rate = QtWidgets.QSlider(self.verticalLayoutWidget)
        self.slider_rate.setMaximum(300)
        self.slider_rate.setOrientation(QtCore.Qt.Horizontal)
        self.slider_rate.setObjectName("slider_rate")
        self.horizontalLayout_4.addWidget(self.slider_rate)
        self.label_rate = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label_rate.setMinimumSize(QtCore.QSize(30, 0))
        self.label_rate.setAlignment(QtCore.Qt.AlignCenter)
        self.label_rate.setObjectName("label_rate")
        self.horizontalLayout_4.addWidget(self.label_rate)
        self.verticalLayout.addLayout(self.horizontalLayout_4)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.label_2 = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_3.addWidget(self.label_2)
        self.slider_volumn = QtWidgets.QSlider(self.verticalLayoutWidget)
        self.slider_volumn.setMaximum(100)
        self.slider_volumn.setOrientation(QtCore.Qt.Horizontal)
        self.slider_volumn.setObjectName("slider_volumn")
        self.horizontalLayout_3.addWidget(self.slider_volumn)
        self.label_volumn = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label_volumn.setMinimumSize(QtCore.QSize(30, 0))
        self.label_volumn.setAlignment(QtCore.Qt.AlignCenter)
        self.label_volumn.setObjectName("label_volumn")
        self.horizontalLayout_3.addWidget(self.label_volumn)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label_4 = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label_4.setObjectName("label_4")
        self.horizontalLayout.addWidget(self.label_4)
        self.rbtn_zh = QtWidgets.QRadioButton(self.verticalLayoutWidget)
        self.rbtn_zh.setChecked(True)
        self.rbtn_zh.setObjectName("rbtn_zh")
        self.horizontalLayout.addWidget(self.rbtn_zh)
        self.rbtn_en = QtWidgets.QRadioButton(self.verticalLayoutWidget)
        self.rbtn_en.setObjectName("rbtn_en")
        self.horizontalLayout.addWidget(self.rbtn_en)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.label_5 = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label_5.setMinimumSize(QtCore.QSize(60, 0))
        self.label_5.setText("")
        self.label_5.setObjectName("label_5")
        self.horizontalLayout_5.addWidget(self.label_5)
        self.btn_play = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.btn_play.setMinimumSize(QtCore.QSize(0, 30))
        self.btn_play.setObjectName("btn_play")
        self.horizontalLayout_5.addWidget(self.btn_play)
        self.verticalLayout.addLayout(self.horizontalLayout_5)
 
        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)
 
    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "語音合成器"))
        self.label.setText(_translate("Form", "播報文本"))
        self.label_3.setText(_translate("Form", "語速"))
        self.label_rate.setText(_translate("Form", "0"))
        self.label_2.setText(_translate("Form", "音量"))
        self.label_volumn.setText(_translate("Form", "0"))
        self.label_4.setText(_translate("Form", "選擇語言"))
        self.rbtn_zh.setText(_translate("Form", "中文"))
        self.rbtn_en.setText(_translate("Form", "英文"))
        self.btn_play.setText(_translate("Form", "播放"))

如果直接復(fù)制此代碼,可能會出現(xiàn)圖標丟失的問題。這個需要根據(jù)實際情況修改icon的配置,并添加要使用的ico圖標文件。 

功能代碼

語音工具類

首先我們需要初始化并獲取語音合成用的語音引擎對象。

# tts對象
engine = pyttsx3.init()

我們可以通過該對象的setProperty方法,對語音合成的對象的屬性進行修改:

屬性名解釋
rate以每分鐘字數(shù)表示的整數(shù)語速
volume音量,取值范圍為[0.0, 1.0]
voices語音的字符串標識符

語音工具類代碼如下,代碼含義可參考注釋:

import pyttsx3
 
 
class VoiceEngine():
    '''
    tts 語音工具類
    '''
 
    def __init__(self):
        '''
        初始化
        '''
        # tts對象
        self.__engine = pyttsx3.init()
        # 語速
        self.__rate = 150
        # 音量
        self.__volume = 100
        # 語音ID,0為中文,1為英文
        self.__voice = 0
 
    @property
    def Rate(self):
        '''
        語速屬性
        '''
        return self.__rate
 
    @Rate.setter
    def Rate(self, value):
        self.__rate = value
 
    @property
    def Volume(self):
        '''
        音量屬性
        '''
        return self.__volume
 
    @Volume.setter
    def Volume(self, value):
        self.__volume = value
 
    @property
    def VoiceID(self):
        '''
        語音ID:0 -- 中文;1 -- 英文
        '''
 
        return self.__voice
 
    @VoiceID.setter
    def VoiceID(self, value):
        self.__voice = value
 
    def Say(self, text):
        '''
        播放語音
        '''
        self.__engine.setProperty('rate', self.__rate)
        self.__engine.setProperty('volume', self.__volume)
 
        # 獲取可用語音列表,并設(shè)置語音
        voices = self.__engine.getProperty('voices')
        self.__engine.setProperty('voice', voices[self.__voice].id)
 
        # 保存語音文件
        # self.__engine.save_to_file(text, 'test.mp3')
 
        self.__engine.say(text)
        self.__engine.runAndWait()
        self.__engine.stop()

窗體類

我們可以創(chuàng)建一個繼承于我們剛剛創(chuàng)建的PyQt5的窗體類,并為窗體的拖拽事件和點擊事件注冊回調(diào)函數(shù),同時創(chuàng)建一個語音工具類的實例,用以實現(xiàn)指定事件觸發(fā)時需要執(zhí)行的語音操作。

import sys
import _thread as th
from PyQt5.QtWidgets import QMainWindow, QApplication
from Ui_tts_form import Ui_Form
 
class MainWindow(QMainWindow, Ui_Form):
    '''
    窗體類
    '''
 
    def __init__(self, parent=None):
        '''
        初始化窗體
        '''
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
 
        # 獲取tts工具類實例
        self.engine = VoiceEngine()
        self.__isPlaying = False
 
        # 設(shè)置初始文本
        self.tbx_text.setText('床前明月光,疑似地上霜。\n舉頭望明月,低頭思故鄉(xiāng)。')
 
        # 進度條數(shù)據(jù)綁定到label中顯示
        self.slider_rate.valueChanged.connect(self.setRateTextValue)
        self.slider_volumn.valueChanged.connect(self.setVolumnTextValue)
 
        # 設(shè)置進度條初始值
        self.slider_rate.setValue(self.engine.Rate)
        self.slider_volumn.setValue(self.engine.Volume)
 
        # RadioButton選擇事件
        self.rbtn_zh.toggled.connect(self.onSelectVoice_zh)
        self.rbtn_en.toggled.connect(self.onSelectVoice_en)
 
        # 播放按鈕點擊事件
        self.btn_play.clicked.connect(self.onPlayButtonClick)
 
    def setRateTextValue(self):
        '''
        修改語速label文本值
        '''
        value = self.slider_rate.value()
        self.label_rate.setText(str(value))
        self.engine.Rate = value
 
    def setVolumnTextValue(self):
        '''
        修改音量label文本值
        '''
        value = self.slider_volumn.value()
        self.label_volumn.setText(str(value / 100))
        self.engine.Volume = value
 
    def onSelectVoice_zh(self):
        '''
        修改中文的語音配置及默認播放文本
        '''
        self.tbx_text.setText('床前明月光,疑似地上霜。\n舉頭望明月,低頭思故鄉(xiāng)。')
        self.engine.VoiceID = 0
 
    def onSelectVoice_en(self):
        '''
        修改英文的語音配置及默認的播放文本
        '''
        self.tbx_text.setText('Hello World')
        self.engine.VoiceID = 1
 
    def playVoice(self):
        '''
        播放
        '''
 
        if self.__isPlaying is not True:
            self.__isPlaying = True
            text = self.tbx_text.toPlainText()
            self.engine.Say(text)
            self.__isPlaying = False
 
    def onPlayButtonClick(self):
        '''
        播放按鈕點擊事件
        開啟線程新線程播放語音,避免窗體因為語音播放而假卡死
        '''
        th.start_new_thread(self.playVoice, ())

完整代碼

import sys
import _thread as th
from PyQt5.QtWidgets import QMainWindow, QApplication
from Ui_tts_form import Ui_Form
import pyttsx3
 
 
class VoiceEngine():
    '''
    tts 語音工具類
    '''
 
    def __init__(self):
        '''
        初始化
        '''
        # tts對象
        self.__engine = pyttsx3.init()
        # 語速
        self.__rate = 150
        # 音量
        self.__volume = 100
        # 語音ID,0為中文,1為英文
        self.__voice = 0
 
    @property
    def Rate(self):
        '''
        語速屬性
        '''
        return self.__rate
 
    @Rate.setter
    def Rate(self, value):
        self.__rate = value
 
    @property
    def Volume(self):
        '''
        音量屬性
        '''
        return self.__volume
 
    @Volume.setter
    def Volume(self, value):
        self.__volume = value
 
    @property
    def VoiceID(self):
        '''
        語音ID:0 -- 中文;1 -- 英文
        '''
 
        return self.__voice
 
    @VoiceID.setter
    def VoiceID(self, value):
        self.__voice = value
 
    def Say(self, text):
        '''
        播放語音
        '''
        self.__engine.setProperty('rate', self.__rate)
        self.__engine.setProperty('volume', self.__volume)
        voices = self.__engine.getProperty('voices')
        self.__engine.setProperty('voice', voices[self.__voice])
 
        # 保存語音文件
        # self.__engine.save_to_file(text, 'test.mp3')
 
        self.__engine.say(text)
        self.__engine.runAndWait()
        self.__engine.stop()
 
 
class MainWindow(QMainWindow, Ui_Form):
    '''
    窗體類
    '''
 
    def __init__(self, parent=None):
        '''
        初始化窗體
        '''
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
 
        # 獲取tts工具類實例
        self.engine = VoiceEngine()
        self.__isPlaying = False
 
        # 設(shè)置初始文本
        self.tbx_text.setText('床前明月光,疑似地上霜。\n舉頭望明月,低頭思故鄉(xiāng)。')
 
        # 進度條數(shù)據(jù)綁定到label中顯示
        self.slider_rate.valueChanged.connect(self.setRateTextValue)
        self.slider_volumn.valueChanged.connect(self.setVolumnTextValue)
 
        # 設(shè)置進度條初始值
        self.slider_rate.setValue(self.engine.Rate)
        self.slider_volumn.setValue(self.engine.Volume)
 
        # RadioButton選擇事件
        self.rbtn_zh.toggled.connect(self.onSelectVoice_zh)
        self.rbtn_en.toggled.connect(self.onSelectVoice_en)
 
        # 播放按鈕點擊事件
        self.btn_play.clicked.connect(self.onPlayButtonClick)
 
    def setRateTextValue(self):
        '''
        修改語速label文本值
        '''
        value = self.slider_rate.value()
        self.label_rate.setText(str(value))
        self.engine.Rate = value
 
    def setVolumnTextValue(self):
        '''
        修改音量label文本值
        '''
        value = self.slider_volumn.value()
        self.label_volumn.setText(str(value / 100))
        self.engine.Volume = value
 
    def onSelectVoice_zh(self):
        '''
        修改中文的語音配置及默認播放文本
        '''
        self.tbx_text.setText('床前明月光,疑似地上霜。\n舉頭望明月,低頭思故鄉(xiāng)。')
        self.engine.VoiceID = 0
 
    def onSelectVoice_en(self):
        '''
        修改英文的語音配置及默認的播放文本
        '''
        self.tbx_text.setText('Hello World')
        self.engine.VoiceID = 1
 
    def playVoice(self):
        '''
        播放
        '''
 
        if self.__isPlaying is not True:
            self.__isPlaying = True
            text = self.tbx_text.toPlainText()
            self.engine.Say(text)
            self.__isPlaying = False
 
    def onPlayButtonClick(self):
        '''
        修改語速label文本值
        '''
        th.start_new_thread(self.playVoice, ())
 
 
if __name__ == "__main__":
    '''
    主函數(shù)
    '''
    app = QApplication(sys.argv)
    form = MainWindow()
    form.show()
    sys.exit(app.exec_())

到此這篇關(guān)于基于Python實現(xiàn)語音合成小工具的文章就介紹到這了,更多相關(guān)Python語音合成內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python如何使用type()函數(shù)查看數(shù)據(jù)的類型

    Python如何使用type()函數(shù)查看數(shù)據(jù)的類型

    這篇文章主要介紹了Python如何使用type()函數(shù)查看數(shù)據(jù)的類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 通過gradio和攝像頭獲取照片和視頻實現(xiàn)過程

    通過gradio和攝像頭獲取照片和視頻實現(xiàn)過程

    這篇文章主要為大家介紹了gradio和攝像頭獲取照片和視頻實現(xiàn)過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Python基礎(chǔ)之類的定義和使用詳解

    Python基礎(chǔ)之類的定義和使用詳解

    在Python中,類表示具有相同屬性和方法的對象的集合。在使用類時,需要先定義類,然后再創(chuàng)建類的實例,通過類的實例就可以訪問類中的屬性和方法了。本文就來和大家一起聊聊Python中類的定義和使用,需要的可以參考一下
    2022-08-08
  • Pytorch獲取無梯度TorchTensor中的值

    Pytorch獲取無梯度TorchTensor中的值

    這篇文章主要介紹了Pytorch獲取無梯度TorchTensor中的值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python基于opencv檢測程序運行效率

    python基于opencv檢測程序運行效率

    這篇文章主要介紹了python基于opencv檢測程序運行效率,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • django從后臺返回html代碼的實例

    django從后臺返回html代碼的實例

    這篇文章主要介紹了django從后臺返回html代碼的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Python圖片裁剪實例代碼(如頭像裁剪)

    Python圖片裁剪實例代碼(如頭像裁剪)

    本篇文章主要介紹了Python圖片裁剪實例代碼(如: 頭像裁剪),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 使用pygame寫一個古詩詞填空通關(guān)游戲

    使用pygame寫一個古詩詞填空通關(guān)游戲

    這篇文章主要介紹了使用pygame寫一個古詩詞填空通關(guān)游戲,之前寫的詩詞填空的游戲支持python2,現(xiàn)在對程序進行了修改,兼容支持python2和python3,需要的朋友可以參考下
    2019-12-12
  • Python?hashlib模塊與哈希算法保護數(shù)據(jù)完整性教程

    Python?hashlib模塊與哈希算法保護數(shù)據(jù)完整性教程

    hashlib模塊為Python提供了一種簡便的方式來使用各種哈希算法,如MD5、SHA-1、SHA-256等,哈希函數(shù)廣泛用于密碼學(xué)、數(shù)據(jù)完整性驗證和安全存儲等領(lǐng)域
    2024-01-01
  • python如何在文件中部插入信息

    python如何在文件中部插入信息

    這篇文章主要介紹了python如何在文件中部插入信息問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論