Konsole umleiten in wxFenster

Plattformunabhängige GUIs mit wxWidgets.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Erst mal Danke, das Du dich um mich kümmerst. Habe aber leider schlechte Nachrichten, auch das geht leider nicht. Das Feld bleibt einfach leer, aber cdda2wav startet. Das wars aber auch schon. Immer noch keine Ausgabe im Fenster :(
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

The Hit-Man hat geschrieben:auch das geht leider nicht
Hallo Hit-Man!

Aber mit "DIR" funktioniert die Ausgabe?

Erwartet CDDA2WAV irgendetwas an STDIN? Mit welchen Parametern hast du CDDA2WAV genau gestartet?

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

ja, mit "dir" geht es. Aber vermutlich nur, wenn dir auch abgearbeitet ist. Das wäre ja das gleiche, wenn ich "dir >> ausgabe.txt" nehmen würde.
Erwartet CDDA2WAV irgendetwas an STDIN? Mit welchen Parametern hast du CDDA2WAV genau gestartet?
Eigentlich kannste cdda2wav.exe direkt in der Konsole starten, ohne Parametern und es erwartet auch keine Tasteneingabe oder so. Habe so das gefühl, so lange das Programm noch nicht fertig ist, wird auch keine Ausgabe auf das Fenster erfolgen :(
Hätte nicht gedacht, das ich damit so verzweifle. K3B setzt ja auch auf cdrecord usw. auf. Die müssen das doch ganz genau so gemacht haben, wie ich es jetzt versuchen möchte.
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Was mir gerade beim Nachvollziehen aufgefallen ist ... Ich habe mal "emerge -av amarok" eingegeben und ebenfalls keine Rückmeldung erhalten, nur daß der Thread sich gleich wieder beendet hat (unteres Fenster). Dann ist mir eingefallen, daß der User, mit dem ich die Demo ausgeführt habe keine Berechtigung hat, emerge auszuführen. Überprüfe also sicherheitshalber auch noch mal die Ausführungsrechte, auch wenn es wahrscheinlich nicht daran liegt.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

naja, bin unter Windows 2k ( Admin ). Ich kann das Programm ja locker aus der Konsole starten.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

The Hit-Man hat geschrieben:Habe so das gefühl, so lange das Programm noch nicht fertig ist, wird auch keine Ausgabe auf das Fenster erfolgen
Hallo Hit-Man!

Also ich bin immer davon ausgegangen, dass du überhaupt keine Rückgabe erhälst -- auch nicht, wenn das Programm fertig ist?

Wenn dem nicht so ist, dann liegt es am Caching des aufgerufenen Programms. Was dann zu tun ist, kann man diskutieren, wenn diese Frage geklärt ist.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Doch, Programme die fertig sind, liefern was zurück, wie zum Beispiel "dir" usw. Das wäre ja auch eine einfache Sache. Da hätte ich mir die Ausgaben einfach in eine Datei schreiben können ;)
Aber sieh mal cdda2wav hat doch extra ne Option --gui und der Programmierer hat doch damit GUIs berrücksichtigt. Das mit dem mit Cachen, habe ich auch schon gehört. Soll aber trotzdem irgendwie gehen. Sitze gerade auch noch im C# Forum. Aber auch da, leider keine brauchbaren Lösungen.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

The Hit-Man hat geschrieben:Doch, Programme die fertig sind, liefern was zurück, wie zum Beispiel "dir" usw. Das wäre ja auch eine einfache Sache.
Hallo Hit-Man!

Ich will nur wissen, ob dieses CDdingsbums-Programm etwas an das wxPython-Programm zurück liefert, wenn es fertig ist.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Das dauert ja ewig ;) würde ja ne ganze CD ausslesen müssen. Können wir uns nicht auf ein anderes Tool einigen? vielleicht cdrecord? Das lag auch dabei und gibt auch Ausgaben von sich ;)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

