Seite 1 von 1

Button scrollen

Verfasst: Montag 5. August 2019, 09:29
von Fire Spike
Hallo ich bin recht neu bei tkinter und wollte mir ein mp3player basteln.
Das Programm listet alle dateien auf in einem ordner und erstellt dann knöpfe mit dem Songname.
Das funktionert super, aber wenn die Button nicht mehr auf den Bildschirm passen zeigt es sie nicht mehr an.
Meine idee war die Buttons in eine scroolbar eizufügen aber es funktioniert nicht.
Könnt ihr mir mal vorschläge machen wie ich das umsetzen kann?
Hier ist der Code vom Programm:

Code: Alles auswählen

#!/usr/bin/env python3
from tkinter import *
import os
import vlc
from functools import partial

def dateisuche():
    dateinamen = []
    dateipfade = []
    
    for subdir, dirs, files in os.walk("/home/pi/Music/Techno"):
        for file in files:
            dateipfade.append(os.path.join(subdir, file))
            dateinamen.append(file)
            
    return dateinamen, dateipfade

def mp3_player(pfad):
    p = vlc.MediaPlayer(pfad)
    p.play()

dateinamen, dateipfade = dateisuche() 
länge_namen = len(dateinamen)

nummer = 0

root = Tk()
root.title("mp3-player")
root.configure(background="white")

  
for i in range(länge_namen):
    nummer += 1
    Button(root, text=dateinamen[nummer - 1],
           command=partial(mp3_player,
                           dateipfade[nummer - 1]),
           bg="white").grid(row=nummer, column=0, sticky=W)

Label(root,
      text="Klicke auf Name um die Musik zu starten.").grid(row=0, column=0, sticky=W)

root.mainloop()

Re: Button scrollen

Verfasst: Montag 5. August 2019, 10:12
von Sirius3
Keine *-Importe, weil man damit unkontrolliert Namen in den eigenen Namensraum schaufelt. Die Liste dateinamen ist überflüssig, da die selbe Information ja schon in dateipfade steckt. Statt `os.walk` nimmt man heutzutage pathlib.Path.rglob.
Eine for-Schleife über einen Index ist ein Antipattern, zumal Du den Index `i` gar nicht benutzt, sondern nochmal händisch einen weiteren Index `nummer` zählst.

Code: Alles auswählen

#!/usr/bin/env python3
from functools import partial
from pathlib import Path
import tkinter as tk
import vlc

MUSIC_PATH = Path("/home/pi/Music/Techno")

def dateisuche():
    return list(filter(Path.is_file, MUSIC_PATH.rglob('*')))

def mp3_player(pfad):
    p = vlc.MediaPlayer(pfad)
    p.play()

def main():
    dateipfade = dateisuche() 
    root = tk.Tk()
    root.title("mp3-player")
    root.configure(background="white")
    for nummer, pfad in enumerate(dateipfade, 1):
        tk.Button(root, text=pfad.name,
            command=partial(mp3_player, str(pfad)),
            bg="white").grid(row=nummer, column=0, sticky=tk.W)
    tk.Label(root, text="Klicke auf Name um die Musik zu starten."
        ).grid(row=0, column=0, sticky=tk.W)
    root.mainloop()

if __name__ == '__main__':
    main()
Was hast Du mit dem Scrollbar versucht? Es gibt ja genug Beispiele: https://gist.github.com/mp035/9f2027c3e ... d6262f3b01

Re: Button scrollen

Verfasst: Montag 5. August 2019, 12:24
von Fire Spike
ich habe schon viele beispiele probiert aber ich verstehe sie nicht. :cry: :| :cry: :cry: :|

Re: Button scrollen

Verfasst: Montag 5. August 2019, 12:34
von Sirius3
Was verstehst Du daran konkret nicht? Bei dem Beispiel, das ich gepostet habe, mußt Du nur die Klasse anwenden.

Re: Button scrollen

Verfasst: Dienstag 6. August 2019, 07:08
von Fire Spike
Danke sirius3 für die hilfe ich habe mal etwas zusammengebastet das sehr schön aussieht, aber die scrollbar macht nichts :cry:
Könntest du mir bitte helfen? :D
Das Fenster sollte möglichst gleich aussehen. :!:

Das ist mein jetziger code, der hat eine globale variable aber ohne kann ich die Musik nicht stoppen

Code: Alles auswählen

#!/usr/bin/env python3
from functools import partial
from pathlib import Path
import tkinter as tk
import vlc

MUSIC_PATH = Path("/home/pi/Music/Sonst")

def dateisuche():
    return list(filter(Path.is_file, MUSIC_PATH.rglob('*.mp3')))

def mp3_player(pfad):
    global p
    p = vlc.MediaPlayer(pfad)
    p.play()

def mp3_stop():
    global p
    p.stop()
    
def main():
    dateipfade = dateisuche()

    root = tk.Tk()
    root.title("mp3-player")
    root.configure(background="white")

    Canvas = tk.Canvas(root)
    Canvas.grid(row=1, column=0)

    Frame = tk.Frame(Canvas)
    Frame.grid(row=1, column=0, sticky=tk.W)
    
    Scrollbar = tk.Scrollbar(Canvas, orient="vertical", command=Canvas.yview)
    Scrollbar.grid(row=1, column=1, sticky=tk.NS)
    
    for nummer, pfad in enumerate(dateipfade, 1):
        songtitel = pfad.name

        tk.Button(Frame, text=songtitel,
            command=partial(mp3_player, str(pfad)),
            bg="white").grid(row=nummer, column=0, sticky=tk.W)
    
    tk.Label(root, text="Klicke auf Name um die Musik zu starten.", bg="white").grid(row=0, column=0, sticky=tk.W)
    
    tk.Button(root,
            text="Stop",
            fg="red",
            bg="white",
           command=mp3_stop).grid(row=1, column=1)
    
    Canvas.config(yscrollcommand=Scrollbar.set)
    Frame.configure(background="white")

    root.mainloop()

if __name__ == '__main__':
    main()

Re: Button scrollen

Verfasst: Dienstag 20. August 2019, 19:29
von Fire Spike
Kann mir bitte jemand antworten?

Re: Button scrollen

Verfasst: Samstag 24. August 2019, 19:55
von Fire Spike
Wieso antwortet mir niemand? :evil: ich warte schon fast 2 wochen. Das programm sollte für meine vater sein und ich habe mir schon viel mühe gegeben. ich währe froh wenn jemand antworten würde!

Re: Button scrollen

Verfasst: Samstag 24. August 2019, 22:35
von __deets__
Geht’s noch? Wer glaubst du denn wer du bist, das du hier von Leuten die kostenlos Hilfe anbieten in solchem Ton forderst, sie sollen Dir gefälligst ihre Zeit und Aufmerksamkeit schenken? Krieg dich mal ganz schnell wieder ein.