Aus einer Liste mehrere Soundfiles zufällig abspielen?

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
c.u.r.i.e.
User
Beiträge: 3
Registriert: Samstag 13. Mai 2017, 16:42

Samstag 13. Mai 2017, 19:55

Hallo zusammen,

ich würde gerne verschiedene Dateien, in dem Fall sinds Soundfiles, zufällig aus einer Liste oder ähnlichem Auswählen und abspielen.

Da ich gerade anfange mich reinzuarbeiten und nicht wirklich auf Erfahrung zurückgreifen kann hoffe ich das mir hier jemand den ein oder anderen Tipp geben kann.
Aus den Tutorials die mir bis jetzt unter die Finger kamen wurde ich entweder nicht wirklich schlauer oder sie Funktionierten nicht wie gewünscht.
Oft tun sie es ja irgendwann, wenn man nur lange genug sucht und fummelt.. aber hier bei bin ich leider nicht auf nen grünen Zweig gekommen.

Ich habe mir aus dem was ich bisher einigermaßen durchblicke etwas gebastelt das "soweit" funktioniert, aber ich bin mir sicher das muss anders und vor allem schlanker gehen... :oops:

Code: Alles auswählen

##Wahrscheinlich unwichtig für meine Frage aber der Vollständigkeit halber 
from random import randint
from pygame import *
from tkinter import *

fenster=Tk()    
fenster.title("C.1")
fenster.geometry("1400x900")
img1=PhotoImage (file = "C:/Users/hoo/Desktop/curie/c.png")
Bild=Label (image=img1)
Bild.pack()


##############################Hier beginnt meine "Lösung" dafür..


#Das ist der Quasi zufallsgenerator der eine zahl von 1-4 generiert (ein Überbleibsel eines Tutorials den ich passend zusammengeschnitten habe...)
liste=[]
anzahlElemente = 1
while anzahlElemente > 0:
    hinzu =randint(1,4)
    liste.append(hinzu)
    anzahlElemente = anzahlElemente -1
x=liste[0] 


#Hier beginnt die Abfrage und der Sound wird abgespielt
for zahl in liste:
    if zahl==(1):
        x=zahl
        mixer.init()
        mixer.music.load("C:/Users/hoo/Desktop/Curie/Sound/DuBrauchstEtwasOder.wav")
        mixer.music.play()
        print(1)

for zahl in liste:
    if zahl==(2):
        x=zahl
        mixer.init()
        mixer.music.load("C:/Users/hoo/Desktop/Curie/Sound/Ja.wav")
        mixer.music.play()
        print(2)

for zahl in liste:
    if zahl==(3):
        x=zahl
        mixer.init()
        mixer.music.load("C:/Users/hoo/Desktop/Curie/Sound/wasgibts.wav")
        mixer.music.play()
        print(3)

for zahl in liste:
    if zahl==(4):
        x=zahl
        mixer.init()
        mixer.music.load("C:/Users/hoo/Desktop/Curie/Sound/KannIchIhnenHelfen.wav")
        mixer.music.play()
        print(4)
################# und hier endet sie... 
mainloop()
Höchstwahrscheinlich habe ich nur irgendwas Grundlegendes nicht verstanden, aber ich komm einfach nicht drauf was es ist.. :shock:
Aber wie gesagt bei mir funktioniert so alles, es geht mir eher darum zu lernen wie es besser geht.

Schöne Grüße
Zuletzt geändert von Anonymous am Samstag 13. Mai 2017, 20:19, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Computer.Unterstütztes.Relativ.Inteligentes.Etwas
kurz ... c.u.r.i.e.
Sirius3
User
Beiträge: 8820
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 13. Mai 2017, 20:15

@c.u.r.i.e.: Du machst eine Liste mit einem Element auf sehr komplizierte Weise und fragst dann dieses eine Element auf sehr komplizierte Weise ab. Dazu kopierst Du Code und veränderst nur Kleinigkeiten.

Besser:

Code: Alles auswählen

MUSIC_FILENAMES = [
    "C:/Users/hoo/Desktop/Curie/Sound/DuBrauchstEtwasOder.wav",
    "C:/Users/hoo/Desktop/Curie/Sound/Ja.wav",
    "C:/Users/hoo/Desktop/Curie/Sound/wasgibts.wav",
    "C:/Users/hoo/Desktop/Curie/Sound/KannIchIhnenHelfen.wav",
]

mixer.init()
mixer.music.load(random.choice(MUSIC_FILENAMES))
mixer.music.play()
c.u.r.i.e.
User
Beiträge: 3
Registriert: Samstag 13. Mai 2017, 16:42

Samstag 13. Mai 2017, 21:31

Ja das stimmt, ich bin auch erst dabei mir das anzueignen^^

