如何通过Python脚本获取机器的输入设备?
我需要帮助,想写一个Python程序,能够在我的Windows 10电脑上获取可用的麦克风列表。
我的代码:
import pyaudio
import logging
import customtkinter as ctk
from pathlib import Path
def choisir_microphone():
"""
Choisissez un micro disponible sur l'ordinateur.
Returns:
int or None: Index du microphone sélectionné, ou None si aucun microphone n'a été sélectionné.
"""
# Obtenez le chemin du répertoire parent du fichier en cours d'exécution
parent_dir = Path(__file__).resolve().parent
parent_dir.mkdir(parents=True, exist_ok=True)
# Définir le chemin complet du fichier de journalisation
DIR_logs = parent_dir / "logs_micro.log"
# Configuration du module de journalisation
logging.basicConfig(filename=DIR_logs, level=logging.INFO, format='%(levelname)s - %(message)s')
with open(DIR_logs, "w") as log:
log.write("")
def obtenir_microphones_disponibles():
"""
Obtenez les microphones disponibles sur l'ordinateur.
Returns:
list: Liste des microphones disponibles, sous forme de tuples (index, nom).
"""
try:
audio = pyaudio.PyAudio()
microphones = []
device_names = {} # Dictionnaire pour stocker les noms des périphériques
for i in range(audio.get_device_count()):
device_info = audio.get_device_info_by_index(i)
max_input_channels = device_info.get('maxInputChannels')
if isinstance(max_input_channels, int) and max_input_channels > 0:
device_name = device_info.get('name')
# Vérifier si le périphérique a déjà été ajouté
if device_name not in device_names:
# Vérifier si le périphérique est un microphone
if 'microphone' in str(device_name).lower():
microphones.append((i, device_name))
device_names[device_name] = True
else:
logging.warning(f"Périphérique déjà existant : {device_name}")
logging.info("Microphones disponibles et utilisables:")
for index, microphone in microphones:
logging.info(f"{index}: {microphone}")
print(f"{index}: {microphone}")
print("-" * 50)
audio.terminate()
return microphones
except Exception as e:
logging.error(f"Une erreur s'est produite : {e}")
return []
# Obtention des microphones disponibles
microphones = obtenir_microphones_disponibles()
if not microphones:
logging.error("Aucun microphone disponible.")
print("Aucun microphone disponible.")
return None
app = ctk.CTk()
app.title('Choix du microphone')
app.geometry("550x100") # Taille de la fenêtre
app.iconbitmap(parent_dir/"logo.ico")
label = ctk.CTkLabel(app, text="Choisissez un microphone:", font=("Arial", 14)) # Police réduite
label.pack()
microphone_choisi = None
fenetre_fermee_sans_selection = False
def callback_optionmenu(choix):
nonlocal microphone_choisi
nonlocal microphones
index_microphone = [microphone[1] for microphone in microphones].index(choix)
microphone_choisi = microphones[index_microphone][0]
print("Microphone choisi (index):", microphone_choisi)
app.destroy() # Fermer la fenêtre quand un choix est fait
def sur_fermeture_fenetre():
nonlocal fenetre_fermee_sans_selection
fenetre_fermee_sans_selection = True
app.destroy()
optionmenu_var = ctk.StringVar(value=microphones[0][1])
optionmenu = ctk.CTkOptionMenu(app, values=[microphone[1] for microphone in microphones],
command=callback_optionmenu,
variable=optionmenu_var,
font=("Arial", 14)) # Police réduite
optionmenu.pack()
app.protocol("WM_DELETE_WINDOW", sur_fermeture_fenetre)
app.mainloop()
if fenetre_fermee_sans_selection:
return None
else:
return microphone_choisi
if __name__ == "__main__":
microphone_selectionne = choisir_microphone()
print(microphone_selectionne)
0 个回答
暂无回答