The Hit-Man hat geschrieben:Das dauert ja ewig ;) würde ja ne ganze CD ausslesen müssen.
Hallo Hit-Man!

Wie solltest du denn sonst rausfinden, ob das Problem am Caching des anderen Programmes oder sonst wo liegt? Leg' eine CD ein und leg los. :-)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

OK, hast gewonnen. Machst dir auch voll die Mühe dafür. Ich suche mal eine mit wenigen Tracks. Und sagte dir dann später bescheid. Bin gerade erst nach hause gekommen und hatte hier noch etwas zu tun ;)
EDIT:
mist, habe den schlepptop gar nicht @home
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

@gerold:
Modifying the default redirect behavior
In order to modify this behavior, wxPython allows you to set two parameters
when creating the application. The first parameter, redirect, causes output to be
redirected to the frame if it is True. If the value is False, output stays at the con-
sole. If the redirect parameter is True, then the second parameter, filename,
can also be set. If so, output is redirected to a file with that name, rather than to
the wxPython frame.
?

(Aus wxPython in Action)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

str1442 hat geschrieben:@gerold:
Hallo str1442!

Sorry, wenn das jetzt kaltschnäuzig rüber kommt. :-)

Ich habe noch niemanden kennengelernt, der ein GUI-Programm als Wrapper für ein Konsolenprogramm schreiben will, der die Ausgabe einfach wahllos in das meist unerwünschte STDOUT-Fenster von wxPython schreiben wollte. Dieses Fenster poppt einfach so auf und schiebt sich vor das eigentliche Programmfenster. Das ist OK um einen Fehler zu protokollieren oder ein Programm zu debuggen, lässt einem aber ansonsten keine Designmöglichkeiten.

mfg
Gerold
:-)

PS: Ok, das war ein wenig überspitzt formuliert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

ja genau, so habe ich es auch vor. Allerdings nur ein Button und fertig. Soll nur ne kleine Hilfe für Freundin sein.

so, hier die Ausgabe, wenn ich cdda2wav komplett ausgeführt habe ( nimmt defaultmäßig doch nur den ersten Track ) und siehe da, es kommt auch was ;) Allerdings erst, wenn sich das Programm beendet hat

Code: Alles auswählen

No target specified, trying to find one...
Using dev=1,0,0.
Type: ROM, Vendor 'MATSHITA' Model 'DVD-ROM SR-8175 ' Revision 'G228' MMC+CDDA
983040 bytes buffer memory requested, transfer size 64512 bytes, 4 buffers, 27 sectors
#Cdda2wav version 2.01.01a44_cygwin32_nt_1.5.25(0.156-4-2)_i686_i686, soundcard, libparanoia support
cdda2wav: Input/Output error. ReadStandard10: scsi sendcmd: no error
CDB:  28 00 00 05 38 B9 00 00 01 00
status: 0x2 (CHECK CONDITION)
Sense Bytes: F0 00 05 00 05 38 B9 0A 00 00 00 00 64 00 00 00 00 00
Sense Key: 0x5 Illegal Request, Segment 0
Sense Code: 0x64 Qual 0x00 (illegal mode for this track) Fru 0x0
Sense flags: Blk 342201 (valid) 
cmd finished after 0.561s timeout 60s
cdda2wav: Input/Output error. ReadStandard10: scsi sendcmd: no error
CDB:  28 00 00 05 38 7E 00 00 01 00
status: 0x2 (CHECK CONDITION)
Sense Bytes: F0 00 05 00 05 38 7E 0A 00 00 00 00 64 00 00 00 00 00
Sense Key: 0x5 Illegal Request, Segment 0
Sense Code: 0x64 Qual 0x00 (illegal mode for this track) Fru 0x0
Sense flags: Blk 342142 (valid) 
cmd finished after 0.060s timeout 60s
AUDIOtrack pre-emphasis  copy-permitted tracktype channels
      1-19           no              no     audio    2
 DATAtrack recorded      copy-permitted tracktype
     20-20 uninterrupted             no      data