Aber vielen Dank für die Erleuchtung in Form des Random... da hatte ich wohl ein zwei Bretter vorm Kopf
Computer.Unterstütztes.Relativ.Inteligentes.Etwas
kurz ... c.u.r.i.e.
BlackJack

Sonntag 14. Mai 2017, 01:21

@c.u.r.i.e.: Noch ein paar Anmerkungen zum Quelltext:

Sternchenimporte sind keine gute Idee. Man sieht dann nicht mehr wo welcher Name her kommt, und es besteht die Gefahr von Namenskollisionen.

Namen sollte man nicht abkürzen und auch keine Nummern anhängen. Bei `img1` ist die Nummer überflüssig. Ansonsten sind Nummern in Namen oft ein Zeichen das man keine eigenen Namen sondern eine Datenstruktur verwenden wollte. Nicht selten eine Liste.

Auf Modulebene steht üblicherweise nur Code der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht per Konvention in einer Funktion die `main()` heisst.

Genau wie man keinen Code wiederholen sollte, sind auch redundante Daten eine mögliche Fehlerquelle wenn man Änderungen vornehmen will. Dazu gehören sich wiederholende Teilpfade.

Ich komme dann ungefähr zu so etwas (ungetestet):

Code: Alles auswählen

import os
import random
import tkinter as tk
from pygame import mixer

BASE_PATH = 'C:/Users/hoo/Desktop/Curie'
MUSIC_FILENAMES = [
    'DuBrauchstEtwasOder.wav',
    'Ja.wav',
    'KannIchIhnenHelfen.wav',
    'wasgibts.wav',
]


def main():
    root = tk.Tk()
    root.title('C.1')
    root.geometry('1400x900')
    image = tk.PhotoImage(file=os.path.join(BASE_PATH, 'c.png'))
    tk.Label(image=image).pack()

    mixer.init()
    mixer.music.load(
        os.path.join(BASE_PATH, 'Sound', random.choice(MUSIC_FILENAMES))
    )
    mixer.music.play()

    root.mainloop()


if __name__ == '__main__':
    main()
c.u.r.i.e.
User
Beiträge: 3
Registriert: Samstag 13. Mai 2017, 16:42

Sonntag 14. Mai 2017, 09:17

Danke für die Tipps ich werd drauf achten sowas zu vermeiden

Mal sehen ob ich das im Groben verstanden habe
Alles was ich "laden/einfügen/importieren" will packe ich oben in den Anfang, mit einem Verzeichnis in dem die Daten zufinden sind.
(Was ja auch einen schönen Sinn ergibt, die daten zu haben mit denen man arbeiteten möchte..)
über den Base_Path als verzeichniss kann ich dann die Files zuordnen und nutzen.
Danach die def des main programms in dem mit dem oben geladenen gearbeitet wird, und alles weitere Geregelt ist und
zum Schluss die if main schleife

Wenn ich mehrere nutzen möchte lege ich dann mehrere Pfade an?

Code: Alles auswählen

# Zum Beispiel, wäre das so richtig,
# oder sollte besser alles in einem Verzeichnis stehen und dafür die Liste verlängert werden?


Musik_Verzeichnis = 'C:/Users/hoo/Desktop/Musik'
Musik_Filenames= [
    'sound1.wav',
    'sound2.wav',
    'sound3.wav',
    'sound4.wav',
]


Bilder_Verzeichnis = 'C:/Users/hoo/Desktop/Bilder'
Bilder_Filenames = [
    '1.png',
    '2.png',
    '3.png',
    '4.png',
]


Danke in jedemfall für die Starthilfe in sowas Grundlegendem :? :oops:
Da hab ich auf jedenfall noch viel zu Lernen, wie gut das es euer übersetztes Python Tutorial gibt^^
Computer.Unterstütztes.Relativ.Inteligentes.Etwas
kurz ... c.u.r.i.e.
BlackJack

Mittwoch 17. Mai 2017, 11:34

@c.u.r.i.e.: http://if-schleife.de/

Du wiederholst hier wieder einen Teil des Pfades. Der Sinn von solchen Konstanten ist es ja Datenwiederholungen im Code zu vermeiden, so dass man die einfacher und weniger fehleranfällig Verändern kann, weil man nur an einer Stelle die Änderung vornehmen muss.

Falls die Musikdateien und Bilder jeweils paarweise zusammen gehören, also ``sound1.wav`` zu ``1.png``, ``sound2.wav`` und ``2.png``, und so weiter, dann sollten die nicht in getrennten, ”parallelen” Listen stehen, sondern beispielsweise als Tupel zusammengefasst in *einer* Liste.

Namen von Konstangen werden per Konvention komplett in Grossbuchstaben geschrieben. Ansonsten kommen Grossbuchstaben eigentlich nur in Klassennamen vor. Die werten in ”MixedCase” und ohne Unterstriche geschrieben. Siehe den Style Guide for Python Code.
Antworten