Initial Commit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
soundboards/*
|
||||
15
README.adoc
Normal file
15
README.adoc
Normal file
@@ -0,0 +1,15 @@
|
||||
:source-highlighter: highlight.js
|
||||
:highlightjs-languages: python, rust
|
||||
:toc: auto
|
||||
|
||||
= *CutieBoard*
|
||||
|
||||
A simple soundboard.
|
||||
|
||||
== *Immediate plans*:
|
||||
|
||||
* [ ] Tkinter interface.
|
||||
* [ ] VLC for audio playback.
|
||||
* [ ] Auto load sound files from boards.
|
||||
* [ ] Multi-board support.
|
||||
* [ ] Sound playback.
|
||||
113
src/main.py
Normal file
113
src/main.py
Normal file
@@ -0,0 +1,113 @@
|
||||
#!~/.pyenv/versions/3.11.6/bin/python
|
||||
#
|
||||
# Copyright (c) 2024 Cutieguwu | Olivia Brooks
|
||||
#
|
||||
# -*- coding: utf-8 -*-
|
||||
# @Title: CutieBoard
|
||||
# @Author: Cutieguwu | Olivia Brooks
|
||||
# @Description: Sound Board
|
||||
#
|
||||
# @Script: main.py
|
||||
# @Date Created: 18 Dec, 2024
|
||||
# @Last Modified: 18 Dec, 2024
|
||||
# @Last Modified by: Cutieguwu | Olivia Brooks
|
||||
# --------------------------------------------
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
|
||||
from dataclasses import dataclass
|
||||
from icecream import ic #type: ignore[import-untyped]
|
||||
import os
|
||||
from tkinter import Tk, LEFT, RIGHT
|
||||
from tkinter.ttk import Button
|
||||
from typing import *
|
||||
from vlc import MediaPlayer #type: ignore[import-untyped]
|
||||
|
||||
|
||||
DIR_BOARDS: str = os.path.dirname(__file__) + '/../soundboards/'
|
||||
BOARD_NAMES: list[str]= [x.name for x in os.scandir(DIR_BOARDS)]
|
||||
active_board:Optional[Board] = None
|
||||
|
||||
tk = Tk()
|
||||
boards: list[Board] = []
|
||||
|
||||
class MissingBoardError(Exception):
|
||||
def __init__(self) -> None:
|
||||
super().__init__('Unable to locate a soundboard.')
|
||||
|
||||
|
||||
@dataclass
|
||||
class Board:
|
||||
name:str
|
||||
|
||||
def __post_init__(self) -> None:
|
||||
global tk
|
||||
|
||||
self._path = DIR_BOARDS + self.name + '/'
|
||||
self._buttons: list[Button] = []
|
||||
self.button = Button(
|
||||
tk,
|
||||
text=self.name,
|
||||
command=self.set
|
||||
)
|
||||
|
||||
sounds: list[str] = [
|
||||
f for f in os.listdir(self._path)
|
||||
if os.path.isfile(self._path + f)
|
||||
]
|
||||
|
||||
for s in sounds:
|
||||
sound = Sound(s, self._path)
|
||||
self._buttons.append(Button(
|
||||
tk,
|
||||
text=s,
|
||||
command=sound.play
|
||||
))
|
||||
|
||||
ic(self._buttons)
|
||||
|
||||
def set(self) -> None:
|
||||
global active_board
|
||||
global boards
|
||||
|
||||
for b in boards:
|
||||
if self == active_board:
|
||||
b.unset()
|
||||
|
||||
active_board = self
|
||||
|
||||
for s in self._buttons:
|
||||
s.pack(side=RIGHT, padx=2, pady=2)
|
||||
|
||||
ic()
|
||||
|
||||
def unset(self) -> None:
|
||||
for b in self._buttons:
|
||||
b.pack_forget()
|
||||
|
||||
ic()
|
||||
|
||||
|
||||
@dataclass
|
||||
class Sound:
|
||||
name:str
|
||||
board_path:str
|
||||
|
||||
def __post_init__(self) -> None:
|
||||
self._media_player = MediaPlayer(self.board_path + self.name)
|
||||
|
||||
def play(self) -> None:
|
||||
self._media_player.play()
|
||||
|
||||
|
||||
if BOARD_NAMES.__len__() != 0:
|
||||
for name in BOARD_NAMES:
|
||||
boards.append(Board(name))
|
||||
else:
|
||||
raise MissingBoardError
|
||||
|
||||
for b in boards:
|
||||
b.button.pack(side=LEFT, padx=2, pady=2)
|
||||
|
||||
tk.mainloop()
|
||||
Reference in New Issue
Block a user