如何实现多个扫码枪和多个耳机匹配输出信息

Zhang99996666 2024-10-22 10:29:58

需求:根据扫码枪获得条码信息,在数据库中匹配到相关信息后通过耳机输出,已实现一对一,希望实现多对多,不同的操作人员使用4-6个扫码枪扫码并能分别获得需要的信息。

已有一对一代码,输入是通过输入焦点实现,程序需保持在前台运行,耳机是蓝牙耳机默认输出 。

关于扫码枪我选择的是USB HID的,公司安全部不允许用带系统的,只能用这种,关于多对多的想法是输入端通过VID和PID区分设备。

耳机之前考虑过蓝牙耳机,但蓝牙耳机只能安装一个适配器,同时只能有一个耳机进行输出。

后来考虑通过软件直接解码成数字信号直接输出到USB设备,但是不是很清楚音频播放是不是必须通过windows,能不能实现数字信号直接发送到USB设备。

或者通过混音器将各个耳机设定为不同的声道,将音频通过各个声道播放。

学习python刚一个多月,只做过一个小项目,这方面真没什么了解,希望大家能给个建议。

import pandas as pd
import sqlite3
import datetime
import schedule
import time
import threading
import os
import traceback
import pygame
import re

def find_and_mark_data(audio_directory, query):
    conn = sqlite3.connect('test_requests.db')
    c = conn.cursor()
    c.execute("SELECT * FROM test_requests WHERE Barcode=? LIMIT 1", (query,))
    row = c.fetchone()
    if row:
        today = datetime.datetime.now().strftime('%Y-%m-%d')
        c.execute("UPDATE test_requests SET Note=? WHERE Barcode=?", (f"{today}已挑", query))
        print(f"Updated row with Request_Code {row[0]}")
        conn.commit()
        request_text = f"{row[0]},{row[4]}"
        print(request_text)
        # 播放 request_text
        play_request_text(audio_directory, request_text)
        return request_text
    else:
        return None

def play_request_text(audio_directory, request_text):
    pygame.mixer.init()
    volume = 0.8
    pygame.mixer.music.set_volume(volume)
    gap_between_audios = 0
    for char in request_text:
        file_name = f"{char}.mp3"
        file_path = os.path.join(audio_directory, file_name)
        if os.path.isfile(file_path):
            while pygame.mixer.music.get_busy():
                pygame.time.Clock().tick(10)
            pygame.mixer.music.load(file_path)
            pygame.mixer.music.play()
            while pygame.mixer.music.get_busy():
                pygame.time.Clock().tick(10)
            time.sleep(gap_between_audios)
        else:
            print(f"No audio file found for character '{char}'")

def update_and_export(folder_path):
    try:
        excel_path = os.path.join(folder_path, 'test request.xlsx')
        try:
            df_excel = pd.read_excel(excel_path, header=None)
        except PermissionError:
            print(f"输入文件 {excel_path} 正在被占用,结束本次更新。")
            return
        except Exception as e:
            print(f"读取 Excel 文件时发生错误:{e}")
            return

        mapping_dict = pd.read_excel(excel_path, sheet_name='Sheet2', header=None, index_col=0)[1].astype(str).to_dict()

        def process_test_list(test_list_str):
            parts = re.split(',\s*', test_list_str)
            new_parts = []
            for part in parts:
                new_part = mapping_dict.get(part, part)
                # 将返回值转换为字符串类型
                new_part = str(new_part)
                new_parts.append(new_part)
            return ','.join(new_parts)

        df_excel.iloc[:, 4] = df_excel.iloc[:, 4].apply(process_test_list)
        
        conn = sqlite3.connect('test_requests.db')
        c = conn.cursor()

        try:
            c.execute("SELECT Request_Code, Identifier FROM test_requests")
            database_data = c.fetchall()
            database_df = pd.DataFrame(database_data, columns=['Request_Code', 'Identifier'])
        except Exception as e:
            print(f"从数据库读取数据时发生错误:{e}")
            conn.close()
            return

        new_rows = df_excel[~df_excel.iloc[:, 0].isin(database_df['Request_Code']) & ~df_excel.iloc[:, 6].isin(database_df['Identifier'])]
        
        new_rows.iloc[:, 4] = new_rows.iloc[:, 4].apply(process_test_list)

        # 使用批量插入
        values = [tuple(row) for _, row in new_rows.iterrows()]
        if values:
            c.executemany('''
            INSERT INTO test_requests (
                Request_Code, Size, Tread, Spec, Test_list, IPCode, Identifier,
                Barcode, Requester
            ) VALUES (?,?,?,?,?,?,?,?,?)
            ''', values)
            conn.commit()
        conn.close()

        # 执行导出操作
        try:
            output_path = os.path.join(folder_path, 'output.xlsx')
            # 如果文件存在,先清空文件内容
            if os.path.exists(output_path):
                with open(output_path, 'w') as f:
                    f.write('')

            # 从数据库读取所有列数据,包括 Note 列
            conn = sqlite3.connect('test_requests.db')
            df_export = pd.read_sql_query("SELECT * FROM test_requests", conn)
            conn.close()
            
            df_export.to_excel(output_path, index=False)
        except PermissionError:
            print(f"输出文件 {output_path} 正在被占用,结束本次导出。")
            return
        except sqlite3.OperationalError as e:
            if "no such table: test_requests" in str(e):
                print('test_requests.db none')
            else:
                raise e
    except Exception as e:
        traceback.print_exc()

def input_thread_function(audio_directory):
    while True:
        barcode = input('请输入 Barcode:')
        if barcode.lower() == 'exit':
            break
        find_and_mark_data(audio_directory, barcode)

def main():
    # 设置音频文件所在的目录
    audio_directory = input(r'请输入audio文件夹路径:')

    # 连接到SQLite数据库,创建表结构
    conn = sqlite3.connect('test_requests.db')
    cursor = conn.cursor()
    print("正在尝试删除可能存在的旧表...")
    cursor.execute("DROP TABLE IF EXISTS test_requests;")
    print("正在创建test_requests表...")
    cursor.execute("CREATE TABLE test_requests (Request_Code TEXT, Size TEXT, Tread TEXT, Spec TEXT, Test_list TEXT, IPCode TEXT, Identifier TEXT, Barcode TEXT, Requester TEXT, Note TEXT);")
    conn.commit()
    conn.close()

    folder_path = input(r'请输入test request文件夹路径:')
    # 定时执行更新和导出操作
    schedule.every(10).seconds.do(lambda: update_and_export(folder_path))

    # 启动一个线程来处理用户输入
    input_thread = threading.Thread(target=input_thread_function, args=(audio_directory,))
    input_thread.start()

    # 运行定时任务
    while True:
        schedule.run_pending()
        time.sleep(1)

if __name__ == "__main__":
    main()  

 

...全文
大吉大利
拼手气红包 20.00元
493 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

22,290

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