Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
Hey, ich versuche einen Wecker zu programmieren. Dieser soll die Sound-Datei beim Weckvorgang immer wiederholen, bis "Stop" gedrückt wird, das Ganze (Start/Stop) funktioniert bisher nur, wenn ich die Wiederholung rauslasse (while Schleife raus), mit while-Schleife klappt es nicht, weil der Prozess dann in der Schleife hängt und das Stop-Signal nicht verarbeiten kann, deshalb dachte ich, ich forke den Prozess einfach, aber das klappt auch nicht und ich verstehe nicht warum. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 | #!/usr/bin/python3
from tkinter import *
from pygame import mixer
import os
import time
import datetime
fenster = Tk()
#Labels
Label(fenster, text="Weck-Ton (mp3)").grid(row=3)
#Eingaben
weck_ton_eingabe = Entry(fenster)
weck_ton_eingabe.grid(row=3,column=1)
def start():
weck_ton = weck_ton_eingabe.get()
mixer.init()
mixer.music.load(weck_ton)
newRef=os.fork()
if newRef!=0 :
while True:
mixer.music.play()
while mixer.music.get_busy():
time.sleep(1)
def stop():
mixer.music.stop()
start = Button(fenster, text="Start", command=start)
start.grid(row=4,column=1)
start = Button(fenster, text="Stop", command=stop)
start.grid(row=5,column=1)
mainloop()
|
Außerdem verstehe ich nicht, warum ich keine Musik höre, wenn ich if newRef==0 : benutze, der Child-Prozess müsste das doch genauso abspielen. Vielen Dank und Viele Grüße, Frink
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
Du darfst in Event-getriebenen Umgebungen keine Endlosschleifen an der Mainloop vorbei verbauen (zumindest nicht ohne das in Threads auszulagern) - tkinter benötigt die Möglichkeit regelmäßig die Benutzer-Eingaben zu verarbeiten, um auf den Stop-Button reagieren zu können. pygame erledigt das endlose Abspielen einer Datei für dich, ohne die Mainloop zu blockieren, wenn du mixer.music.play(-1) nutzt: http://www.nerdparadise.com/programming/pygame/part3. Wenn ich dich richtig verstehe, willst du einfach die MP3-Datei endlos spielen lassen, bis die Stop-Taste gedrückt wird: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 | #!/usr/bin/python3
from tkinter import *
from pygame import mixer
import time
import datetime
fenster = Tk()
#Labels
Label(fenster, text="Weck-Ton (mp3)").grid(row=3)
#Eingaben
weck_ton_eingabe = Entry(fenster)
weck_ton_eingabe.grid(row=3,column=1)
def start():
weck_ton = weck_ton_eingabe.get()
mixer.init()
mixer.music.load(weck_ton)
mixer.music.play(-1)
def stop():
mixer.music.stop()
start = Button(fenster, text="Start", command=start)
start.grid(row=4,column=1)
start = Button(fenster, text="Stop", command=stop)
start.grid(row=5,column=1)
mainloop()
|
|
Prof._Frink
(Themenstarter)
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
Okay, das ist ja einfach.
Du darfst in Event-getriebenen Umgebungen keine Endlosschleifen an der Mainloop vorbei verbauen (zumindest nicht ohne das in Threads auszulagern)
Ich dachte ja gerade, dass ich das durch fork() auslagern könnte. Wenn mir noch jemand sagen kann, wieso das nicht funktioniert, wäre super. Aber ich setze mal auf gelöst. Danke & Viele Grüße, Frink
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11181
Wohnort: München
|
Ich muss gestehen, dass ich mit dem Verständnis der Interna von X-Clients so meine Schwierigkeiten habe, aber deren Prozesse per fork zu duplizieren, wenn die bereits eine Verbindung zum X-Server haben, riecht nach Ärger. Ich habe da auf die Schnelle https://bugs.python.org/issue5527 gefunden. Da wird beschrieben, dass es funktioniert, wenn man tkinter nach dem Fork in einem Prozess importiert.
|
Prof._Frink
(Themenstarter)
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
|