Button scrollen

Fragen zu Tkinter.
Antworten
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

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()
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

ich habe schon viele beispiele probiert aber ich verstehe sie nicht. :cry: :| :cry: :cry: :|
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Was verstehst Du daran konkret nicht? Bei dem Beispiel, das ich gepostet habe, mußt Du nur die Klasse anwenden.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

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()
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Kann mir bitte jemand antworten?
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

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!
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Antworten