Compare commits

..

No commits in common. "master" and "v1.3.1" have entirely different histories.

21 changed files with 886 additions and 1420 deletions

View file

@ -1,40 +1,27 @@
# Sundpood
![Banner](https://git.dc09.ru/Ninnjah/Sundpood/raw/branch/master/pics/banner.jpg)
![Banner](https://github.com/Ninnjah/Sundpood/blob/master/banner.jpg)
App like [SoundPad](https://www.leppsoft.com/soundpad/en/download/)(needs [VoiceMeeter](https://vb-audio.com/Voicemeeter/)(allready in "redist" folder))
### Features:
- Play sound by pressing hotkey
- Supported formats:
- .wav
- .mp3
- .ogg
- ~~.m4a~~
- ~~Converting sounds by [ffmpeg](https://ffmpeg.org/download.html)~~
- Sound categories (folders in "sound" folder)
- Converting sounds by [ffmpeg](https://ffmpeg.org/download.html)
- Overlay menu by press F1 key
- Overlay control on numpad (set in preferences)
- Light, Dark Themes and mode
- Overlay control on numpad
```
numpad 8/2 - select sound
numpad 4/6 - select category
numapd 5 - play sound
```
- Sound categories in overlay menu(folders in "sound" folder)
### Screenshots
- Light Theme
### Used modules:
- [sounddevice](https://pypi.org/project/sounddevice/)
- [pynput](https://pypi.org/project/pynput/)
- [PyQt5](https://pypi.org/project/PyQt5/)
![light theme](https://git.dc09.ru/Ninnjah/Sundpood/raw/branch/master/pics/Light%20theme.png)
---
- Dark Theme
![light theme](https://git.dc09.ru/Ninnjah/Sundpood/raw/branch/master/pics/Dark%20theme.png)
---
- Rachila Theme
![light theme](https://git.dc09.ru/Ninnjah/Sundpood/raw/branch/master/pics/Rachila%20theme.png)
---
### Requirements:
- [sounddevice](https://pypi.org/project/sounddevice/) for select audio device
- [pynput](https://pypi.org/project/pynput/) for hotkeys
- [PyQt5](https://pypi.org/project/PyQt5/) for GUI
- [VoiceMeeter](https://vb-audio.com/Voicemeeter/) for redirect sound into microphone
- ~~[ffmpeg](https://ffmpeg.org/download.html) for convert sounds in .wav format~~Now SundPood using pygame module
- [PyGame](https://pypi.org/project/pygame/) for playing sounds
### Links to needs soft
- [VoiceMeeter](https://vb-audio.com/Voicemeeter/) for translate sound into microphone
- [ffmpeg](https://ffmpeg.org/download.html) for convert sounds in .wav format

BIN
banner.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View file

@ -1,536 +0,0 @@
#\ SundPood version 0201 /#
import os
import sys
import json
from time import time
import pygame as pg
import sounddevice as sd
from pynput.keyboard import Listener
from cryptography.fernet import Fernet
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtCore import QFile, QTextStream
from PyQt5.QtWidgets import QApplication
from data import ui_preferences
from data import ui_hotkeys
from data import ui_sundpood
from data import ui_overlay
from data import keys
import themes
import key
###! UI !###
class OverlayUi(QtWidgets.QMainWindow, ui_overlay.Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowFlags(QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint)
self.setGeometry(QtCore.QRect(0, 0, 250, 20))
self.setupUi(self)
def keyPressEvent(self, e):
if e.key() == QtCore.Qt.Key_F1:
self.hide()
win.show()
class PreferencesUi(QtWidgets.QMainWindow, ui_preferences.Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.setupUi(self)
def mousePressEvent(self, event):
self.offset = event.pos()
def mouseMoveEvent(self, event):
x = event.globalX()
y = event.globalY()
x_w = self.offset.x()
y_w = self.offset.y()
self.move(x-x_w, y-y_w)
def closeEvent(self, event):
save()
class HotkeysUi(QtWidgets.QMainWindow, ui_hotkeys.Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.setupUi(self)
def mousePressEvent(self, event):
self.offset = event.pos()
def mouseMoveEvent(self, event):
x = event.globalX()
y = event.globalY()
x_w = self.offset.x()
y_w = self.offset.y()
self.move(x-x_w, y-y_w)
class MainUi(QtWidgets.QMainWindow, ui_sundpood.Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.setupUi(self)
self.volume_slider.valueChanged[int].connect(change_volume)
def mousePressEvent(self, event):
self.offset = event.pos()
def mouseMoveEvent(self, event):
try:
x = event.globalX()
y = event.globalY()
x_w = self.offset.x()
y_w = self.offset.y()
self.move(x-x_w, y-y_w)
except AttributeError:
pass
def keyPressEvent(self, e):
if e.key() == QtCore.Qt.Key_F1:
pref.close()
self.hide()
over.show()
def closeEvent(self, event):
save()
if os.path.exists('.play'):
os.remove('.play')
hotk.close()
pref.close()
###! JSON !###
def jsonread(file):
'''
Чтение JSON файла file
file - имя JSON файла, может содержать полный или относительный путь
'''
with open(file, "r", encoding='utf-8') as read_file:
data = json.load(read_file)
return data
def jsonwrite(file, data):
'''
Запись в JSON файл file данные data
file - имя JSON файла, может содержать полный или относительный путь
data - данные, может быть словарем/списком/кортежем/строкой/числом
'''
with open(file, 'w', encoding='utf-8') as write_file:
write_file.write(json.dumps(data))
###! FUNCTIONS !###
def toggle_stylesheet(path):
'''
Toggle the stylesheet to use the desired path in the Qt resource
system (prefixed by `:/`) or generically (a path to a file on
system).
:path: A full path to a resource or file on system
'''
# get the QApplication instance, or crash if not set
app = QApplication.instance()
if app is None:
raise RuntimeError("No Qt Application found.")
path = os.path.join('themes', path)
file = QFile(path)
file.open(QFile.ReadOnly | QFile.Text)
stream = QTextStream(file)
theme = stream.readAll()
pref.setStyleSheet(theme)
win.setStyleSheet(theme)
hotk.setStyleSheet(theme)
def find_device():
'''
Ищем устройство device и возвращаем его индекс
'''
list_ = list(sd.query_devices()) # Список устройств вывода звука
device = ["CABLE Input (VB-Audio Virtual Cable)",
"VoiceMeeter Input (VB-Audio VoiceMeeter VAIO)"]# Имя искомого устройства
msg = QtWidgets.QMessageBox() # Окно ошибки (Устройство не найдено)
msg.setIcon(QtWidgets.QMessageBox.Critical)
msg.setText("You don't install VoiceMeeter")
msg.setInformativeText('install VoiceMetter from "redist" folder or download it from \nvb-audio.com/Voicemeeter')
msg.setWindowTitle('Error')
for i in list_:
for d in device:
if d in i['name']:
return i['name']
msg.exec_()
exit()
def get_files(dir_, config):
'''
Сбор всех аудифайлов
dir_ - Путь к папке со звуками
config - Имя файла настроек
'''
msg = QtWidgets.QMessageBox() # Окно ошибки (Не найдены файлы в папке 'sound')
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(dir_):
if len(os.listdir(dir_)) == 0:
msg.exec_()
sounds = [] # Все аудио файлы
sounds_list = [f'{dir_}\\'] # Начальная категория
for i in os.listdir(dir_):
if os.path.isfile(os.path.join(dir_, i)):
name = os.path.join(dir_, i)
if name == None:
sounds_list.append(i)
elif os.path.splitext(i)[1] in ['.mp3', '.m4a', '.wav']:
sounds_list.append(i)
else:
sounds_list_cat = [os.path.join(dir_, i)]
for x in os.listdir(os.path.join(dir_, i)):
if os.path.isfile(os.path.join(dir_, i, x)):
if name == None:
sounds_list_cat.append(x)
elif os.path.splitext(x)[1] in ['.mp3', '.m4a', '.wav']:
sounds_list_cat.append(x)
sounds.append(sounds_list_cat)
sounds.append(sounds_list)
if os.path.exists(config):
hotkeys = jsonread(config)['hotkeys']
theme = jsonread(config)['Theme']
KEYS_CMD = jsonread(config)['KEYS_CMD']
sounds_list = { 'hotkeys':hotkeys,
'sounds':sounds,
'Theme':theme,
'KEYS_CMD':KEYS_CMD}
else:
sounds_list = { 'hotkeys':{},
'sounds':sounds,
'Theme':'None',
'KEYS_CMD':{
'select_move_up' :' ',# вверх
'select_move_down' :' ',# вниз
'select_move_left' :' ',# влево
'select_move_right' :' ',# вправо
'play_sound' :' ',# Играть
'stop_sound' :' ',# Остановить
}}
jsonwrite(config, sounds_list)
else:
sounds_list = { 'hotkeys':{},
'sounds':'',
'Theme':'None',
'KEYS_CMD':{
'select_move_up' :' ',# вверх
'select_move_down' :' ',# вниз
'select_move_left' :' ',# влево
'select_move_right' :' ',# вправо
'play_sound' :' ',# Играть
'stop_sound' :' ',# Остановить
}}
jsonwrite(config, sounds_list)
os.mkdir(dir_)
msg.exec_()
def change_volume(value):
pg.mixer.music.set_volume(value/100)
def play_sound(*argv):
if False in argv:
try:
sound = os.path.join(win.soundList.item(0).text(),
win.soundList.currentItem().text())
except AttributeError:
return False
else:
sound = argv[0]
try:
pg.mixer.music.load(sound)
pg.mixer.music.play()
pg.event.wait()
except RuntimeError:
pass
def cat_select(cat):
win.soundList.clear()
for i in menu:
if 'sound' + cat == i[0]:
win.soundList.addItems(i)
def hotkey_remap():
'''
Переназначение хоткея
btn - индекс кнопки хоткея в списке HOTKEYS
'''
def check(key):
key = str(key).replace("'",'')
try:
sound = os.path.join(win.soundList.item(0).text(),
win.soundList.currentItem().text())
except AttributeError:
win.hkset.setEnabled(True)
return False
if key not in keys.forbidden:
hotkeys.update({key:sound})
elif key == 'Key.backspace':
del hotkeys[find_key(hotkeys, sound)]
save()
hotk.hotkeyList.clear()
for i in sound_get_dict['sounds']:
for x in i:
x = os.path.join(i[0], x)
if x in hotkeys.values():
hotk.hotkeyList.addItem(f'{find_key(hotkeys, x)}\t:{x}')
win.hkset.setEnabled(True)
return False
win.hkset.setEnabled(False)
hotkey_remap_Listener = Listener(
on_release=check)
hotkey_remap_Listener.start()
def hotkey_delete():
key = hotk.hotkeyList.currentItem().text().split(':')[0].replace('\t', '')
hotkeys.pop(key)
save()
hotk.hotkeyList.clear()
for i in sound_get_dict['sounds']:
for x in i:
x = os.path.join(i[0], x)
if x in hotkeys.values():
hotk.hotkeyList.addItem(f'{find_key(hotkeys, x)}\t:{x}')
def pref_remap(btn, func_):
'''
Переназначение клавиши в окно Preference
btn - PyQt5 кнопка
func_ - строковое значени функции из словаря KEYS_CMD
'''
def check(key):
'''
Проверка кнопки btn на не участие
в списке запрещенных клавиш keys.forbidden
если это клавиша 'Key.backspace' то стираем значение
key - pynput код клавиши
'''
key = str(key).replace("'",'')
if key not in keys.forbidden:
KEYS_CMD.update({find_key(COMMAND_DICT, func_) : key})
btn.setText(keys.dict_[key])
elif key == 'Key.backspace':
KEYS_CMD.update({find_key(COMMAND_DICT, func_) : ' '})
btn.setText(' ')
for i in PREF_BTN:
i.setEnabled(True)
save()
return False
for i in PREF_BTN:
i.setEnabled(False)
hotkey_remap_Listener = Listener(
on_release=check)
hotkey_remap_Listener.start()
def find_key(dict, val):
'''
Поиск ключа в словаре dict по значению val
dict - словарь
val - значение
'''
return next((key for key, value in dict.items() if value == val), None)
def check_update():
def decrypt(filename, key):
f = Fernet(key)
with open(filename, 'rb') as file:
encrypted_data = file.read()
decrypted_data = f.decrypt(encrypted_data)
return decrypted_data.decode('utf-8')
file_ = decrypt(os.path.join('data', 'sundpood-runtime.sr') , key.KEY)
version = ''
for i in file_:
if i != '/':
version += i
else:
break
print(VERSION)
return version.split(' ')[3]
def save():
'''
Сохранение настроек оверлея и глобальных хоткеев
'''
sounds = jsonread(config)['sounds']# Все аудиофайлы
KEYS_JSON = {} # Настроенные клавиши
for i in KEYS_CMD.keys():
KEYS_JSON.setdefault(COMMAND_DICT[i], KEYS_CMD[i])
try:
theme = pref.themesList.currentItem().text()
except AttributeError:
theme = jsonread(config)['Theme']
sounds_list = {'sounds':sounds, 'hotkeys':hotkeys, 'Theme':theme, 'KEYS_CMD':KEYS_JSON}
jsonwrite(config, sounds_list)
###! CONTROL !###
def select_move(mode):
'''
Перемешение по оверлейному меню
mode - кортеж из двух цифр
(смещение по категории, смещение по списку)
'''
select[0] += mode[0] # Категории
select[1] += mode[1] # Файлы в категории
if select[0] > len(menu)-1 or select[0] < -len(menu)+1:
select[0] = 0
if select[1] > len(menu[select[0]])-1 or select[1] < -len(menu[select[0]])+1:
select[1] = 0
if mode[0] != 0:
select[1] = 0
over.label.setText(menu[select[0]][select[1]])
win.select_label.setText(menu[select[0]][select[1]])
def key_check(key):
key = str(key).replace("'",'') # Преобразование кода в строку
key_n = '' # Переведенное значение клавиши
try:
key_n = keys.dict_[key]
except KeyError:
pass
if key in hotkeys.keys():
play_sound(hotkeys[key])
elif key in KEYS_CMD.values():
find_key(KEYS_CMD, key)()
def main():
key_check_Listener = Listener(
on_release=key_check)
key_check_Listener.start()
win.exit_button.clicked.connect(win.close)
win.min_button.clicked.connect(win.showMinimized)
pref.exit_button.clicked.connect(pref.close)
pref.min_button.clicked.connect(pref.showMinimized)
hotk.exit_button.clicked.connect(hotk.close)
hotk.min_button.clicked.connect(hotk.showMinimized)
win.hkset.clicked.connect(hotkey_remap)
win.pref_button.clicked.connect(pref.show)
win.hotkeys_button.clicked.connect(hotk.show)
win.catList.currentTextChanged.connect(cat_select)
win.stop_button.clicked.connect(lambda: sd.stop())
win.play_button.clicked.connect(play_sound)
pref.play_sound.clicked.connect(
lambda: pref_remap(pref.play_sound, 'play_sound'))
pref.stop_sound.clicked.connect(
lambda: pref_remap(pref.stop_sound, 'stop_sound'))
pref.select_move_up.clicked.connect(
lambda: pref_remap(pref.select_move_up, 'select_move_up'))
pref.select_move_down.clicked.connect(
lambda: pref_remap(pref.select_move_down, 'select_move_down'))
pref.select_move_left.clicked.connect(
lambda: pref_remap(pref.select_move_left, 'select_move_left'))
pref.select_move_right.clicked.connect(
lambda: pref_remap(pref.select_move_right, 'select_move_right'))
pref.themesList.currentTextChanged.connect(toggle_stylesheet)
pref.update_button.clicked.connect(check_update)
hotk.delete_button.clicked.connect(hotkey_delete)
win.show()
if __name__ == '__main__':
### Создание окна ###
app = QApplication([]) # Приложение
over = OverlayUi() # Окно оверлея
pref = PreferencesUi() # Окно настроек
hotk = HotkeysUi() # Окно хоткеев
win = MainUi() # Основное окно
PREF_BTN = [ # Список кнопок настроек клавиш в pref
pref.select_move_up,
pref.select_move_down,
pref.select_move_left,
pref.select_move_right,
pref.play_sound,
pref.stop_sound,]
### Поиск устроства ввода ###
pg.mixer.pre_init(44100, -16, 2, 2048) # setup mixer to avoid sound lag
pg.mixer.init(devicename=find_device()) # Установка устройства вывода по умолчанию
### Глобальные переменные ###
VERSION = 102
dir_ = 'sound'
config = 'settings.json'
get_files(dir_, config) # Сбор всех аудиофайлов
sound_get_dict = jsonread(config) # Загрузка данных
hotkeys = sound_get_dict['hotkeys'] # Загрузка словаря хоткеев
theme = sound_get_dict['Theme'] # Загрузка темы
menu = sound_get_dict['sounds'] # Загрузка оверлейного меню
select = [0, 0] # Установка курсора оверлея в нулевую позицию
if theme != 'None':
toggle_stylesheet(theme)
pref.themesList.addItems(os.listdir('themes'))
for i in sound_get_dict['sounds']:
win.catList.addItem(i[0].replace('sound', ''))
for x in i:
x = os.path.join(i[0], x)
if x in hotkeys.values():
hotk.hotkeyList.addItem(f'{find_key(hotkeys, x)}\t: {x}')
COMMAND_DICT = { # Словарь функций к строковому значению
lambda: select_move((0, -1)):'select_move_up', # вверх
lambda: select_move((0, 1)) :'select_move_down', # вниз
lambda: select_move((-1, 0)):'select_move_left', # влево
lambda: select_move((1, 0)) :'select_move_right', # вправо
lambda: play_sound(os.path.join(menu[select[0]][0],
menu[select[0]][select[1]])):'play_sound', # Играть
lambda: sd.stop() :'stop_sound', # Остановить
}
KEYS_JSON = sound_get_dict['KEYS_CMD']# Загрузка настроенных клавиш
KEYS_CMD = COMMAND_DICT.copy() # Настроенные клавиши
### Установка настроенных клавиш ###
for i in KEYS_CMD.keys():
KEYS_CMD.update({i:KEYS_JSON[COMMAND_DICT[i]]})
KEYS_JSON = None
combo = 0
for i in KEYS_CMD.values():
PREF_BTN[combo].setText(keys.dict_[i])
combo += 1
main()
sys.exit(app.exec())

View file

@ -1,153 +0,0 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'hotkeys.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# 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_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(420, 468)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
MainWindow.setMinimumSize(QtCore.QSize(420, 468))
MainWindow.setMaximumSize(QtCore.QSize(420, 468))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("icon.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
MainWindow.setStyleSheet("QWidget{\n"
" background: rgb(44, 44, 44); \n"
" font: 25 14pt \"Calibri Light\";\n"
"}\n"
"\n"
"QLabel{\n"
" background: none\n"
"}\n"
"\n"
"QPushButton{\n"
" background: rgb(58, 58, 58);\n"
" border: none;\n"
"}\n"
"\n"
"QPushButton:hover{\n"
" background: rgb(53, 53, 53);\n"
"}\n"
"\n"
"QListWidget{\n"
" margin: 4px;\n"
" border: none;\n"
"}\n"
"\n"
"QListWidget::item[Custom=\"true\"]{\n"
" background: rgb(48, 48, 48);\n"
"}\n"
"\n"
"QListWidget::item:hover{\n"
" background: rgb(53, 53, 53);\n"
"}\n"
"\n"
"QListWidget::item:selected{\n"
" background: rgb(48, 48, 48);\n"
" color: black;\n"
"}\n"
"\n"
"QScrollBar:vertical{\n"
" border: 1px transparent rgb(58, 58, 58);\n"
" border-radius: 4px;\n"
" background: rgb(48, 48, 48);\n"
" width: 16px;\n"
"}\n"
"\n"
"QScrollBar::handle:vertical{\n"
" background: rgb(48, 48, 48);\n"
"}\n"
"\n"
"QScrollBar::sub-page:vertical{\n"
" background: rgb(58, 58, 58);\n"
"}\n"
"\n"
"QScrollBar::add-page:vertical{\n"
" background: rgb(58, 58, 58);\n"
"}\n"
"\n"
"#background{\n"
" background:rgb(48, 48, 48);\n"
"}\n"
"\n"
"#exit_button{\n"
" margin-bottom: 1px;\n"
"}\n"
"\n"
"#exit_button:hover{\n"
" color: black;\n"
" background: rgba(254, 119, 122, 128);\n"
"}\n"
"\n"
"#min_button{\n"
" margin-bottom: 1px;\n"
"}\n"
"\n"
"#min_button:hover{\n"
" color: black;\n"
" background: rgba(194, 213, 254, 128);\n"
"}\n"
"\n"
"#delete_button:hover{\n"
" color: black;\n"
" background: rgba(254, 119, 122, 128);\n"
"}")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.exit_button = QtWidgets.QPushButton(self.centralwidget)
self.exit_button.setGeometry(QtCore.QRect(380, 0, 41, 31))
self.exit_button.setStyleSheet("")
self.exit_button.setObjectName("exit_button")
self.min_button = QtWidgets.QPushButton(self.centralwidget)
self.min_button.setGeometry(QtCore.QRect(340, 0, 41, 31))
self.min_button.setStyleSheet("")
self.min_button.setObjectName("min_button")
self.title = QtWidgets.QLabel(self.centralwidget)
self.title.setGeometry(QtCore.QRect(20, 40, 291, 20))
self.title.setStyleSheet("background: none;\n"
"")
self.title.setObjectName("title")
self.background = QtWidgets.QWidget(self.centralwidget)
self.background.setGeometry(QtCore.QRect(0, 0, 421, 71))
self.background.setStyleSheet("")
self.background.setObjectName("background")
self.hotkeyList = QtWidgets.QListWidget(self.centralwidget)
self.hotkeyList.setGeometry(QtCore.QRect(0, 70, 421, 351))
self.hotkeyList.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.hotkeyList.setObjectName("hotkeyList")
self.delete_button = QtWidgets.QPushButton(self.centralwidget)
self.delete_button.setGeometry(QtCore.QRect(0, 420, 101, 51))
self.delete_button.setStyleSheet("")
self.delete_button.setObjectName("delete_button")
self.background.raise_()
self.exit_button.raise_()
self.min_button.raise_()
self.title.raise_()
self.hotkeyList.raise_()
self.delete_button.raise_()
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Hotkeys"))
self.exit_button.setText(_translate("MainWindow", "X"))
self.min_button.setText(_translate("MainWindow", "-"))
self.title.setText(_translate("MainWindow", "Hotkeys"))
self.delete_button.setText(_translate("MainWindow", "Delete"))

View file

@ -1,209 +0,0 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'preferences.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# 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_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(420, 500)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
MainWindow.setMinimumSize(QtCore.QSize(420, 500))
MainWindow.setMaximumSize(QtCore.QSize(420, 500))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("icon.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
MainWindow.setStyleSheet("QWidget{\n"
" background: rgb(44, 44, 44); \n"
" font: 25 14pt \"Calibri Light\";\n"
"}\n"
"\n"
"QLabel{\n"
" background: none\n"
"}\n"
"\n"
"QPushButton{\n"
" background: rgb(58, 58, 58);\n"
" border: none;\n"
"}\n"
"\n"
"QPushButton:hover{\n"
" background: rgb(53, 53, 53);\n"
"}\n"
"\n"
"QListWidget{\n"
" margin: 4px;\n"
" border: none;\n"
"}\n"
"\n"
"QListWidget::item[Custom=\"true\"]{\n"
" background: rgb(48, 48, 48);\n"
"}\n"
"\n"
"QListWidget::item:hover{\n"
" background: rgb(53, 53, 53);\n"
"}\n"
"\n"
"QListWidget::item:selected{\n"
" background: rgb(48, 48, 48);\n"
" color: black;\n"
"}\n"
"\n"
"QScrollBar:vertical{\n"
" border: 1px transparent rgb(58, 58, 58);\n"
" border-radius: 4px;\n"
" background: rgb(48, 48, 48);\n"
" width: 16px;\n"
"}\n"
"\n"
"QScrollBar::handle:vertical{\n"
" background: rgb(48, 48, 48);\n"
"}\n"
"\n"
"QScrollBar::sub-page:vertical{\n"
" background: rgb(58, 58, 58);\n"
"}\n"
"\n"
"QScrollBar::add-page:vertical{\n"
" background: rgb(58, 58, 58);\n"
"}\n"
"\n"
"#background{\n"
" background:rgb(48, 48, 48);\n"
"}\n"
"\n"
"#exit_button{\n"
" margin-bottom: 1px;\n"
"}\n"
"\n"
"#exit_button:hover{\n"
" color: black;\n"
" background: rgba(254, 119, 122, 128);\n"
"}\n"
"\n"
"#min_button{\n"
" margin-bottom: 1px;\n"
"}\n"
"\n"
"#min_button:hover{\n"
" color: black;\n"
" background: rgba(194, 213, 254, 128);\n"
"}\n"
"\n"
"#update_button:hover{\n"
" background:rgba(10, 128, 179, 128);\n"
"}")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.exit_button = QtWidgets.QPushButton(self.centralwidget)
self.exit_button.setGeometry(QtCore.QRect(380, 0, 41, 31))
self.exit_button.setStyleSheet("")
self.exit_button.setObjectName("exit_button")
self.min_button = QtWidgets.QPushButton(self.centralwidget)
self.min_button.setGeometry(QtCore.QRect(340, 0, 41, 31))
self.min_button.setStyleSheet("")
self.min_button.setObjectName("min_button")
self.gridLayoutWidget = QtWidgets.QWidget(self.centralwidget)
self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 80, 391, 201))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setHorizontalSpacing(6)
self.gridLayout.setObjectName("gridLayout")
self.pref_over = QtWidgets.QLabel(self.gridLayoutWidget)
self.pref_over.setStyleSheet("background:none")
self.pref_over.setObjectName("pref_over")
self.gridLayout.addWidget(self.pref_over, 0, 0, 1, 1)
self.pref_over_el5 = QtWidgets.QLabel(self.gridLayoutWidget)
self.pref_over_el5.setObjectName("pref_over_el5")
self.gridLayout.addWidget(self.pref_over_el5, 5, 0, 1, 1)
self.pref_over_el2 = QtWidgets.QLabel(self.gridLayoutWidget)
self.pref_over_el2.setObjectName("pref_over_el2")
self.gridLayout.addWidget(self.pref_over_el2, 2, 0, 1, 1)
self.select_move_down = QtWidgets.QPushButton(self.gridLayoutWidget)
self.select_move_down.setObjectName("select_move_down")
self.gridLayout.addWidget(self.select_move_down, 2, 1, 1, 1)
self.select_move_right = QtWidgets.QPushButton(self.gridLayoutWidget)
self.select_move_right.setObjectName("select_move_right")
self.gridLayout.addWidget(self.select_move_right, 4, 1, 1, 1)
self.select_move_up = QtWidgets.QPushButton(self.gridLayoutWidget)
self.select_move_up.setObjectName("select_move_up")
self.gridLayout.addWidget(self.select_move_up, 1, 1, 1, 1)
self.pref_over_el3 = QtWidgets.QLabel(self.gridLayoutWidget)
self.pref_over_el3.setObjectName("pref_over_el3")
self.gridLayout.addWidget(self.pref_over_el3, 3, 0, 1, 1)
self.stop_sound = QtWidgets.QPushButton(self.gridLayoutWidget)
self.stop_sound.setObjectName("stop_sound")
self.gridLayout.addWidget(self.stop_sound, 6, 1, 1, 1)
self.pref_over_el6 = QtWidgets.QLabel(self.gridLayoutWidget)
self.pref_over_el6.setObjectName("pref_over_el6")
self.gridLayout.addWidget(self.pref_over_el6, 6, 0, 1, 1)
self.pref_over_el4 = QtWidgets.QLabel(self.gridLayoutWidget)
self.pref_over_el4.setObjectName("pref_over_el4")
self.gridLayout.addWidget(self.pref_over_el4, 4, 0, 1, 1)
self.select_move_left = QtWidgets.QPushButton(self.gridLayoutWidget)
self.select_move_left.setObjectName("select_move_left")
self.gridLayout.addWidget(self.select_move_left, 3, 1, 1, 1)
self.pref_over_el1 = QtWidgets.QLabel(self.gridLayoutWidget)
self.pref_over_el1.setObjectName("pref_over_el1")
self.gridLayout.addWidget(self.pref_over_el1, 1, 0, 1, 1)
self.play_sound = QtWidgets.QPushButton(self.gridLayoutWidget)
self.play_sound.setObjectName("play_sound")
self.gridLayout.addWidget(self.play_sound, 5, 1, 1, 1)
self.background = QtWidgets.QWidget(self.centralwidget)
self.background.setGeometry(QtCore.QRect(0, 0, 421, 71))
self.background.setStyleSheet("")
self.background.setObjectName("background")
self.title = QtWidgets.QLabel(self.background)
self.title.setGeometry(QtCore.QRect(10, 10, 161, 41))
self.title.setStyleSheet("")
self.title.setObjectName("title")
self.pref_themes = QtWidgets.QLabel(self.centralwidget)
self.pref_themes.setGeometry(QtCore.QRect(10, 290, 201, 31))
self.pref_themes.setObjectName("pref_themes")
self.themesList = QtWidgets.QListWidget(self.centralwidget)
self.themesList.setGeometry(QtCore.QRect(10, 330, 401, 161))
self.themesList.setObjectName("themesList")
self.background.raise_()
self.exit_button.raise_()
self.min_button.raise_()
self.gridLayoutWidget.raise_()
self.pref_themes.raise_()
self.themesList.raise_()
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Preferences"))
self.exit_button.setText(_translate("MainWindow", "X"))
self.min_button.setText(_translate("MainWindow", "-"))
self.pref_over.setText(_translate("MainWindow", "Overlay control"))
self.pref_over_el5.setText(_translate("MainWindow", "Overlay play sound"))
self.pref_over_el2.setText(_translate("MainWindow", "Overlay menu down"))
self.select_move_down.setText(_translate("MainWindow", "PushButton"))
self.select_move_right.setText(_translate("MainWindow", "PushButton"))
self.select_move_up.setText(_translate("MainWindow", "PushButton"))
self.pref_over_el3.setText(_translate("MainWindow", "Overlay menu left"))
self.stop_sound.setText(_translate("MainWindow", "PushButton"))
self.pref_over_el6.setText(_translate("MainWindow", "Overlay stop sound"))
self.pref_over_el4.setText(_translate("MainWindow", "Overlay menu right"))
self.select_move_left.setText(_translate("MainWindow", "PushButton"))
self.pref_over_el1.setText(_translate("MainWindow", "Overlay menu up"))
self.play_sound.setText(_translate("MainWindow", "PushButton"))
self.title.setText(_translate("MainWindow", "Preferences"))
self.pref_themes.setText(_translate("MainWindow", "Themes"))

View file

@ -1,211 +0,0 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'sundpood.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# 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_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(640, 480)
MainWindow.setMinimumSize(QtCore.QSize(640, 480))
MainWindow.setMaximumSize(QtCore.QSize(640, 480))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("icon.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
MainWindow.setStyleSheet("QWidget{\n"
" background: rgb(44, 44, 44); \n"
" font: 25 14pt \"Calibri Light\";\n"
"}\n"
"\n"
"QLabel{\n"
" background: none\n"
"}\n"
"\n"
"QPushButton{\n"
" background: rgb(58, 58, 58);\n"
" border: none;\n"
"}\n"
"\n"
"QPushButton:hover{\n"
" background: rgb(53, 53, 53);\n"
"}\n"
"\n"
"QListWidget{\n"
" margin: 4px;\n"
" border: none;\n"
"}\n"
"QListWidget::item[Custom=\"true\"]{\n"
" background: rgb(48, 48, 48);\n"
"}\n"
"QListWidget::item:hover{\n"
" background: rgb(53, 53, 53);\n"
"}\n"
"QListWidget::item:selected{\n"
" background: rgb(48, 48, 48);\n"
" color: black;\n"
"}\n"
"\n"
"QScrollBar:vertical{\n"
" border: 1px transparent rgb(58, 58, 58);\n"
" border-radius: 4px;\n"
" background: rgb(48, 48, 48);\n"
" width: 16px;\n"
"}\n"
"QScrollBar::handle:vertical{\n"
" background: rgb(48, 48, 48);\n"
"}\n"
"QScrollBar::sub-page:vertical{\n"
" background: rgb(58, 58, 58);\n"
"}\n"
"QScrollBar::add-page:vertical{\n"
" background: rgb(58, 58, 58);\n"
"}\n"
"\n"
"#background{\n"
" background:rgb(48, 48, 48);\n"
"}\n"
"\n"
"#exit_button{\n"
" margin-bottom: 1px;\n"
"}\n"
"#exit_button:hover{\n"
" color: black;\n"
" background: rgba(254, 119, 122, 128);\n"
"}\n"
"\n"
"#min_button{\n"
" margin-bottom: 1px;\n"
"}\n"
"#min_button:hover{\n"
" color: black;\n"
" background: rgba(194, 213, 254, 128);\n"
"}\n"
"\n"
"#pref_button{\n"
" margin-bottom: 1px;\n"
"}\n"
"#pref_button:hover{\n"
" color: black;\n"
" background: rgba(194, 213, 254, 128);\n"
"}\n"
"\n"
"#hotkeys_button{\n"
" margin-bottom: 1px;\n"
"}\n"
"#hotkeys_button:hover{\n"
" color: black;\n"
" background: rgba(194, 213, 254, 128);\n"
"}\n"
"\n"
"#select_label{\n"
" background: black;\n"
" color: white;\n"
"}\n"
"\n"
"#catList::item{\n"
" padding: 6px;\n"
"}\n"
"\n"
"QSlider::groove:horizontal {\n"
" border: none;\n"
" height: 40px;\n"
" margin: 0px;\n"
"}\n"
"QSlider::handle:horizontal {\n"
" background-color: rgb(53, 53, 53);\n"
" border: none;\n"
" height: 40px;\n"
" width: 40px;\n"
" margin: -15px 0px;\n"
"}\n"
"QSlider::sub-page:horizontal {\n"
" border: none;\n"
" height: 40px;\n"
" margin: 1px;\n"
" background: rgb(63, 63, 63);\n"
"}")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.background = QtWidgets.QWidget(self.centralwidget)
self.background.setGeometry(QtCore.QRect(0, 0, 641, 481))
self.background.setStyleSheet("")
self.background.setObjectName("background")
self.min_button = QtWidgets.QPushButton(self.background)
self.min_button.setGeometry(QtCore.QRect(560, 0, 41, 31))
self.min_button.setStyleSheet("")
self.min_button.setObjectName("min_button")
self.exit_button = QtWidgets.QPushButton(self.background)
self.exit_button.setGeometry(QtCore.QRect(600, 0, 41, 31))
self.exit_button.setStyleSheet("")
self.exit_button.setObjectName("exit_button")
self.pref_button = QtWidgets.QPushButton(self.background)
self.pref_button.setGeometry(QtCore.QRect(0, 0, 111, 31))
self.pref_button.setObjectName("pref_button")
self.hotkeys_button = QtWidgets.QPushButton(self.background)
self.hotkeys_button.setGeometry(QtCore.QRect(110, 0, 111, 31))
self.hotkeys_button.setObjectName("hotkeys_button")
self.stop_button = QtWidgets.QPushButton(self.background)
self.stop_button.setGeometry(QtCore.QRect(0, 120, 171, 41))
self.stop_button.setObjectName("stop_button")
self.hkset = QtWidgets.QPushButton(self.background)
self.hkset.setGeometry(QtCore.QRect(0, 200, 171, 41))
self.hkset.setObjectName("hkset")
self.soundList = QtWidgets.QListWidget(self.background)
self.soundList.setGeometry(QtCore.QRect(170, 60, 471, 421))
self.soundList.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.soundList.setFrameShadow(QtWidgets.QFrame.Raised)
self.soundList.setObjectName("soundList")
self.catList = QtWidgets.QListWidget(self.background)
self.catList.setGeometry(QtCore.QRect(0, 280, 171, 201))
self.catList.setStyleSheet("")
self.catList.setObjectName("catList")
self.cat_label = QtWidgets.QLabel(self.background)
self.cat_label.setGeometry(QtCore.QRect(6, 253, 161, 31))
font = QtGui.QFont()
font.setFamily("Calibri Light")
font.setPointSize(14)
font.setBold(False)
font.setItalic(False)
font.setWeight(3)
self.cat_label.setFont(font)
self.cat_label.setAlignment(QtCore.Qt.AlignCenter)
self.cat_label.setObjectName("cat_label")
self.volume_slider = QtWidgets.QSlider(self.background)
self.volume_slider.setGeometry(QtCore.QRect(10, 170, 151, 20))
self.volume_slider.setMaximum(100)
self.volume_slider.setProperty("value", 70)
self.volume_slider.setOrientation(QtCore.Qt.Horizontal)
self.volume_slider.setObjectName("volume_slider")
self.play_button = QtWidgets.QPushButton(self.centralwidget)
self.play_button.setGeometry(QtCore.QRect(0, 70, 171, 41))
self.play_button.setObjectName("play_button")
self.select_label = QtWidgets.QLabel(self.centralwidget)
self.select_label.setGeometry(QtCore.QRect(0, 30, 641, 31))
self.select_label.setStyleSheet("")
self.select_label.setText("")
self.select_label.setAlignment(QtCore.Qt.AlignCenter)
self.select_label.setObjectName("select_label")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.min_button.setText(_translate("MainWindow", "-"))
self.exit_button.setText(_translate("MainWindow", "X"))
self.pref_button.setText(_translate("MainWindow", "Settings"))
self.hotkeys_button.setText(_translate("MainWindow", "Hotkeys"))
self.stop_button.setText(_translate("MainWindow", "Stop"))
self.hkset.setText(_translate("MainWindow", "Set hotkey"))
self.cat_label.setText(_translate("MainWindow", "Categories"))
self.play_button.setText(_translate("MainWindow", "Play"))

BIN
icon.ico

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 158 KiB

View file

@ -1,4 +1,3 @@
forbidden = [
'Key.esc', 'Key.cmd', 'Key.cmd_r', 'Key.menu',
'Key.pause', 'Key.scroll_lock', 'Key.print_screen',
@ -6,11 +5,10 @@ forbidden = [
'Key.ctrl_r', 'Key.alt_l', 'Key.alt_gr', 'Key.caps_lock',
'Key.num_lock', 'Key.tab', 'Key.shift', 'Key.shift_r',
'Key.insert', 'Key.delete', 'Key.home', 'Key.end',
'Key.page_up', 'Key.page_down', '/'
'Key.page_up', 'Key.page_down',
]
dict_ = {
' ':' ',
'Key.f1' : 'F1',
'Key.f2' : 'F2',
'Key.f3' : 'F3',
@ -34,9 +32,5 @@ dict_ = {
'<104>' : 'Num 8',
'<105>' : 'Num 9',
'<110>' : 'Num .',
'Key.up' : 'Up',
'Key.down' : 'Down',
'Key.left' : 'Left',
'Key.right' : 'Right',
'\\\\' : '\\'
}

View file

@ -1,33 +0,0 @@
import os
from cryptography.fernet import Fernet
import key
### Добавь здесь модули нужные твоей программе ###
import pygame
import sounddevice as sd
from pynput.keyboard import Listener
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtCore import QFile, QTextStream
from PyQt5.QtWidgets import QApplication
from data import ui_preferences
from data import ui_hotkeys
from data import ui_sundpood
from data import ui_overlay
from data import keys
### ^^^ ^^^ ###
def decrypt(filename, key):
# Расшифруем файл и записываем его
f = Fernet(key)
with open(filename, 'rb') as file:
encrypted_data = file.read()
decrypted_data = f.decrypt(encrypted_data)
return decrypted_data.decode('utf-8')
if os.path.exists(os.path.join('data', 'main.py')):
with open(os.path.join('data', 'main.py'), 'r', encoding='utf-8') as f:
exec(f.read())
else:
exec(decrypt(os.path.join('data', 'sundpood-runtime.sr') , key.KEY))

439
main.py Normal file
View file

@ -0,0 +1,439 @@
import os
import sys
import json
import threading
import soundfile as sf
import sounddevice as sd
from pynput.keyboard import Listener
from PyQt5 import QtWidgets, QtGui, QtCore
import ui_preferences
import ui_sundpood
import ui_overlay
import keys
###! UI !###
class OverlayUi(QtWidgets.QMainWindow, ui_overlay.Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
def keyPressEvent(self, e):
if e.key() == QtCore.Qt.Key_F1:
self.hide()
win.show()
class PreferencesUi(QtWidgets.QMainWindow, ui_preferences.Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
class MainUi(QtWidgets.QMainWindow, ui_sundpood.Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
def keyPressEvent(self, e):
if e.key() == QtCore.Qt.Key_F1:
pref.close()
self.hide()
over.show()
def closeEvent(self, event):
pref.close()
###! JSON !###
def jsonread(file): ## Чтение JSON
with open(file, "r", encoding='utf-8') as read_file:
data = json.load(read_file)
return data
def jsonwrite(file, data): ## Запись JSON
with open(file, 'w', encoding='utf-8') as write_file:
write_file.write(json.dumps(data))
###! FUNCTIONS !###
def find_device(list_): # Поиск микшера VoiceMeeter
msg = QtWidgets.QMessageBox()
msg.setIcon(QtWidgets.QMessageBox.Critical)
msg.setText("You don't install VoiceMeeter")
msg.setInformativeText('install VoiceMetter from "redist" folder or download it from \nvb-audio.com/Voicemeeter')
msg.setWindowTitle('Error')
index = 0
device = 'VoiceMeeter Input'
found = False
for i in list_:
if device not in i['name']:
index += 1
elif device in i['name']:
found = True
break
if found == False:
msg.exec_()
exit()
return index
def sound_get(): # Сбор файлов
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_
if os.path.exists('ffmpeg.exe'):
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')
ffmsg = QtWidgets.QMessageBox()
ffmsg.setIcon(QtWidgets.QMessageBox.Warning)
ffmsg.setText("You don't have ffmpeg.exe in the program root folder")
ffmsg.setInformativeText('download ffmpeg from ffmpeg.org for converting sound files')
ffmsg.setWindowTitle('Error')
if os.path.exists('sound'):
if len(os.listdir('sound')) == 0:
msg.exec_()
menu = []
sounds_list = ['sound\\']
for i in os.listdir('sound'):
if os.path.exists('ffmpeg.exe') or not ffmsg:
if os.path.isfile(os.path.join('sound', i)):
name = sound_convert('sound', i, 'wav')
if name == None:
sounds_list.append(i)
else:
sounds_list.append(name)
else:
sounds_list_cat = [os.path.join('sound', i)]
for x in os.listdir(os.path.join('sound', i)):
if os.path.isfile(os.path.join('sound', i, x)):
name = sound_convert(os.path.join('sound', i), x, 'wav')
if name == None:
sounds_list_cat.append(x)
else:
sounds_list_cat.append(name)
menu.append(sounds_list_cat)
else:
print('else')
try:
ffmsg.exec_()
ffmsg = False
except AttributeError:
pass
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']
KEYS_CMD = jsonread('settings.json')['KEYS_CMD']
sounds_list = { 'sounds':sounds,
'hotkeys':hotkeys,
'menu':menu,
'KEYS_CMD':KEYS_CMD}
else:
sounds_list = { 'sounds':sounds,
'hotkeys':{'Push button':''},
'menu':menu,
'KEYS_CMD':{
'select_move_up' :' ',# вверх
'select_move_down' :' ',# вниз
'select_move_left' :' ',# влево
'select_move_right' :' ',# вправо
'play_sound' :' ',# Играть
'stop_sound' :' ',# Остановить
}}
for i in COMBOS:
i.addItems(sounds)
jsonwrite('settings.json', sounds_list)
else:
sounds_list = { 'sounds':'',
'hotkeys':{'Push button':''},
'menu':'',
'KEYS_CMD':{
'select_move_up' :' ',# вверх
'select_move_down' :' ',# вниз
'select_move_left' :' ',# влево
'select_move_right' :' ',# вправо
'play_sound' :' ',# Играть
'stop_sound' :' ',# Остановить
}}
jsonwrite('settings.json', sounds_list)
os.mkdir('sound')
msg.exec_()
def save(): # Сохранение списка хоткеев
hotkeys = {}
sounds = jsonread('settings.json')['sounds']
for i in range(len(COMBOS)):
hotkeys.setdefault(HOTKEYS[i].text(), COMBOS[i].currentText())
KEYS_JSON = {}
for i in KEYS_CMD.keys():
KEYS_JSON.setdefault(COMMAND_DICT[i], KEYS_CMD[i])
sounds_list = {'sounds':sounds, 'hotkeys':hotkeys, 'menu':menu, 'KEYS_CMD':KEYS_JSON}
jsonwrite('settings.json', sounds_list)
KEYS_JSON = None
hotkeys = None
sounds = None
def play_sound(index): # Проигрываение звука
try:
filename = COMBOS[index].currentText()
try:
data, fs = sf.read(os.path.join('sound', filename), dtype='float32')
sd.play(data, fs)
except:
pass
except:
filename = menu[select[0]][select[1]]
try:
data, fs = sf.read(os.path.join(menu[select[0]][0], filename), dtype='float32')
sd.play(data, fs)
except:
pass
def hotkey_remap(btn): # Переназначение хоткеев
def check(key):
button = HOTKEYS[btn]
key = str(key).replace("'",'')
if key not in keys.forbidden:
HOTKEYS_CMD[HOTKEYS_CMD.index(button.text())] = keys.dict_[key]
button.setText(keys.dict_[key])
elif key == 'Key.backspace':
HOTKEYS_CMD[HOTKEYS_CMD.index(button.text())] = ' '
button.setText(' ')
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()
def pref_remap(btn, func_):
def check(key):
key = str(key).replace("'",'')
if key not in keys.forbidden:
func = find_key(COMMAND_DICT, func_)
KEYS_CMD.update({func : key})
btn.setText(keys.dict_[key])
elif key == 'Key.backspace':
func = find_key(COMMAND_DICT, func_)
KEYS_CMD.update({func : ' '})
btn.setText(' ')
for i in PREF_BTN:
i.setEnabled(True)
return False
for i in PREF_BTN:
i.setEnabled(False)
hotkey_remap_Listener = Listener(
on_release=check)
hotkey_remap_Listener.start()
save()
def find_key(dict, val):
return next(key for key, value in dict.items() if value == val)
###! CONTROL !###
def select_move(mode):
select[1] += mode[1]
select[0] += mode[0]
if select[0] > len(menu)-1 or select[0] < -len(menu)+1:
select[0] = 0
if select[1] > len(menu[select[0]])-1 or select[1] < -len(menu[select[0]])+1:
select[1] = 0
if mode[0] != 0:
select[1] = 0
over.label.setText(menu[select[0]][select[1]])
win.select_label.setText(menu[select[0]][select[1]])
def key_check(key): # Хоткеи
key_n = ''
key = str(key).replace("'",'')
try:
key_n = keys.dict_[key]
except KeyError:
pass
print(f'{key_n} in {HOTKEYS_CMD} -- {key_n in HOTKEYS_CMD}')
if key_n in HOTKEYS_CMD:
play_sound(HOTKEYS_CMD.index(key_n))
elif key in KEYS_CMD.values():
find_key(KEYS_CMD, key)()
def main(): # Интерфейс
win.show()
key_check_Listener = Listener(
on_release=key_check)
key_check_Listener.start()
win.save_button.clicked.connect(save)
win.actionpreferences.triggered.connect(pref.show)
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))
win.hotkey_4.clicked.connect(lambda: hotkey_remap(3))
win.hotkey_5.clicked.connect(lambda: hotkey_remap(4))
win.hotkey_6.clicked.connect(lambda: hotkey_remap(5))
win.hotkey_7.clicked.connect(lambda: hotkey_remap(6))
win.hotkey_8.clicked.connect(lambda: hotkey_remap(7))
win.hotkey_9.clicked.connect(lambda: hotkey_remap(8))
win.hotkey_10.clicked.connect(lambda: hotkey_remap(9))
win.hotkey_11.clicked.connect(lambda: hotkey_remap(10))
win.hotkey_12.clicked.connect(lambda: hotkey_remap(11))
pref.play_sound.clicked.connect(
lambda: pref_remap(pref.play_sound, 'play_sound'))
pref.stop_sound.clicked.connect(
lambda: pref_remap(pref.stop_sound, 'stop_sound'))
pref.select_move_up.clicked.connect(
lambda: pref_remap(pref.select_move_up, 'select_move_up'))
pref.select_move_down.clicked.connect(
lambda: pref_remap(pref.select_move_down, 'select_move_down'))
pref.select_move_left.clicked.connect(
lambda: pref_remap(pref.select_move_left, 'select_move_left'))
pref.select_move_right.clicked.connect(
lambda: pref_remap(pref.select_move_right, 'select_move_right'))
if __name__ == '__main__':
### Создание окна ###
app = QtWidgets.QApplication([])
over = OverlayUi()
pref = PreferencesUi()
win = MainUi()
COMBOS = [
win.combo0,
win.combo1,
win.combo2,
win.combo3,
win.combo4,
win.combo5,
win.combo6,
win.combo7,
win.combo8,
win.combo9,
win.combo10,
win.combo11,]
HOTKEYS = [
win.hotkey_1,
win.hotkey_2,
win.hotkey_3,
win.hotkey_4,
win.hotkey_5,
win.hotkey_6,
win.hotkey_7,
win.hotkey_8,
win.hotkey_9,
win.hotkey_10,
win.hotkey_11,
win.hotkey_12,]
PREF_BTN = [
pref.select_move_up,
pref.select_move_down,
pref.select_move_left,
pref.select_move_right,
pref.play_sound,
pref.stop_sound,]
### Поиск устроства ввода ###
list_ = list(sd.query_devices())
index = find_device(list_)
sd.default.device = list_[index]['name']
sound_get()
### Глобальные переменные ###
sound_get_dict = jsonread('settings.json')
hotkeys = sound_get_dict['hotkeys']
menu = sound_get_dict['menu']
select = [0, 0]
COMMAND_DICT = {
lambda: select_move([0, -1]):'select_move_up', # вверх
lambda: select_move([0, 1]) :'select_move_down', # вниз
lambda: select_move([-1, 0]):'select_move_left', # влево
lambda: select_move([1, 0]) :'select_move_right', # вправо
lambda: play_sound('') :'play_sound', # Играть
lambda: sd.stop() :'stop_sound', # Остановить
}
KEYS_CMD = COMMAND_DICT.copy()
KEYS_JSON = sound_get_dict['KEYS_CMD']
for i in KEYS_CMD.keys():
KEYS_CMD.update({i:KEYS_JSON[COMMAND_DICT[i]]})
KEYS_JSON = None
combo = 0
for i in KEYS_CMD.values():
PREF_BTN[combo].setText(keys.dict_[i])
combo += 1
combo = 0
for i in hotkeys.items():
index = COMBOS[combo].findText(i[1])
COMBOS[combo].setCurrentIndex(index)
HOTKEYS[combo].setText(i[0])
combo += 1
combo = None
HOTKEYS_CMD = [
HOTKEYS[0].text(),
HOTKEYS[1].text(),
HOTKEYS[2].text(),
HOTKEYS[3].text(),
HOTKEYS[4].text(),
HOTKEYS[5].text(),
HOTKEYS[6].text(),
HOTKEYS[7].text(),
HOTKEYS[8].text(),
HOTKEYS[9].text(),
HOTKEYS[10].text(),
HOTKEYS[11].text(),]
main()
sys.exit(app.exec())

Binary file not shown.

Before

Width:  |  Height:  |  Size: 331 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 356 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

View file

@ -1,4 +1,3 @@
PyQt5
pynput==1.6.8
sounddevice
pygame

View file

@ -1,55 +0,0 @@
#background{
background:rgb(48, 48, 48);
}
QWidget{
background: rgb(44, 44, 44);
font: 25 14pt "Calibri Light";
}
QPushButton{
background: rgb(58, 58, 58);
border: none;
}
QPushButton:hover{
background: rgb(53, 53, 53);
}
QListWidget{
margin: 4px;
border: none;
}
QListWidget::item[Custom="true"]{
background: rgb(48, 48, 48);
}
QListWidget::item:hover{
background: rgb(53, 53, 53);
}
QListWidget::item:selected{
background: rgb(48, 48, 48);
color: black;
}
QScrollBar:vertical{
border: 1px transparent rgb(58, 58, 58);
border-radius: 4px;
background: rgb(48, 48, 48);
width: 16px;
}
QScrollBar::handle:vertical{
background: rgb(48, 48, 48);
}
QScrollBar::sub-page:vertical{
background: rgb(58, 58, 58);
}
QScrollBar::add-page:vertical{
background: rgb(58, 58, 58);
}

View file

@ -1,54 +0,0 @@
#background{
background:rgb(248, 248, 248);
}
QWidget{
background: white;
font: 25 14pt "Calibri Light";
}
QPushButton{
background: #eee;
border: none;
}
QPushButton:hover{
background: #f4f4f4;
}
QListWidget{
margin: 4px;
border: none;
}
QListWidget::item[Custom="true"]{
background: #eee;
}
QListWidget::item:hover{
background: #f4f4f4;
}
QListWidget::item:selected{
background: #eee;
color: black;
}
QScrollBar:vertical{
border: 1px transparent #eee;
border-radius: 4px;
background: #eaeaea;
width: 16px;
}
QScrollBar::handle:vertical{
background: #eee;
}
QScrollBar::sub-page:vertical{
background: #f8f8f8;
}
QScrollBar::add-page:vertical{
background: #f8f8f8;
}

View file

@ -1,120 +0,0 @@
QWidget{
background: rgb(70, 54, 80);
font: 25 14pt \"Calibri Light\";
}
QLabel{
background: none;
}
QPushButton{
color: rgb(35, 17, 22);
background: rgb(237, 120, 153);
border: none;
}
QPushButton:hover{
background: rgb(182, 92, 118);
}
QListWidget{
margin: 4px;
border: none;
}
QListWidget::item[Custom=\"true\"]{
background: rgb(48, 48, 48);
}
QListWidget::item:hover{
background: rgb(182, 92, 118);
}
QListWidget::item:selected{
background: rgb(47, 41, 50);
color: white;
}
QScrollBar:vertical{
border: 1px transparent rgb(237, 120, 153);
border-radius: 4px;
background: rgb(48, 48, 48);
width: 16px;
}
QScrollBar::handle:vertical{
background: rgb(48, 48, 48);
}
QScrollBar::sub-page:vertical{
background: rgb(188, 87, 116);
}
QScrollBar::add-page:vertical{
background: rgb(99, 70, 114);
}
QSlider::groove:horizontal {
border: none;
background: none;
height: 40px;
margin: -1px;
}
QSlider::handle:horizontal {
background-color: rgb(237, 120, 153);
border: none;
height: 40px;
width: 40px;
margin: -15px 0px;
}
QSlider::sub-page:horizontal {
border: none;
height: 40px;
background: rgb(188, 87, 116);
}
QSlider::add-page:horizontal {
border: none;
height: 40px;
background: rgb(99, 70, 114);
}
#background{
background: rgb(146, 111, 163);
}
#exit_button{
margin-bottom: 1px;
}
#min_button{
margin-bottom: 1px;
}
#pref_button{
background: none;
margin-bottom: 1px;
}
#pref_button:hover{
background: rgba(70, 54, 80, 128);
}
#hotkeys_button{
background: none;
margin-bottom: 1px;
}
#hotkeys_button:hover{
background: rgba(70, 54, 80, 128);
}
#select_label{
background: rgb(32, 25, 36);
color: rgb(237, 120, 153);
}
#catList::item{
padding: 6px;
}
#title{
color: rgb(237, 120, 153);
}
#pref_over{
color: rgb(237, 120, 153);
}
#pref_themes{
color: rgb(237, 120, 153);
}

View file

@ -14,22 +14,22 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(300, 30)
MainWindow.setMinimumSize(QtCore.QSize(300, 30))
MainWindow.setMaximumSize(QtCore.QSize(300, 30))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("icon.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.resize(250, 20)
MainWindow.setMinimumSize(QtCore.QSize(250, 20))
MainWindow.setMaximumSize(QtCore.QSize(250, 20))
MainWindow.setGeometry(QtCore.QRect(0, 0, 250, 20))
MainWindow.setWindowFlags(QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint)
icon = QtGui.QIcon.fromTheme("icon.ico")
MainWindow.setWindowIcon(icon)
MainWindow.setWindowOpacity(0.5)
MainWindow.setToolTipDuration(5)
MainWindow.setStyleSheet("\n"
"font: 75 14pt \"Calibri\";\n"
"color: white;\n"
"background-color: black;")
MainWindow.setStyleSheet("background-color: black;\n"
"color: white;")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(0, 0, 301, 31))
self.label.setGeometry(QtCore.QRect(0, 0, 251, 21))
self.label.setText("")
self.label.setObjectName("label")
MainWindow.setCentralWidget(self.centralwidget)
@ -38,5 +38,4 @@ class Ui_MainWindow(object):
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", ""))
MainWindow.setWindowTitle(_translate(" ", " "))

104
ui_preferences.py Normal file
View file

@ -0,0 +1,104 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'preferences.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# 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_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(420, 468)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
MainWindow.setMinimumSize(QtCore.QSize(420, 468))
MainWindow.setMaximumSize(QtCore.QSize(420, 468))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("icon.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setGeometry(QtCore.QRect(0, 0, 421, 461))
self.tabWidget.setObjectName("tabWidget")
self.Keys = QtWidgets.QWidget()
self.Keys.setObjectName("Keys")
self.gridLayoutWidget = QtWidgets.QWidget(self.Keys)
self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 391, 271))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setHorizontalSpacing(6)
self.gridLayout.setObjectName("gridLayout")
self.label = QtWidgets.QLabel(self.gridLayoutWidget)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.select_move_down = QtWidgets.QPushButton(self.gridLayoutWidget)
self.select_move_down.setObjectName("select_move_down")
self.gridLayout.addWidget(self.select_move_down, 1, 1, 1, 1)
self.label_2 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
self.label_5 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_5.setObjectName("label_5")
self.gridLayout.addWidget(self.label_5, 4, 0, 1, 1)
self.select_move_up = QtWidgets.QPushButton(self.gridLayoutWidget)
self.select_move_up.setObjectName("select_move_up")
self.gridLayout.addWidget(self.select_move_up, 0, 1, 1, 1)
self.label_4 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_4.setObjectName("label_4")
self.gridLayout.addWidget(self.label_4, 3, 0, 1, 1)
self.label_3 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
self.label_6 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_6.setObjectName("label_6")
self.gridLayout.addWidget(self.label_6, 5, 0, 1, 1)
self.select_move_left = QtWidgets.QPushButton(self.gridLayoutWidget)
self.select_move_left.setObjectName("select_move_left")
self.gridLayout.addWidget(self.select_move_left, 2, 1, 1, 1)
self.select_move_right = QtWidgets.QPushButton(self.gridLayoutWidget)
self.select_move_right.setObjectName("select_move_right")
self.gridLayout.addWidget(self.select_move_right, 3, 1, 1, 1)
self.play_sound = QtWidgets.QPushButton(self.gridLayoutWidget)
self.play_sound.setObjectName("play_sound")
self.gridLayout.addWidget(self.play_sound, 4, 1, 1, 1)
self.stop_sound = QtWidgets.QPushButton(self.gridLayoutWidget)
self.stop_sound.setObjectName("stop_sound")
self.gridLayout.addWidget(self.stop_sound, 5, 1, 1, 1)
self.tabWidget.addTab(self.Keys, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.tabWidget.addTab(self.tab_2, "")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "Overlay menu up"))
self.select_move_down.setText(_translate("MainWindow", "PushButton"))
self.label_2.setText(_translate("MainWindow", "Overlay menu down"))
self.label_5.setText(_translate("MainWindow", "Overlay play sound"))
self.select_move_up.setText(_translate("MainWindow", "PushButton"))
self.label_4.setText(_translate("MainWindow", "Overlay menu right"))
self.label_3.setText(_translate("MainWindow", "Overlay menu left"))
self.label_6.setText(_translate("MainWindow", "Overlay stop sound"))
self.select_move_left.setText(_translate("MainWindow", "PushButton"))
self.select_move_right.setText(_translate("MainWindow", "PushButton"))
self.play_sound.setText(_translate("MainWindow", "PushButton"))
self.stop_sound.setText(_translate("MainWindow", "PushButton"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.Keys), _translate("MainWindow", "Tab 1"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2"))

315
ui_sundpood.py Normal file
View file

@ -0,0 +1,315 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'sundpood.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# 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_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(420, 450)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
MainWindow.setMinimumSize(QtCore.QSize(420, 450))
MainWindow.setMaximumSize(QtCore.QSize(420, 450))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("icon.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
MainWindow.setStyleSheet("/*background-color: #303030;*/\n"
"\n"
"QComboBox::drop-down {\n"
" border: 1px solid #D3D3D3;\n"
" border-radius: 2px;\n"
" background-color: #303030;\n"
"} \n"
"\n"
"QComboBox QAbstractItemView{\n"
" background-color: #4f4f4f;\n"
" color: #999999;\n"
" \n"
" selection-background-color: #999999;\n"
" selection-color: #4f4f4f;\n"
"}")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setEnabled(True)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth())
self.centralwidget.setSizePolicy(sizePolicy)
self.centralwidget.setMinimumSize(QtCore.QSize(420, 450))
self.centralwidget.setMaximumSize(QtCore.QSize(420, 450))
self.centralwidget.setStyleSheet("background-color: #303030")
self.centralwidget.setObjectName("centralwidget")
self.save_button = QtWidgets.QPushButton(self.centralwidget)
self.save_button.setGeometry(QtCore.QRect(10, 360, 401, 71))
font = QtGui.QFont()
font.setFamily("Consolas")
font.setPointSize(28)
font.setBold(False)
font.setWeight(50)
font.setStrikeOut(False)
font.setKerning(False)
self.save_button.setFont(font)
self.save_button.setStyleSheet("background-color: #323031;\n"
"color: #6b696a;")
self.save_button.setDefault(False)
self.save_button.setFlat(False)
self.save_button.setObjectName("save_button")
self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
self.verticalLayoutWidget.setGeometry(QtCore.QRect(110, 10, 301, 321))
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.combo0 = QtWidgets.QComboBox(self.verticalLayoutWidget)
self.combo0.setTabletTracking(False)
self.combo0.setAcceptDrops(False)
self.combo0.setAutoFillBackground(False)
self.combo0.setStyleSheet("background-color: #393738;\n"
"color:#6b696a;")
self.combo0.setDuplicatesEnabled(False)
self.combo0.setFrame(False)
self.combo0.setObjectName("combo0")
self.verticalLayout.addWidget(self.combo0)
self.combo1 = QtWidgets.QComboBox(self.verticalLayoutWidget)
self.combo1.setTabletTracking(False)
self.combo1.setAcceptDrops(False)
self.combo1.setAutoFillBackground(False)
self.combo1.setStyleSheet("background-color: #393738;\n"
"color:#6b696a;")
self.combo1.setDuplicatesEnabled(False)
self.combo1.setFrame(False)
self.combo1.setModelColumn(0)
self.combo1.setObjectName("combo1")
self.verticalLayout.addWidget(self.combo1)
self.combo2 = QtWidgets.QComboBox(self.verticalLayoutWidget)
self.combo2.setTabletTracking(False)
self.combo2.setAcceptDrops(False)
self.combo2.setAutoFillBackground(False)
self.combo2.setStyleSheet("background-color: #393738;\n"
"color:#6b696a;")
self.combo2.setDuplicatesEnabled(False)
self.combo2.setFrame(False)
self.combo2.setObjectName("combo2")
self.verticalLayout.addWidget(self.combo2)
self.combo3 = QtWidgets.QComboBox(self.verticalLayoutWidget)
self.combo3.setTabletTracking(False)
self.combo3.setAcceptDrops(False)
self.combo3.setAutoFillBackground(False)
self.combo3.setStyleSheet("background-color: #393738;\n"
"color:#6b696a;")
self.combo3.setDuplicatesEnabled(False)
self.combo3.setFrame(False)
self.combo3.setObjectName("combo3")
self.verticalLayout.addWidget(self.combo3)
self.combo4 = QtWidgets.QComboBox(self.verticalLayoutWidget)
self.combo4.setTabletTracking(False)
self.combo4.setAcceptDrops(False)
self.combo4.setAutoFillBackground(False)
self.combo4.setStyleSheet("background-color: #393738;\n"
"color:#6b696a;")
self.combo4.setDuplicatesEnabled(False)
self.combo4.setFrame(False)
self.combo4.setObjectName("combo4")
self.verticalLayout.addWidget(self.combo4)
self.combo5 = QtWidgets.QComboBox(self.verticalLayoutWidget)
self.combo5.setTabletTracking(False)
self.combo5.setAcceptDrops(False)
self.combo5.setAutoFillBackground(False)
self.combo5.setStyleSheet("background-color: #393738;\n"
"color:#6b696a;")
self.combo5.setDuplicatesEnabled(False)
self.combo5.setFrame(False)
self.combo5.setObjectName("combo5")
self.verticalLayout.addWidget(self.combo5)
self.combo6 = QtWidgets.QComboBox(self.verticalLayoutWidget)
self.combo6.setTabletTracking(False)
self.combo6.setAcceptDrops(False)
self.combo6.setAutoFillBackground(False)
self.combo6.setStyleSheet("background-color: #393738;\n"
"color:#6b696a;")
self.combo6.setDuplicatesEnabled(False)
self.combo6.setFrame(False)
self.combo6.setObjectName("combo6")
self.verticalLayout.addWidget(self.combo6)
self.combo7 = QtWidgets.QComboBox(self.verticalLayoutWidget)
self.combo7.setTabletTracking(False)
self.combo7.setAcceptDrops(False)
self.combo7.setAutoFillBackground(False)
self.combo7.setStyleSheet("background-color: #393738;\n"
"color:#6b696a;")
self.combo7.setDuplicatesEnabled(False)
self.combo7.setFrame(False)
self.combo7.setObjectName("combo7")
self.verticalLayout.addWidget(self.combo7)
self.combo8 = QtWidgets.QComboBox(self.verticalLayoutWidget)
self.combo8.setTabletTracking(False)
self.combo8.setAcceptDrops(False)
self.combo8.setAutoFillBackground(False)
self.combo8.setStyleSheet("background-color: #393738;\n"
"color:#6b696a;")
self.combo8.setDuplicatesEnabled(False)
self.combo8.setFrame(False)
self.combo8.setObjectName("combo8")
self.verticalLayout.addWidget(self.combo8)
self.combo9 = QtWidgets.QComboBox(self.verticalLayoutWidget)
self.combo9.setTabletTracking(False)
self.combo9.setAcceptDrops(False)
self.combo9.setAutoFillBackground(False)
self.combo9.setStyleSheet("background-color: #393738;\n"
"color:#6b696a;")
self.combo9.setDuplicatesEnabled(False)
self.combo9.setFrame(False)
self.combo9.setObjectName("combo9")
self.verticalLayout.addWidget(self.combo9)
self.combo10 = QtWidgets.QComboBox(self.verticalLayoutWidget)
self.combo10.setTabletTracking(False)
self.combo10.setAcceptDrops(False)
self.combo10.setAutoFillBackground(False)
self.combo10.setStyleSheet("background-color: #393738;\n"
"color:#6b696a;")
self.combo10.setDuplicatesEnabled(False)
self.combo10.setFrame(False)
self.combo10.setObjectName("combo10")
self.verticalLayout.addWidget(self.combo10)
self.combo11 = QtWidgets.QComboBox(self.verticalLayoutWidget)
self.combo11.setTabletTracking(False)
self.combo11.setAcceptDrops(False)
self.combo11.setAutoFillBackground(False)
self.combo11.setStyleSheet("background-color: #393738;\n"
"color:#6b696a;")
self.combo11.setDuplicatesEnabled(False)
self.combo11.setFrame(False)
self.combo11.setObjectName("combo11")
self.verticalLayout.addWidget(self.combo11)
self.verticalLayoutWidget_2 = QtWidgets.QWidget(self.centralwidget)
self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(10, 10, 91, 311))
self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.hotkey_1 = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
self.hotkey_1.setLayoutDirection(QtCore.Qt.LeftToRight)
self.hotkey_1.setStyleSheet("text-align: right;\n"
" color: #6b696a;")
self.hotkey_1.setFlat(True)
self.hotkey_1.setObjectName("hotkey_1")
self.verticalLayout_2.addWidget(self.hotkey_1)
self.hotkey_2 = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
self.hotkey_2.setStyleSheet("text-align: right;\n"
" color: #6b696a;")
self.hotkey_2.setFlat(True)
self.hotkey_2.setObjectName("hotkey_2")
self.verticalLayout_2.addWidget(self.hotkey_2)
self.hotkey_3 = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
self.hotkey_3.setStyleSheet("text-align: right;\n"
" color: #6b696a;")
self.hotkey_3.setFlat(True)
self.hotkey_3.setObjectName("hotkey_3")
self.verticalLayout_2.addWidget(self.hotkey_3)
self.hotkey_4 = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
self.hotkey_4.setStyleSheet("text-align: right;\n"
" color: #6b696a;")
self.hotkey_4.setFlat(True)
self.hotkey_4.setObjectName("hotkey_4")
self.verticalLayout_2.addWidget(self.hotkey_4)
self.hotkey_5 = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
self.hotkey_5.setStyleSheet("text-align: right;\n"
" color: #6b696a;")
self.hotkey_5.setFlat(True)
self.hotkey_5.setObjectName("hotkey_5")
self.verticalLayout_2.addWidget(self.hotkey_5)
self.hotkey_6 = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
self.hotkey_6.setStyleSheet("text-align: right;\n"
" color: #6b696a;")
self.hotkey_6.setFlat(True)
self.hotkey_6.setObjectName("hotkey_6")
self.verticalLayout_2.addWidget(self.hotkey_6)
self.hotkey_7 = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
self.hotkey_7.setStyleSheet("text-align: right;\n"
" color: #6b696a;")
self.hotkey_7.setFlat(True)
self.hotkey_7.setObjectName("hotkey_7")
self.verticalLayout_2.addWidget(self.hotkey_7)
self.hotkey_8 = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
self.hotkey_8.setStyleSheet("text-align: right;\n"
" color: #6b696a;")
self.hotkey_8.setFlat(True)
self.hotkey_8.setObjectName("hotkey_8")
self.verticalLayout_2.addWidget(self.hotkey_8)
self.hotkey_9 = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
self.hotkey_9.setStyleSheet("text-align: right;\n"
" color: #6b696a;")
self.hotkey_9.setFlat(True)
self.hotkey_9.setObjectName("hotkey_9")
self.verticalLayout_2.addWidget(self.hotkey_9)
self.hotkey_10 = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
self.hotkey_10.setStyleSheet("text-align: right;\n"
" color: #6b696a;")
self.hotkey_10.setFlat(True)
self.hotkey_10.setObjectName("hotkey_10")
self.verticalLayout_2.addWidget(self.hotkey_10)
self.hotkey_11 = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
self.hotkey_11.setStyleSheet("text-align: right;\n"
" color: #6b696a;")
self.hotkey_11.setFlat(True)
self.hotkey_11.setObjectName("hotkey_11")
self.verticalLayout_2.addWidget(self.hotkey_11)
self.hotkey_12 = QtWidgets.QPushButton(self.verticalLayoutWidget_2)
self.hotkey_12.setStyleSheet("text-align: right;\n"
" color: #6b696a;")
self.hotkey_12.setFlat(True)
self.hotkey_12.setObjectName("hotkey_12")
self.verticalLayout_2.addWidget(self.hotkey_12)
self.info_label = QtWidgets.QLabel(self.centralwidget)
self.info_label.setGeometry(QtCore.QRect(10, 430, 401, 20))
font = QtGui.QFont()
font.setFamily("Consolas")
self.info_label.setFont(font)
self.info_label.setLayoutDirection(QtCore.Qt.LeftToRight)
self.info_label.setStyleSheet("color: #505050;")
self.info_label.setMidLineWidth(0)
self.info_label.setObjectName("info_label")
self.select_label = QtWidgets.QLabel(self.centralwidget)
self.select_label.setGeometry(QtCore.QRect(10, 320, 401, 41))
self.select_label.setLayoutDirection(QtCore.Qt.LeftToRight)
self.select_label.setStyleSheet("background-color: black;")
self.select_label.setText("")
self.select_label.setAlignment(QtCore.Qt.AlignCenter)
self.select_label.setObjectName("select_label")
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "SundPood"))
self.save_button.setText(_translate("MainWindow", "Save"))
self.hotkey_1.setText(_translate("MainWindow", "f1"))
self.hotkey_2.setText(_translate("MainWindow", "PushButton"))
self.hotkey_3.setText(_translate("MainWindow", "PushButton"))
self.hotkey_4.setText(_translate("MainWindow", "PushButton"))
self.hotkey_5.setText(_translate("MainWindow", "PushButton"))
self.hotkey_6.setText(_translate("MainWindow", "PushButton"))
self.hotkey_7.setText(_translate("MainWindow", "PushButton"))
self.hotkey_8.setText(_translate("MainWindow", "PushButton"))
self.hotkey_9.setText(_translate("MainWindow", "PushButton"))
self.hotkey_10.setText(_translate("MainWindow", "PushButton"))
self.hotkey_11.setText(_translate("MainWindow", "PushButton"))
self.hotkey_12.setText(_translate("MainWindow", "PushButton"))
self.info_label.setText(_translate("MainWindow", "Press F1 to open overlay"))