Table of Contents: total tracks:20, (total time 76:01.51)
  1.( 1:55.60),  2.( 4:20.55),  3.( 3:28.49),  4.( 4:58.71),  5.( 4:28.55),
  6.( 3:27.52),  7.( 4:14.68),  8.( 4:04.65),  9.( 3:27.00), 10.( 5:07.33),
 11.( 4:26.56), 12.( 3:39.36), 13.( 3:39.31), 14.( 4:05.57), 15.( 3:14.39),
 16.( 4:16.07), 17.( 3:27.65), 18.( 2:20.09), 19.| 4:36.68|, 20.[ 0:08.00],

Table of Contents: starting sectors
  1.(     600),  2.(    9285),  3.(   28840),  4.(   44489),  5.(   66910),
  6.(   87065),  7.(  102642),  8.(  121760),  9.(  140125), 10.(  155650),
 11.(  178708), 12.(  198714), 13.(  215175), 14.(  231631), 15.(  250063),
 16.(  264652), 17.(  283859), 18.(  299449), 19.(  309958), 20.(  342126),
 lead-out(  342726)
CDINDEX discid: YjYGJzE9MXbJUUQJJSpYFGNEZRw-
CDDB discid: 0x2c11d114
CD-Text: not detected
CD-Extra: not detected
samplefile size will be 20427164 bytes.
recording 115.7999 seconds stereo with 16 bits @ 44100.0 Hz ->'audio'...
cdda2wav: No realtime priority possible.
percent_done:
  0%
  0%
  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%
 41%
 42%
 43%
 44%
 45%
 46%
 47%
 48%
 49%
 50%
 51%
 52%
 53%
 54%
 55%
 56%
 57%
 58%
 59%
 60%
 61%
 62%
 63%
 64%
 65%
 66%
 67%
 68%
 69%
 70%
 71%
 72%
 73%
 74%
 75%
 76%
 77%
 78%
 79%
 80%
 81%
 82%
 83%
 84%
 85%
 86%
 87%
 88%
 89%
 90%
 91%
 92%
 93%
 94%
 95%
 96%
 97%
 98%
 99%
100%  track  1 recorded successfully
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

The Hit-Man hat geschrieben:so, hier die Ausgabe, wenn ich cdda2wav komplett ausgeführt habe ( nimmt defaultmäßig doch nur den ersten Track ) und siehe da, es kommt auch was ;) Allerdings erst, wenn sich das Programm beendet hat
Hallo Hit-Man!

Und jetzt die Möglichkeiten, die ich kennen.

1.) Du fütterst cdda2wav mit den einzelnen Tracks und bekommst erst dann eine Meldung zurück, wenn ein einzelner Track fertig ist. Ich glaube, aus dem Quellcode von jripper entnommen zu haben, dass die es genau so machen. Das ist wohl die einfachste Lösung.

2.) Du nimmst Linux, denn damit kannst du eine Konsolenanwendung vortäuschen und bekommst die Rückgabe sofort.

3.) Du schreibst die Autoren des Programmes ccda2wav an und fragst nach, ob sie eine Möglichkeit kennen, wie man die Rückgabe unter Windows sofort bekommt oder ob sie einen Kommandozeilenparameter zur Verfügung stellen können, mit dem das Programm nach jeder Ausgabe einen Flush durchführt.

Wie gesagt, das sind die Möglichkeiten, die ich kenne. Mal sehen, was die Anderen dazu zu sagen haben.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

