From 8181dfa28f02a0d9813b28f61b94ba6c175385f2 Mon Sep 17 00:00:00 2001 From: Ninnjah <45268461+Ninnjah@users.noreply.github.com> Date: Fri, 23 Oct 2020 02:26:48 +0300 Subject: [PATCH] KEYS UPDATE UPDATE: - Moved from keyboard module to pynput.Listner, now keys work better - Refactored sound_get function - Little fixes --- main.py | 169 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 95 insertions(+), 74 deletions(-) diff --git a/main.py b/main.py index d8cd143..9a4f6b2 100644 --- a/main.py +++ b/main.py @@ -3,11 +3,13 @@ import sys import json import threading import keyboard +from pynput.keyboard import Listener import soundfile as sf import sounddevice as sd from PyQt5 import QtWidgets, QtGui, QtCore import ui_sundpood import ui_overlay +import keys class OverlayUi(QtWidgets.QMainWindow, ui_overlay.Ui_MainWindow): def __init__(self, parent=None): @@ -29,6 +31,7 @@ class MainUi(QtWidgets.QMainWindow, ui_sundpood.Ui_MainWindow): self.hide() over.show() + ###! JSON !### def jsonread(file): ## Чтение JSON with open(file, "r", encoding='utf-8') as read_file: @@ -50,70 +53,80 @@ def found_device(list_): # Поиск микшера VoiceMee return index def sound_get(mode): # Сбор файлов + def check_format(name, format_): # Проверка слова до точки с конца строки + suf = '' + while name[-1] != '.': + suf += name[-1] + name = name[:-1] + suf = suf[::-1] + if type(format_) is list: + if suf in format_: + return True + else: + return False + elif type(format_) is str: + if suf == format_: + return True + else: + return False + + def sound_convert(path, name, format_): # Конвертация из форматов 'mp3' 'm4a' в format_ + old_name = name + if check_format(name, ['mp3', 'm4a']): + while name[-1] != '.': + name = name[:-1] + name += format_ + os.system(f'''ffmpeg.exe -i "{os.path.join(path, old_name)}" + "{os.path.join(path, name)}"''') + os.remove(f'{os.path.join(path, old_name)}') + return name + + msg = QtWidgets.QMessageBox() + msg.setIcon(QtWidgets.QMessageBox.Critical) + msg.setText("You don't have any sounds in 'sound' folder") + msg.setInformativeText('download sound in .wav / .mp3 / .m4a format') + msg.setWindowTitle('Error') + if os.path.exists('settings.json') and mode == False: sounds_list = jsonread('settings.json') elif not os.path.exists('settings.json') or mode == True: - msg = QtWidgets.QMessageBox() - msg.setIcon(QtWidgets.QMessageBox.Critical) - msg.setText("You don't have any sounds in 'sound' folder") - msg.setInformativeText('download sound in .wav / .mp3 / .m4a format') - msg.setWindowTitle('Error') - if os.path.exists('sound'): - sounds = [] - for i in os.listdir('sound'): - format_ = '' - name = i - if os.path.isfile(os.path.join('sound', i)): - while i[-1] != '.': - format_ += i[-1] - i = i[:-1] - format_ = format_[::-1] - if format_ == 'wav': - sounds.append(name) - - if len(sounds) == 0: + if len(os.listdir('sound')) == 0: msg.exec_() exit() menu = [] sounds_list = ['sound\\'] - for i in os.listdir('sound'): # Коонвертируем файлы в .wav - name = i - format_ = '' + for i in os.listdir('sound'): if os.path.isfile(os.path.join('sound', i)): - while i[-1] != '.': - format_ += i[-1] - i = i[:-1] - format_ = format_[::-1] - if format_ in ['mp3', 'm4a']: - os.system(f'ffmpeg.exe -i "sound\\{name}" "sound\\{i}wav"') - os.remove(f'sound\\{name}') - sounds_list.append(name) + i = sound_convert('sound', i, 'wav') + sounds_list.append(i) else: sounds_list_cat = [os.path.join('sound', i)] - for x in os.listdir(os.path.join('sound', i)): # Коонвертируем файлы в .wav - name = x - format_ = '' + for x in os.listdir(os.path.join('sound', i)): if os.path.isfile(os.path.join('sound', i, x)): - while x[-1] != '.': - format_ += x[-1] - x = x[:-1] - format_ = format_[::-1] - if format_ in ['mp3', 'm4a']: - os.system(f'ffmpeg.exe -i "sound\\{os.path.join(i, name)}" "sound\\{os.path.join(i, x)}wav"') - os.remove(f'sound\\{os.path.join(i, name)}') - sounds_list_cat.append(name) + x = sound_convert(os.path.join('sound', i), x, 'wav') + sounds_list_cat.append(x) menu.append(sounds_list_cat) menu.append(sounds_list) + sounds = [] + for i in os.listdir('sound'): + if os.path.isfile(os.path.join('sound', i)): + if check_format(i, 'wav'): + sounds.append(i) + if os.path.exists('settings.json'): hotkeys = jsonread('settings.json')['hotkeys'] - sounds_list = {'sounds':sounds, 'hotkeys':hotkeys, 'menu':menu} + sounds_list = {'sound':sounds, + 'hotkeys':hotkeys, + 'menu':menu} else: - sounds_list = {'sounds':sounds, 'hotkeys':{'':''}, 'menu':menu} + sounds_list = {'sounds':sounds, + 'hotkeys':{'Push button':''}, + 'menu':menu} for i in COMBOS: i.addItems(sounds) @@ -127,9 +140,7 @@ def save(): # Сохранение списка hotkeys = {} sounds = sound_get(False) for i in range(len(COMBOS)): - print(COMBOS[i].currentText()) hotkeys.setdefault(HOTKEYS[i].text(), COMBOS[i].currentText()) - print(hotkeys) sounds_list = {'sounds':sounds, 'hotkeys':hotkeys, 'menu':menu} jsonwrite('settings.json', sounds_list) @@ -137,6 +148,7 @@ def save(): # Сохранение списка hotkeys = None def play_sound(index): # Проигрываение звука + print(index) try: filename = COMBOS[index].currentText() try: @@ -156,17 +168,30 @@ def play_sound(index): # Проигрываение зву except: pass -def hotkey_remap(btn): - button = HOTKEYS[btn] - key = keyboard.read_key() - if key not in ['esc']: - print(key) - print(COMMANDS[COMMANDS.index(button.text())]) - COMMANDS[COMMANDS.index(button.text())] = key - button.setText(key) +def hotkey_remap(btn): # Переназначение хоткеев + def check(key): + button = HOTKEYS[btn] + key = str(key) + if key not in keys.forbidden: + print(key) + COMMANDS[COMMANDS.index(button.text())] = key.replace("'",'') + button.setText(key.replace("'",'')) + for i in HOTKEYS: + if i != HOTKEYS[btn]: + i.setEnabled(True) + return False + + for i in HOTKEYS: + if i != HOTKEYS[btn]: + i.setEnabled(False) + + hotkey_remap_Listener = Listener( + on_release=check) + hotkey_remap_Listener.start() + ###! CONTROL !### -def key(arg): # Хоткеи +def key_check(key): # Хоткеи def select_move(mode): select[1] += mode[1] select[0] += mode[0] @@ -178,6 +203,10 @@ def key(arg): # Хоткеи select[1] = 0 over.label.setText(menu[select[0]][select[1]]) win.select_label.setText(menu[select[0]][select[1]]) + + key = str(key) + if key.replace("'",'') in COMMANDS: + play_sound(COMMANDS.index(key.replace("'",''))) keyboard.add_hotkey(72, select_move, args=[[0, -1]]) keyboard.add_hotkey(80, select_move, args=[[0, 1]]) @@ -186,21 +215,11 @@ def key(arg): # Хоткеи keyboard.add_hotkey(76, play_sound, args=['']) keyboard.add_hotkey(73, sd.stop) - while True: - key = keyboard.read_key() - print(keyboard.key_to_scan_codes(key)) - if key == 'esc': - break - elif key in COMMANDS: - print(key) - play_sound(COMMANDS.index(key)) - - def main(): # Интерфейс + win.show() + key_check_Listener.start() - hotkeys_thread.start() win.save_button.clicked.connect(save) - win.hotkey_1.clicked.connect(lambda: hotkey_remap(0)) win.hotkey_2.clicked.connect(lambda: hotkey_remap(1)) win.hotkey_3.clicked.connect(lambda: hotkey_remap(2)) @@ -214,6 +233,7 @@ def main(): # Интерфейс win.hotkey_11.clicked.connect(lambda: hotkey_remap(10)) win.hotkey_12.clicked.connect(lambda: hotkey_remap(11)) + if __name__ == '__main__': ### Поиск устроства ввода ### list_ = list(sd.query_devices()) @@ -224,9 +244,6 @@ if __name__ == '__main__': app = QtWidgets.QApplication([]) over = OverlayUi() win = MainUi() - win.show() - - select = [0, 0] COMBOS = [ win.combo0, win.combo1, @@ -254,13 +271,19 @@ if __name__ == '__main__': win.hotkey_11, win.hotkey_12,] - sounds = sound_get(True)['hotkeys'] + sound_get_dict = sound_get(True) + + ### Глобальные переменные ### + sounds = sound_get_dict['hotkeys'] + menu = sound_get_dict['menu'] + select = [0, 0] combo = 0 for i in sounds.items(): index = COMBOS[combo].findText(i[1]) COMBOS[combo].setCurrentIndex(index) HOTKEYS[combo].setText(i[0]) combo += 1 + combo = None COMMANDS = [ HOTKEYS[0].text(), @@ -276,10 +299,8 @@ if __name__ == '__main__': HOTKEYS[10].text(), HOTKEYS[11].text(),] - menu = sound_get(True)['menu'] + key_check_Listener = Listener( + on_release=key_check) - hotkeys_thread = threading.Thread(target=key, args=(1,)) - hotkeys_thread.setDaemon(True) - main() sys.exit(app.exec())