MP3 плеер для Linux


Я написал на Python MP3-плеер для Linux, используя Pygame, с GUI проклятий и мышь-только интерфейс.

Это чисто для личного пользования.

Она еще не полированная, но сейчас я хочу знать, что я сделал неэффективно, так что я могу заполнить некоторые невежество-дыр. Я знаю, что некоторые вещи можно было бы заниматься больше непосредственно.

import curses
import pygame

pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=4096)
player = pygame.mixer.music
song = "testshort.mp3"
player.load(song)
player.play()
screen = curses.initscr()
curses.noecho()
curses.mousemask(curses.ALL_MOUSE_EVENTS)
screen.keypad(1)
curses.curs_set(0)
screen.resize(6, 30)
screen.border(0)
screen.addstr(4, 19, "*"*5+"-"*5)
player.set_volume(0.5)
screen.addstr(4, 2, "|")
paused = 0
curses.halfdelay(1)

while True:
            busycheck = player.get_busy()
            if busycheck == 0:
                screen.addstr(4, 2, ">")
            char = screen.getch()            
            if char == curses.KEY_MOUSE:
                cords = list(curses.getmouse())
                mouse_x = cords[1]
                mouse_y = cords[2]
                vol_on = mouse_x - 18
                vol_off = 10 - vol_on
                screen.border(0)
                if mouse_y == 4:
                    if 29 > mouse_x > 18:
                        vol_bar = screen.addstr(4, 19, "*"*vol_on+"-"*vol_off)
                        volchange = (mouse_x-19)/9.0
                        player.set_volume(volchange)
                    elif mouse_x == 2:
                        if paused == 0:
                            if busycheck == 1:
                                screen.addstr(4, 2, ">")
                                player.pause()
                                paused = 1
                            else:
                                player.play()
                                paused = 0
                                screen.addstr(4, 2, "|")
                        else:
                            player.unpause()
                            screen.addstr(4, 2, "|")
                            paused = 0


697
4
задан 9 декабря 2011 в 10:12 Источник Поделиться
Комментарии
1 ответ

import curses
import pygame

pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=4096)
player = pygame.mixer.music

При подаче модули более короткое имя, обычный метод , с которым Pygame.смеситель импортировать музыку как игрок это делает его немного яснее, что вы делаете.

song = "testshort.mp3"
player.load(song)
player.play()

На что угодно, но быстрый скрипт, его рекомендуется поместить ваш код внутри функции main.

screen = curses.initscr()

Я рекомендую вам взглянуть на ругательства.функции-оболочки. Потребуется правильно ухаживать закрытия проклятия в случае ошибки.

curses.noecho()
curses.mousemask(curses.ALL_MOUSE_EVENTS)
screen.keypad(1)
curses.curs_set(0)
screen.resize(6, 30)
screen.border(0)
screen.addstr(4, 19, "*"*5+"-"*5)
player.set_volume(0.5)
screen.addstr(4, 2, "|")

Ваш код прыгает между параметрами проклятий, вывода на экран, и настройка плеера. Я рекомендую разделить его чисто между этими тремя различными задачами.

paused = 0
curses.halfdelay(1)

while True:
busycheck = player.get_busy()
if busycheck == 0:

использовать если не игрок.get_busy(). Использовать == для проверки в случае значений, считается плохой практикой. И нет никакой причины разбить на две строки здесь

                screen.addstr(4, 2, ">")
char = screen.getch()
if char == curses.KEY_MOUSE:
cords = list(curses.getmouse())

Нет никаких оснований для вызова списка здесь.

                mouse_x = cords[1]
mouse_y = cords[2]

Я предлагаю mouse_x, mouse_y = координаты[:2]

                vol_on = mouse_x - 18
vol_off = 10 - vol_on
screen.border(0)

Почему ты называешь экрана.границы здесь?

                if mouse_y == 4:
if 29 > mouse_x > 18:
vol_bar = screen.addstr(4, 19, "*"*vol_on+"-"*vol_off)

Вы в принципе повторяете то, что было ранее. Я предлагаю рефакторинг с тем, чтобы поделиться код.

                        volchange = (mouse_x-19)/9.0
player.set_volume(volchange)

Увидеть, как вы эффективно изменять один и тот же кусок информации в три раза? Это предполагает, что вы должны поставить все это в функцию.

                    elif mouse_x == 2:
if paused == 0:
if busycheck == 1:
screen.addstr(4, 2, ">")
player.pause()
paused = 1
else:
player.play()
paused = 0
screen.addstr(4, 2, "|")
else:
player.unpause()
screen.addstr(4, 2, "|")
paused = 0

Опять же, ваш код колтуны вместе в кажущемся случайным образом различные вещи, которые он делает.

Это как я бы сделал это:

import curses
import pygame
from pygame.mixer.music import music

SONG = "testshort.mp3"

class MusicPlayer(object):
def __init__(self):
pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=4096)
music.load(SONG)
music.play()
self.paused = False
self.change_volume(5)

def change_volume(self, volume):
self.volume = volume
music.set_volume( volume / 9.0 )

def toggle_pause(self):
self.paused = not self.paused:
if self.paused:
music.pause()
else:
music.unpause()

def update_screen(screen, player):
screen.addstr(4, 19, "*" * player.volume + "-"* (10 -player.volume))

if music.get_busy() or player.paused:
screen.addstr(4, 2, "|")
else:
screen.addstr(4, 2, ">")

def main(screen):
curses.mousemask(curses.ALL_MOUSE_EVENTS)
screen.keypad(1)
curses.curs_set(0)
screen.resize(6, 30)
screen.border(0)
curses.halfdelay(1)

player = MusicPlayer()

while True:
update_screen(screen, player)

char = screen.getch()
if char == curses.KEY_MOUSE:
mouse_x, mouse_y = curses.getmouse()[:2]
if mouse_y == 4:
if 29 > mouse_x > 18:
player.change_volume(mouse_x - 18)
elif mouse_x == 2:
player.toggle_pause()

if __name__ == '__main__':
curses.wrapper(main)

Видеть, как каждый кусок кода забот об одной маленькой вещи? Мы не смешиваем управляет музыкой с обновлением дисплея.

4
ответ дан 10 декабря 2011 в 02:12 Источник Поделиться