From bd7030b5bdd475c179df6f8e90670036d8536c4f Mon Sep 17 00:00:00 2001 From: Gustavo Bordin Date: Sat, 5 Jun 2021 19:02:08 -0300 Subject: [PATCH 1/6] renaming folder to lowercase also renaming play_button to play, in order to keep a pattern --- Images/pillar.jpg | Bin 61003 -> 0 bytes Images/play_button.png | Bin 1955 -> 0 bytes {Images => images}/back.png | Bin {Images => images}/next.png | Bin {Images => images}/pause.png | Bin {Images => images}/pillar.png | Bin images/play.png | Bin 0 -> 464 bytes {Images => images}/pylot.png | Bin {Images => images}/war of ages.png | Bin 9 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Images/pillar.jpg delete mode 100644 Images/play_button.png rename {Images => images}/back.png (100%) rename {Images => images}/next.png (100%) rename {Images => images}/pause.png (100%) rename {Images => images}/pillar.png (100%) create mode 100644 images/play.png rename {Images => images}/pylot.png (100%) rename {Images => images}/war of ages.png (100%) diff --git a/Images/pillar.jpg b/Images/pillar.jpg deleted file mode 100644 index 8396d0cf508ee7c39e1579786dd7981690e680b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61003 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 Q7XE)_&gB0`WH$Z30D6H`xBvhE diff --git a/Images/play_button.png b/Images/play_button.png deleted file mode 100644 index 21de3a42399789174d4caf6acb5e1c0bca826bc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1955 zcmbVNeNYr-7+=mWIMhgx5RA6b{eNvA1u!m<)X7_)czxKYP)a%Xn;-S_>y zzu)sb@AEvn!;zacLm97xAZUgy+nNvF>GB;u6+92HoBF^jg3n$hLQrJ1e1}21_QXNZ zlvvj3l3ey@35xToNSZ5UR6#Ef&=9mNEy$D9Mn-~5nR3==LViElioh&wLW*>D+|FAV zH=A84Fa?#lPO5SvWu%d`+iTy4Z~1Ex+vaW#SK30*2Yejz|jpv#DS>xywL z@MS{WlEf1j76=4XffN-dlw)e65pZZQjRpk>RIKnxWDxa<^ClRqj7SMAFR`2tmKn)X z&M%n|VCk3(UOq(Y6UV~@0)_=i9#gAu*`-k+O@(m0U+|2I(-g*d7%$_KM1WO?u)Ld- zIML1h3w3Du9sv+qyFH}wKwG@tkc22@ZU%0Q2jqch(OJPWSUw|iet}{#Hv=>0$=>jU zMPNvY6Pz69nK&rNgvqc5cnvQqVtq6h5EtLIfw7VjV?s2zMvdY+RHJj^Mna<{bOsbp zA#i*QYUgOStl~bXUWVctLZ`V03Q~q9CGw$Qnj*?L!Ak;%Sua`6V7#v!fkR;=ES!fE zfH1Hw8nfF$NR4 zGATd`jJX^{>!Epv0pl^bV8{Hx?ssu??XKdUfP;=94@0dAe1w`E;{zQ|0Ih8Cp#2I2 zDN<}!vorYJwcRE+Vvae}Jv%Ku!Ten0k@FdzPuAruja-tGvnFRv`^vLkFN(gOTzbAL z`4%i(dVD&4f}-Xpon80&!e>sLn$y{)o0eF-sp-zmZC7L0R-aAiYpytVnKvX~&s1bX z5r&cz#fR(-4uek{|KrLxHG?C!Bjdul=s%0U@plZ@1XdjE-i534j>opO+_;v|F+8L9 zS|Ju&OAYq-?Noex@wXj*=;g-mU&?4m=#6;&+?4};g3 zv@+^OrKzUo(;`>c+zZbpL+ka*Q#TJQ4E;TStUlNs zboIki!h7y)xGD|D6mBWO&5$nzqm}7}Lf!^+vnHnuo25MU(l|_9uGm{IS*E#xH+aupq?fgsm|0++ynp`AE;{#}Mash1)~(64f7QO?O!BWNqTKcS66>;RniKQp&r<5L zw;b!-V>#a0rni}!y1I^5CE323L?84R=C-_5#%`#8`^AX(HyRoi$M4?PZkv^^$Zl(G as#c6tMR&|GR5Z%JQCnuN^-xC1)_(w*i>rYE diff --git a/Images/back.png b/images/back.png similarity index 100% rename from Images/back.png rename to images/back.png diff --git a/Images/next.png b/images/next.png similarity index 100% rename from Images/next.png rename to images/next.png diff --git a/Images/pause.png b/images/pause.png similarity index 100% rename from Images/pause.png rename to images/pause.png diff --git a/Images/pillar.png b/images/pillar.png similarity index 100% rename from Images/pillar.png rename to images/pillar.png diff --git a/images/play.png b/images/play.png new file mode 100644 index 0000000000000000000000000000000000000000..3797f927731315a585996fb04ed3f6301dc0d589 GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^%0R5c0VEhsJ&6kdQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIg;1J3@h*WVo~!MWn+|NrlohA=v1{rmra z-_40rC(Qc)Ki)S$eZ{l?`?GHzYPs^~|NrcEYj#Cbp!S)oj=Ff9{lDM*Qw!%xpw8!V z`eq=V_4dx~6G1xPJ=q`}^!fjP>+(Zc|3ZQeopbW`J-_`?s1N^>}miyPd#DJk(` zrJ~Z`J+l_L6;`Ru(f{yVKk1XE;m^4 Date: Sat, 5 Jun 2021 19:02:56 -0300 Subject: [PATCH 2/6] renaming music folder to lowercase --- {Music => music}/1. Oh Boy.wav | Bin {Music => music}/13. Nova.wav | Bin {Music => music}/4. Ghost Drip.wav | Bin {Music => music}/5. Hackerman.wav | Bin {Music => music}/7. Keanu Sleeves.wav | Bin 5 files changed, 0 insertions(+), 0 deletions(-) rename {Music => music}/1. Oh Boy.wav (100%) rename {Music => music}/13. Nova.wav (100%) rename {Music => music}/4. Ghost Drip.wav (100%) rename {Music => music}/5. Hackerman.wav (100%) rename {Music => music}/7. Keanu Sleeves.wav (100%) diff --git a/Music/1. Oh Boy.wav b/music/1. Oh Boy.wav similarity index 100% rename from Music/1. Oh Boy.wav rename to music/1. Oh Boy.wav diff --git a/Music/13. Nova.wav b/music/13. Nova.wav similarity index 100% rename from Music/13. Nova.wav rename to music/13. Nova.wav diff --git a/Music/4. Ghost Drip.wav b/music/4. Ghost Drip.wav similarity index 100% rename from Music/4. Ghost Drip.wav rename to music/4. Ghost Drip.wav diff --git a/Music/5. Hackerman.wav b/music/5. Hackerman.wav similarity index 100% rename from Music/5. Hackerman.wav rename to music/5. Hackerman.wav diff --git a/Music/7. Keanu Sleeves.wav b/music/7. Keanu Sleeves.wav similarity index 100% rename from Music/7. Keanu Sleeves.wav rename to music/7. Keanu Sleeves.wav From d6e73ffa8c42bada37bb8155529abbea247fdc2b Mon Sep 17 00:00:00 2001 From: Gustavo Bordin Date: Sat, 5 Jun 2021 19:04:20 -0300 Subject: [PATCH 3/6] refactoring and adding features features: pausing and playing with the same button, caching musics directory, changing paths to work on unix systems. --- app.py | 123 +++++++---------------------------- utils/cache.py | 16 +++++ utils/interface_events.py | 20 ++++++ utils/interface_utilities.py | 104 +++++++++++++++++++++++++++++ utils/music_events.py | 64 ++++++++++++++++++ utils/music_utilities.py | 88 ++++++++++++++----------- 6 files changed, 276 insertions(+), 139 deletions(-) create mode 100644 utils/cache.py create mode 100644 utils/interface_events.py create mode 100644 utils/interface_utilities.py create mode 100644 utils/music_events.py diff --git a/app.py b/app.py index 8846bd8..12124ea 100644 --- a/app.py +++ b/app.py @@ -1,110 +1,31 @@ import PySimpleGUI as sg -import os -from utils.music_utilities import get_files_inside_directory_not_recursive, play_sound, is_sound_playing, pause_sounds, stop_sounds, unpause -sg.theme('Reddit') -song_title_column = [ - [sg.Text(text='Press play..', justification='center', background_color='black', - text_color='white', size=(200, 0), font='Tahoma', key='song_name')] -] +from utils.interface_utilities import InterfaceUtilities +from utils.music_events import MusicEvents -player_info = [ - [sg.Text('PySimpleGUI Player - By youtube.com/devaprender', - background_color='black', text_color='white', font=('Tahoma', 7))] -] -currently_playing = [ - [sg.Text(background_color='black', size=(200, 0), text_color='white', - font=('Tahoma', 10), key='currently_playing')] -] +class Core(MusicEvents): + def __init__(cls): + sg.theme('Reddit') + interface_utilities = InterfaceUtilities() + cls.window = interface_utilities.create_window() + super().__init__(cls.window) + cls._start() -GO_BACK_IMAGE_PATH = 'Images\\back.png' -GO_FORWARD_IMAGE_PATH = 'Images\\next.png' -PLAY_SONG_IMAGE_PATH = 'Images\\play_button.png' -PAUSE_SONG_IMAGE_PATH = 'Images\\pause.png' -ALBUM_COVER_IMAGE_PATH = 'Images\\pylot.png' + def _start(cls): + while True: + event, _ = cls.window.read() -main = [ - [sg.Canvas(background_color='black', size=(480, 20), pad=None)], - [sg.Column(layout=player_info, justification='c', - element_justification='c', background_color='black')], - [ - sg.Canvas(background_color='black', size=(40, 350), pad=None), - sg.Image(filename=ALBUM_COVER_IMAGE_PATH, - size=(350, 350), pad=None), - sg.Canvas(background_color='black', size=(40, 350), pad=None) - ], - [sg.Canvas(background_color='black', size=(480, 10), pad=None)], - [sg.Column(song_title_column, background_color='black', - justification='c', element_justification='c')], - [sg.Text('_'*80, background_color='black', text_color='white')], - [ - sg.Canvas(background_color='black', size=(99, 200), pad=(0, 0)), - sg.Image(pad=(10, 0), filename=GO_BACK_IMAGE_PATH, enable_events=True, - size=(35, 44), key='previous', background_color='black'), - sg.Image(filename=PLAY_SONG_IMAGE_PATH, - size=(64, 64), pad=(10, 0), enable_events=True, key='play', background_color='black'), - sg.Image(filename=PAUSE_SONG_IMAGE_PATH, - size=(58, 58), pad=(10, 0), enable_events=True, key='pause', background_color='black'), - sg.Image(filename=GO_FORWARD_IMAGE_PATH, enable_events=True, - size=(35, 44), pad=(10, 0), key='next', background_color='black'), - ], - [sg.Column(layout=currently_playing, justification='c', - element_justification='c', background_color='black', pad=None)] + if event == sg.WIN_CLOSED: + break + elif event == 'switch_state': + cls.switch_state() + + elif event == 'next': + cls.next() -] -window = sg.Window('Spotify', layout=main, size=( - 480, 730), background_color='black', finalize=True, grab_anywhere=True, resizable=False,) + elif event == 'previous': + cls.previous() -directory = sg.popup_get_folder('Select Music Directory') - -songs_in_directory = get_files_inside_directory_not_recursive(directory) -song_count = len(songs_in_directory) -current_song_index = 0 - - -def update_song_display(): - window['song_name'].update(os.path.basename( - songs_in_directory[current_song_index])) - window['currently_playing'].update( - f'Playing: {os.path.basename(songs_in_directory[current_song_index])}') - - -while True: - event, values = window.read() - if event == sg.WIN_CLOSED: - break - elif event == 'play': - if is_sound_playing(): - pass - if is_sound_playing() == False: - play_sound(songs_in_directory[current_song_index]) - update_song_display() - - elif event == 'pause': - if is_sound_playing(): - pause_sounds() - else: - unpause() - pass - - elif event == 'next': - if current_song_index + 1 < song_count: - stop_sounds() - current_song_index += 1 - play_sound(songs_in_directory[current_song_index]) - update_song_display() - - else: - print('Reached last song') - pass - - elif event == 'previous': - if current_song_index + 1 <= song_count and current_song_index > 0: - stop_sounds() - current_song_index -= 1 - play_sound(songs_in_directory[current_song_index]) - update_song_display() - else: - print('Reached first song') +Core() \ No newline at end of file diff --git a/utils/cache.py b/utils/cache.py new file mode 100644 index 0000000..5d98ed5 --- /dev/null +++ b/utils/cache.py @@ -0,0 +1,16 @@ +class Cache: + USER_CACHE_DIR = "tmp/user.txt" + + def save(cls, key, value): + with open(cls.USER_CACHE_DIR, 'w') as cache: + cache.write(f"{key}:{value}") + + def read(cls, key): + try: + with open(cls.USER_CACHE_DIR, 'r') as cache: + for line in cache.readlines(): + if key in line: + value = line.split(':')[1] + return value + except: + return None \ No newline at end of file diff --git a/utils/interface_events.py b/utils/interface_events.py new file mode 100644 index 0000000..d2fedc2 --- /dev/null +++ b/utils/interface_events.py @@ -0,0 +1,20 @@ +from utils.interface_utilities import InterfaceUtilities + + +class InterfaceEvents(InterfaceUtilities): + def __init__(self, window): + self.window = window + + def music_has_changed(self, new_name): + self.window['music_name'].update(new_name) + self.window['currently_playing'].update(f'Playing: {new_name}') + + def pressed_switch_button(self, new_state): + switch_button = self.window['switch_state'] + + if new_state == 'PAUSE': + switch_button.update(filename=self.PLAY_MUSIC_IMAGE_PATH) + else: + switch_button.update(filename=self.PAUSE_MUSIC_IMAGE_PATH) + + \ No newline at end of file diff --git a/utils/interface_utilities.py b/utils/interface_utilities.py new file mode 100644 index 0000000..6fec88d --- /dev/null +++ b/utils/interface_utilities.py @@ -0,0 +1,104 @@ +import os + +import PySimpleGUI as sg + + +class InterfaceUtilities: + GO_BACK_IMAGE_PATH = os.path.join('images', 'back.png') + GO_FORWARD_IMAGE_PATH = os.path.join('images', 'next.png') + PLAY_MUSIC_IMAGE_PATH = os.path.join('images', 'play.png') + PAUSE_MUSIC_IMAGE_PATH = os.path.join('images', 'pause.png') + album_cover_image_path = os.path.join('images', 'pylot.png') + + def _create_main_layout(cls): + music_title = [ + [sg.Text(text='Press play...', + justification='center', + background_color='black', + text_color='white', + size=(200, 0), + font='Tahoma', + key='music_name')] + ] + + author_info = [ + [sg.Text(text='PySimpleGUI Player - By youtube.com/devaprender', + background_color='black', + text_color='white', + font=('Tahoma', 7))] + ] + + currently_playing = [ + [sg.Text(background_color='black', + size=(200, 0), + text_color='white', + font=('Tahoma', 10), + key='currently_playing')] + ] + + main_layout = [ + [sg.Canvas(background_color='black', size=(480, 20))], + [sg.Column(layout=author_info, + justification='c', + element_justification='c', + background_color='black')], + + [ + sg.Canvas(background_color='black', size=(40, 350)), + sg.Image(filename=cls.album_cover_image_path, + size=(350, 350), + key="cover"), + sg.Canvas(background_color='black', size=(40, 350)) + ], + + [sg.Canvas(background_color='black', size=(480, 10))], + [sg.Column(layout=music_title, + background_color='black', + justification='c', + element_justification='c')], + [sg.Text(text= '_' * 80, background_color='black', text_color='white')], + + [ + sg.Canvas(background_color='black', size=(99, 200), pad=(10, 0)), + + sg.Image(pad=(20, 0), + filename=cls.GO_BACK_IMAGE_PATH, + enable_events=True, + size=(35, 44), + key='previous', + background_color='black'), + + sg.Image(filename=cls.PLAY_MUSIC_IMAGE_PATH, + size=(35, 44), + pad=(20, 0), + enable_events=True, + key='switch_state', + background_color='black'), + + sg.Image(filename=cls.GO_FORWARD_IMAGE_PATH, + enable_events=True, + size=(35, 44), + pad=(20, 0), + key='next', + background_color='black'), + ], + + [sg.Column(layout=currently_playing, + justification='c', + element_justification='c', + background_color='black')] + ] + + return main_layout + + def create_window(cls): + main_layout = cls._create_main_layout() + window = sg.Window('Spotify', + layout=main_layout, + size=(480, 730), + background_color='black', + finalize=True, + grab_anywhere=True, + resizable=False) + + return window \ No newline at end of file diff --git a/utils/music_events.py b/utils/music_events.py new file mode 100644 index 0000000..64fca07 --- /dev/null +++ b/utils/music_events.py @@ -0,0 +1,64 @@ +from pygame import mixer + +from utils.interface_events import InterfaceEvents +from utils.music_utilities import MusicUtilities + + +class MusicEvents(MusicUtilities): + def __init__(cls, window): + cls.interface_events = InterfaceEvents(window) + super().__init__() + + def _play(cls): + cls.interface_events.pressed_switch_button("PLAY") + cls.interface_events.music_has_changed(cls.current_music_name) + mixer.music.load(cls.current_music) + mixer.music.play() + + def _stop(cls): + mixer.music.stop() + + def _pause(cls): + cls.is_paused = True + mixer.music.pause() + + def _unpause(cls): + cls.is_paused = False + mixer.music.unpause() + + def next(cls): + cls._stop() + + if cls.current_playing_index + 1 < cls.musics_count: + cls.current_playing_index += 1 + else: + print('Reached last music, starting again') + cls.current_playing_index = 0 + + cls._play() + + def previous(cls): + cls._stop() + + if cls.current_playing_index - 1 < 0: + print('Reached first music, playing the last one') + cls.current_playing_index = cls.musics_count - 1 + else: + cls.current_playing_index -= 1 + + cls._play() + + def switch_state(cls): + if cls.is_playing == True: + cls.interface_events.pressed_switch_button("PAUSE") + cls._pause() + + elif cls.is_paused == True: + cls.interface_events.pressed_switch_button("PLAY") + cls._unpause() + + else: + cls._play() + + + \ No newline at end of file diff --git a/utils/music_utilities.py b/utils/music_utilities.py index b8f9254..c1686d1 100644 --- a/utils/music_utilities.py +++ b/utils/music_utilities.py @@ -1,38 +1,50 @@ -import os -from pygame import mixer -mixer.init() - - -def get_files_inside_directory_not_recursive(directory): - directories = [] - for (root, dirs, files) in os.walk(directory): - for file in files: - directories.append(root + os.sep + file) - - return directories - - -def play_sound(sound_path): - mixer.music.load(sound_path) - mixer.music.play() - - -def stop_sounds(): - mixer.music.stop() - - -def pause_sounds(): - mixer.music.pause() - - -def unpause(): - mixer.music.unpause() - - -def is_sound_playing(): - if mixer.music.get_busy() == True: - return True - return False - - - +import os + +import PySimpleGUI as sg +from pygame import mixer + +from utils.cache import Cache + +class MusicUtilities: + def __init__(cls): + mixer.init() + cls.musics = [] + cls.musics_count = 0 + cls.current_playing_index = 0 + cls.is_paused = False + cls.musics_dir_key = "md" + cls._load_music_directories() + + def _get_musics_inside_directory(cls, directory): + directories = [] + + for (root, _, files) in os.walk(directory): + for file in files: + directories.append(root + os.sep + file) + + return directories + + def _load_music_directories(cls): + cache = Cache() + directory = cache.read(cls.musics_dir_key) + + if directory == None: + directory = sg.popup_get_folder('Select Music Directory') + cache.save(cls.musics_dir_key, directory) + + cls.musics = cls._get_musics_inside_directory(directory) + cls.musics_count = len(cls.musics) + + @property + def current_music(cls): + return cls.musics[cls.current_playing_index] + + @property + def current_music_name(cls): + return os.path.basename(cls.current_music) + + @property + def is_playing(cls): + if mixer.music.get_busy() == True: + return True + return False \ No newline at end of file From c2e5450383fb4c09682e0c2ea36d948a864f2d11 Mon Sep 17 00:00:00 2001 From: Gustavo Bordin Date: Sat, 5 Jun 2021 19:04:37 -0300 Subject: [PATCH 4/6] updated gitignore to remove unused ignores --- .gitignore | 132 ++--------------------------------------------------- 1 file changed, 3 insertions(+), 129 deletions(-) diff --git a/.gitignore b/.gitignore index b6e4761..c51108e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,129 +1,3 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -pip-wheel-metadata/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ +/tmp/* +__pycache__ +*.pyc \ No newline at end of file From a13bd409098d2fbd53a17b0608406bc72ae66c10 Mon Sep 17 00:00:00 2001 From: Gustavo Bordin Date: Sat, 5 Jun 2021 19:05:21 -0300 Subject: [PATCH 5/6] add CHANGELOG --- CHANGELOG | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 CHANGELOG diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..b795cd9 --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,8 @@ +1.1.0 + - Using classes for organization (@gustavo-bordin) + - Pausing/Playing with the same button (@gustavo-bordin) + - Caching the musics directory (@gustavo-bordin) + - Adjusted paths to work in unix-based systems (@gustavo-bordin) + +1.0.0 + - First working version (@Jhonatan-de-Souza) \ No newline at end of file From f0b71a1012ce196e0005cfe03c674217090532f2 Mon Sep 17 00:00:00 2001 From: Gustavo Bordin Date: Sat, 5 Jun 2021 20:09:15 -0300 Subject: [PATCH 6/6] updated README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e7ce7a0..7d005ae 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # PySimpleGUI Music Player Um player de música feito 100% em python e PySimpleGUI -![Music Player](https://i.ibb.co/v38GPKX/Screenshot-5.png) +![Music Player](https://i.ibb.co/jWX52DD/Screenshot-from-2021-06-05-20-04-20.png) # Como usar(How to use)