Dateien wurden mit Klassen "verbessert". Funktionen/Images funktionieren nicht

Fragen zu Tkinter.
Antworten
ka90cy
User
Beiträge: 3
Registriert: Donnerstag 31. August 2023, 09:07

Hallo ihr lieben,

ich bin gerade am Python lernen. Ich schreibe eine API für einen Musikplayer. Diese soll Musik abspielen/Pausieren, Lautstärke ändern und so weiter.
Es hatte auch alles super funktioniert bis ich es in Klassen ausgegliedert habe) Es wird kein Fehler angezeigt.

Die Images werden nicht angezeigt und auch keine Reaktion auf das leere Kästchen im Fenster.

## Code wurde gekürzt

Code: Alles auswählen


import tkinter as tk
import volume   # Lautstaerke_Klasse
import requests

class Tidalplayer:
    url = '[u]MeineURL[/u]'
    urlStatus = "[u]StatusURL[/u]"

    def __init__(self, url):
        self.url = url
        self.play = False
        self.status = False

    def tidal_music_pause(self):
        res = requests.get(self.url + 'Pause'')
        print(res)
    def tidal_music_skip(self):
        res = requests.get(self.url + 'Skip')
        print(res)
    def tidal_music_back(self):
        res = requests.get(self.url + 'Back')
        print(res)
    def tidal_music_play(self):
        self.play
        if self.play == False:
            res = requests.get(self.url + 'LoadURL')
            self.play = True
            print(res)
        else:
            res = requests.get(self.url + 'Play')
            print(res)
            return res
    
    # das funktioniert auch noch nicht richtig, weiß nicht wie ich es ins Label übergeben kann und regelmäßig aktualisiert wird, 
    # habe es bisher nur mit "After" versucht. Aber da würde ich mich weiter dran machen, so bald der Grundplayer wieder funktioniert. :/
    def get_element_from_status(self, tag):
        t_left = f"<{tag}>"
        t_right = f"</{tag}>"
        title = requests.get(self.urlStatus)
        status_title= title.text
        return status_title[status_title.index(t_left)+len(t_left):status_title.index(t_right)]
    def current_title(self):
        return self.get_element_from_status('name')
    def current_artist(self):
        return self.get_element_from_status('artist')



class TidalPlayerApp:
    def __init__(self):
        self.tidalplayer = Tidalplayer('URL')
        self.main_window = tk.Tk()
        self.main_window.geometry("500x260+100+100")
        self.main_window.title("Tidalplayer")

        self.create_widgets()

    def create_widgets(self):
        self.create_title_frame()
        self.create_button_frame()
        self.create_playlist_frame()
        self.create_volume_buttons()
    
    # Rahmen für Titel
    def create_title_frame(self):
        title_frame = tk.Frame(self.main_window, bg="blue")
        title_frame.pack(side='top', pady=3, padx=10)
        
        title = tk.Label(title_frame, text="kommt")
        title.grid(row=5, column=2, padx=10, pady=10)

# die Images werden nicht angezeigt
    def create_button_frame(self):
        # Rahmen für Tasten
        button_frame = tk.Frame(self.main_window)
        button_frame.pack(padx=10, pady=10)
        #Play Taste
        play_photo = tk.PhotoImage(file="image/play.png")
        play_button = tk.Button(button_frame, image=play_photo, text="Play", command=self.tidalplayer.tidal_music_play)
        play_button.grid(row=0, column=2, padx=10)
        # Pause Taste
        pause_photo = tk.PhotoImage(file="image/pause.png")
        pause_button = tk.Button(button_frame, image=pause_photo, text="Pause", command=self.tidalplayer.tidal_music_pause)
        pause_button.grid(row=0, column=1, padx=10)
        # Weiter Taste
        skip_photo = tk.PhotoImage(file="image/skip.png")
        skip_button = tk.Button(button_frame, image=skip_photo, text="Skip", command=self.tidalplayer.tidal_music_skip)
        skip_button.grid(row=0, column=4, padx=10)
        # Zurück Taste
        back_photo = tk.PhotoImage(file="image/back.png")
        back_button = tk.Button(button_frame, image=back_photo, command= self.tidalplayer.tidal_music_back)
        back_button.grid(row=0, column=0, padx=10 )

        
    
    # Rahmen für Playlist
    def create_playlist_frame(self):
        playlist_frame = tk.Frame(self.main_window, bg='#FFCFC9')
        playlist_frame.place(x=110, y=150, width=280, height=30)
        
        playlist = tk.Listbox(master=playlist_frame, selectmode='browse')
        playlist.pack()

        
    # Lautstärke
    def create_volume_buttons(self):
        [u]der Code funktioniert[/u]
    
    def run(self):
        self.main_window.mainloop()

app = TidalPlayerApp()
app.run()


vielleicht findet ihr einen Fehler der von der Konsole nicht angezeigt wird. Falsches Aufrufen oder so. :(

Bin noch recht am Anfang meines Lernen.

Lieben Dank für alle Mühen im Voraus
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Einer der halben dutzend Klassiker. Du musst deine Bilder festhalten, die werden sonst garbage collected. Das passiert, weil der Name (skip_photo zB) nach Ablauf der Methode create_button_frame wegfaellt, und damit das Photo abgeraeumt. Du musst dir also das Photo mergen in dem Objekt, damit es bleibt. ZB durch Verwendung von "self.skip_photo = ...".
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Konstanten schreibt man komplett gross, also URL und URL_STATUS. Im jetzigen Zustand wird die Klassenkonstaten in __init__ sofort vom Instanzattribut mit selben Namen überdeckt. Warum wird url übergeben, URL_STATUS aber nicht?
Warum schreibst Du einmal Tidalplayer mit kleinem p und einmal TidalPlayerApp mit großen P?
In Zeile 16 ist dann ein Anführungszeichen zu viel. Den Status der Request-Antwort sollte man prüfen und nicht einfach so tun, als ob alles geklappt hat.
Bei der Funktion `tidal_music_play` hat ein einzelnes `self.play` hat kein Wirkung und kann weg. Auf nicht-wahr prüft man mit `not`. Eine Funktion sollte immer explizit etwas zurückgeben, oder in keinem Fall.
XML verarbeitet man nicht als normalen Text, sondern benutzt einen XML-Parser.
Es ist sehr verschwenderisch, für jeden Einzelwert des Status einen neuen Request abzusetzen.

In der Klasse `TidalPlayerApp` ist zumindest die create_widgets-Methode überflüssig. Man gibt keine fixen Fenstergrößen vor, und benutzt kein place; zumal außer für den playlist_frame alle anderen Elemente per pack platziert werden.
ka90cy
User
Beiträge: 3
Registriert: Donnerstag 31. August 2023, 09:07

__deets__ hat geschrieben: Donnerstag 31. August 2023, 09:31 Einer der halben dutzend Klassiker. Du musst deine Bilder festhalten, die werden sonst garbage collected. Das passiert, weil der Name (skip_photo zB) nach Ablauf der Methode create_button_frame wegfaellt, und damit das Photo abgeraeumt. Du musst dir also das Photo mergen in dem Objekt, damit es bleibt. ZB durch Verwendung von "self.skip_photo = ...".

Dankeschön. Das hat mir sehr geholfen. :)
ka90cy
User
Beiträge: 3
Registriert: Donnerstag 31. August 2023, 09:07

Sirius3 hat geschrieben: Donnerstag 31. August 2023, 09:53 - Konstanten schreibt man komplett gross
- Im jetzigen Zustand wird die Klassenkonstaten in __init__ sofort vom Instanzattribut mit selben Namen überdeckt. Warum wird url übergeben, URL_STATUS aber nicht?
- Warum schreibst Du einmal Tidalplayer mit kleinem p und einmal TidalPlayerApp mit großen P?
- In Zeile 16 ist dann ein Anführungszeichen zu viel.
- Den Status der Request-Antwort sollte man prüfen und nicht einfach so tun, als ob alles geklappt hat.
- Bei der Funktion `tidal_music_play` hat ein einzelnes `self.play` hat kein Wirkung und kann weg. Auf nicht-wahr prüft man mit `not`. Eine Funktion sollte immer explizit etwas zurückgeben, oder in keinem Fall.
- XML verarbeitet man nicht als normalen Text, sondern benutzt einen XML-Parser.
- Es ist sehr verschwenderisch, für jeden Einzelwert des Status einen neuen Request abzusetzen.

- In der Klasse `TidalPlayerApp` ist zumindest die create_widgets-Methode überflüssig. Man gibt keine fixen Fenstergrößen vor, und benutzt kein place; zumal außer für den playlist_frame alle anderen Elemente per pack platziert werden.

dankeschön. Werde nach und nach die Kritikpunkte durcharbeiten
Antworten