entschuldigt bitte den nicht aussagekräftigen Titel. Da mir im Moment das Know How für eine bestimmte Fragestellung fehlt, ist mir jetzt einfach nichts gescheiteres/dümmeres eingefallen. Ich werde ihn (wenn möglich) ändern sobald mir ein besserer eingefallen ist.
Ok, nachdem ich nun schon eine ganze Weile mitlese hab ich mir vorgenommen in einem Projekt mal selbst mit Python aktiv zu werden. Das Ergebnis soll ein GTK-Frontend zu MPlayer und einigen Encodertools (oggenc,mencoder,lame) werden.
Nun hab ich ausgehend vom "Hello World" von pygtk.org angefangen nach und nach ein bisschen Funktion in die ganze Sache zu bringen. (mit mäßigem Erfolg)
Lange Rede kurzer Sinn, hier erstmal der Code:
Code: Alles auswählen
#!/usr/bin/python
# -*- encoding: latin-1 -*-
# vim: sw=4 ts=4 fdm=indent et
import subprocess, sys, gtk
gtk_check = gtk.check_version(2, 4, 0)
if gtk_check:
print gtk_check
sys.exit()
playshell = subprocess.Popen("/bin/sh", shell=False, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
class MainWin(gtk.Window):
counter = 1
def __init__(self, parent=None):
gtk.Window.__init__(self)
try:
self.set_screen(parent.get_screen())
except AttributeError:
self.connect('destroy', lambda *w: gtk.main_quit())
self.set_title('MRekorder')
self.set_border_width(3)
self.set_resizable(False)
self.set_icon_from_file('icons/icon32.png')
self.set_geometry_hints(min_width=200,
min_height=350,
max_width=200,
max_height=350)
frame1 = gtk.Frame()
frame1.set_label('Abspielen')
vbox1 = gtk.VBox(False, 2)
vbox2 = gtk.VBox(True, 2)
playbtn = gtk.Button("_Play")
playbtn.connect("clicked", self.on_play_clicked)
hbox1 = gtk.HBox()
prevbtn = gtk.Button("<< Pre_v")
prevbtn.connect("clicked", self.on_prevbtn_clicked)
stopbtn = gtk.Button("_Stop")
stopbtn.connect("clicked", self.on_stop_clicked)
nextbtn = gtk.Button("_Next >>")
nextbtn.connect("clicked", self.on_next_clicked)
hbox1.add(prevbtn)
hbox1.add(stopbtn)
hbox1.add(nextbtn)
vbox2.add(playbtn)
vbox2.add(hbox1)
frame1.add(vbox2)
frame2 = gtk.Frame()
frame2.set_label('Info')
frame3 = gtk.Frame()
frame3.set_label('Aufnehmen')
self.recbtn = gtk.ToggleButton("_Rec")
self.recbtn.connect("clicked", self.on_rec_clicked)
frame3.add(self.recbtn)
vbox1.pack_start(frame1, expand = False, fill = True, padding = 0)
vbox1.pack_start(frame2, expand = True, fill = True, padding = 0)
vbox1.pack_end(frame3, expand = False, fill = True, padding = 0)
self.add(vbox1)
self.show_all()
# Die Buttons sollen ja schliesslich auch etwas bezwecken ^^
def on_prevbtn_clicked(self, widget):
playshell.stdin.write("pt_step -1\n")
def on_stop_clicked(self, widget):
playshell.stdin.write("quit\n")
def on_play_clicked(self, widget):
audioout = "oss"
to_listen = "/mnt/mugge/interpreten/jbo/jbo*"
mplay = "mplayer -slave -quiet -ao %s %s" % (audioout, to_listen)
playshell.stdin.write(mplay+"\n")
def on_next_clicked(self, widget):
playshell.stdin.write("pt_step +1\n")
def on_rec_clicked(self, widget):
status = self.recbtn.get_active()
if status == True:
outputpath = "$HOME/record"
mrec = "sox -t ossdsp -w -s -r 44100 -c 2 /dev/dsp -t raw - | lame -x -m s - "\
+outputpath+"/mitschnitt-$(date +'%m''%d'_'%H'-'%M').mp3"
self.mrec_proc = str(subprocess.Popen(mrec, shell=True).pid)
else:
mrec_kill = "killall sox"
subprocess.Popen(mrec_kill, shell=True)
def main():
MainWin()
gtk.main()
if __name__ == '__main__':
main()
Nun hab ich dazu folgende Probleme:
1. Beim Klick auf Play z.B. geht der Prozess ja in den Hintergrund und sollte per return den stdin, stdout und stderror zurückgeben. (Oder?)
Wie kann ich jetzt die Befehle für Stop, Prev und Next an stdin von mplay schicken?
2. Im Moment teilen sich die 3 Bereiche text, buttons und Status das Fenster zu gleichen Teilen, was ja nun alles andere als Ansehnlich und Zweckmäßig ist. Wie kann ich festlegen, dass die Statusleiste und die Buttons eine feste Höhe haben?
Wäre echt super, wenn ihr mir in dem Fall mal aus der Sackgasse helfen könntet. Je mehr ich jetzt versuche diese Probleme zu lösen desto mehr Fragen kommen mir in den Sinn.
Danke schonmal!
Gruß
ello