danke erst mal ;) Ich glaube ich werde die einfach mal antickern. Die Sache ist ja die, die Idee erst eine Konsolenanwendung zu schreiben und später nen Fenster drum zu machen, finde ich ja gar nicht mal so schlecht ;) Könnte mir so etwas öfters vorstellen, bei Konsolenprogrammen. Die Dinger gibt es in der *nix Welt noch und nöcher, was ich auch supi finde. Kannste mal eben per ssh, alles machen, brauchst nicht mal nen X. Die meisten Tools bekommste ja auch für Windows mit der cygwin dll. Würde an einigen noch gerne nen Fenster drum machen. Dachte eher, es gab da so eine Standartlösung, mal eben die Programme umzubiegen. K3B ( Brennprogramm unter KDE ), setzt auch auf cdrecord (Konsole) auf. Und warum sich den Arsch brechen, wenn die Programme eh schon alle fertig sind ;)
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Hi,
ich muss mich mal an die Diskussion ranhängen. Ich will an diesem Wochenende einen kleinen Frontend für avrdude schreiben damit ich etwas testen kann ohne dauernd die Konsole zu bemühen.

Dafür will ich aber nicht nur die Ausgaben von avrdude in ein Fenster umleiten sondern auch nach Meldungen durchsuchen um eventuell darauf zu reagieren.

Ich habe mir den Thread jetzt noch nicht ganz durchgelesen, aber das werde ich am Wochenende noch tun. Kann ich die Meldungen irgendwie doppelt auswerten oder muss ich das Textfeld durchsuchen lassen? Vielleicht mit einem OnEdit Event oder wie auch immer der heißen mag?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

burli hat geschrieben:Dafür will ich aber nicht nur die Ausgaben von avrdude in ein Fenster umleiten sondern auch nach Meldungen durchsuchen um eventuell darauf zu reagieren.
Hallo burli!

Kein Problem. Du bekommst den Text jeder Zeile, noch bevor sie in das TextCtrl geschrieben wird.

Das hier z.B. wäre ein guter Einstiegspunkt:

Code: Alles auswählen

    def statuslog_function(self, logentry):
        wx.CallAfter(self.textctrl.AppendText, logentry)
ACHTUNG! Achte darauf, dass diese Funktion im Kontext des Arbeitsthreads ausgeführt wird und nicht im Hauptthread, der für die GUI zuständig ist. Wenn du von hier aus etwas mit der GUI machst, dann musst du dich um Threadtrennung (z.B. mit ``wx.CallAfter``) kümmern. Oder du gehst auf Nummer Sicher und leitest sofort an eine andere Funktion weiter:

Code: Alles auswählen

    def statuslog_function(self, logentry):
        wx.CallAfter(self.threadsafe_statuslog_function, logentry)


    def threadsafe_statuslog_function(self, logentry)
        # logentry prüfen
        #...
        
        # logentry anzeigen
        self.textctrl.AppendText(logentry)
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Auch wenn es hier nicht hingehört, habe ein Beispiel in C# gefunden. Wenn ich extern den cmd.exe ausführe, kann ich auch alles auslesen, allerding wenn ich cdda2wav starte, bleibt das programm beim ReadLine() stehen und kommt da nicht wieder raus :( Also es funtzt auch in C# nur halbwegs:

Code: Alles auswählen

using System;
using System.Windows.Forms;

namespace umleit_2
{
	/// <summary>
	/// Description of Tools.
	/// </summary>
	public class Tools
	{
		public void startExtern ()
		{
			System.Diagnostics.Process Anwendung = new System.Diagnostics.Process(); 
			Anwendung.StartInfo.FileName = ("cdda2wav");
			Anwendung.StartInfo.CreateNoWindow = true;
			Anwendung.StartInfo.RedirectStandardInput = true;
			Anwendung.StartInfo.RedirectStandardOutput = true;
			Anwendung.StartInfo.RedirectStandardError = true;
			Anwendung.StartInfo.UseShellExecute = false;
			Anwendung.Start ();
			
			System.IO.StreamWriter StdIn = Anwendung.StandardInput;
			StdIn.AutoFlush = true;
			
			System.IO.StreamReader StdOut = Anwendung.StandardOutput;
			System.IO.StreamReader StdErr = Anwendung.StandardError;

			string sTemp;
			StdOut.ReadLine();

			//MessageBox.Show(StdOut.ReadLine(), "Befehlszeileninterpreter");
		}
	}
}
Antworten