MP3-Player für Linux

  • Ich habe einen Python MP3-Player mit PyGame für Linux geschrieben, mit einer flüchtigen GUI und einer Mausoberfläche.

    Es ist nur für den persönlichen Gebrauch bestimmt.

    Es ist noch nicht poliert, aber jetzt möchte ich gerne wissen, was ich ineffizient gemacht habe, um einige Ignoranzlöcher zu füllen. Ich weiß, dass einige Dinge direkter gehandhabt werden könnten.

     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
     
    28 April 2015
    Jamal
1 answer
  •  import curses
    import pygame
    
    pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=4096)
    player = pygame.mixer.music
     

    Wenn Sie Modulen einen kürzeren Namen geben, ist die übliche Methode from pygame.mixer import music as player. Dadurch wird die Vorgehensweise etwas klarer.

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

    Für alles andere als ein schnelles Skript wird empfohlen, dass Sie Ihren Code in eine Hauptfunktion einfügen.

     screen = curses.initscr()
     

    Ich empfehle Ihnen, sich die Funktion curses.wrapper anzusehen. Es wird darauf geachtet, Flüche im Fehlerfall korrekt zu schließen.

     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, "|")
     

    Ihr Code springt zwischen Flüchen Einstellungen, die Ausgabe auf dem Bildschirm und das Einrichten des Players. Ich empfehle, diese drei Aufgaben sauber aufzuteilen.

     paused = 0
    curses.halfdelay(1)
    
    while True:
                busycheck = player.get_busy()
                if busycheck == 0:
     

    verwenden Sie if not player.get_busy(). Die Verwendung von == zum Überprüfen von Bools gilt als schlechte Praxis. Und es gibt keinen Grund, sich hier auf zwei Zeilen aufzuteilen.

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

    Hier gibt es keinen Grund, eine Liste anzurufen.

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

    Ich empfehle mouse_x, mouse_y = Koordinaten [: 2]

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

    Warum rufen Sie screen.border hier an?

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

    Sie wiederholen grundsätzlich das, was Sie zuvor hatten. Ich empfehle das Refactoring, um Code freizugeben.

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

    Sehen Sie, wie Sie dieselbe Information effektiv ändern mal? Dies legt nahe, dass Sie das alles in eine Funktion einfügen sollten.

                         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
     

    Auch hier verheddert sich Ihr Code scheinbar Zufällige Weise die verschiedenen Dinge, die es tut.

    So würde ich es tun:

     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)
     

    Siehst du, wie jedes Stück des Codes sich um eine kleine Sache kümmert? Wir mischen die Steuerung der Musik nicht mit der Aktualisierung der Anzeige.

    10 December 2011
    Mark Cidade