Konsole in GUI- Fenster

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
BlackJack

Beitragvon BlackJack » Montag 21. Januar 2008, 10:34

Wenn die 50 ``while``-Schleifen alle fast gleich aussehen schreibt man natürlich eine Funktion dafür.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Beitragvon mathi » Montag 21. Januar 2008, 11:39

Code: Alles auswählen

def floatx(value):
    try:
        value = float(value)
        return value
        break
    except ValueError:
        print "Na das ist aber keine Zahl!"
   

while True:
    eingabe = raw_input("Eingabewert? ")
    ausgabe=floatx(eingabe)

print ausgabe



Warum funktioniert das nicht? --> Fehler: break in Loop??
BlackJack

Beitragvon BlackJack » Montag 21. Januar 2008, 11:51

Das ``break`` steht nicht in einer Schleife. Es würde allerdings sowieso nie ausgeführt, weil das ``return`` in der Zeile darüber den Ablauf der Funktion ja schon abbricht.

Allerdings hättest Du auf diese Weise immer noch 50 ``while``-Schleifen. Die Schleife sollte man mit in die Funktion stecken. Die 50 Aufrufe sollten dann ungefähr so aussehen:

Code: Alles auswählen

wert = float_input('Eingabewert? ')
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Beitragvon mathi » Montag 21. Januar 2008, 12:05

Das verstehe ich nicht.

jeder Eingabewert hat einen anderen Namen und wird durch einen anderen string hinter raw_input beschrieben.
-> (konntest Du nicht wissen)

Deshalb dachte ich an die obige Lösung, wenn aber die Schleife in der Funktion steckt, müßte auch die Eingabe in der Funktion sein, oder?
Also doch 50 Schleifen? :cry:
BlackJack

Beitragvon BlackJack » Montag 21. Januar 2008, 12:10

Okay, Aufruf der neuen Funktion für zwei verschiedene Werte:

Code: Alles auswählen

radius = float_input('Bitte den Radius eingeben: ')
hoehe = float_input('Und die Hoehe: ')


Zwei Werte die an verschiedene Namen gebunden werden, mit einer eigenen Zeichenkette als Prompt. In der `float_input()` ist weiterhin nur *eine* Schleife.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Beitragvon mathi » Montag 21. Januar 2008, 12:18

Code: Alles auswählen

def float_input(value):
    while True:
        try:
            value = float(value)
            return value
            break
        except ValueError:
            print "Na das ist aber keine Zahl!"
   
radius = float_input('Bitte den Radius eingeben: ')
hoehe = float_input('Und die Hoehe: ')

print radius
print hoehe


Entschuldigung, wenn ich als Anfänger nerve, aber ich steh irgendwie auf dem Schlauch :oops:

Hier wird doch jedesmal ein String in die Funktion übergeben, oder?
Zuletzt geändert von mathi am Montag 21. Januar 2008, 12:30, insgesamt 1-mal geändert.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Beitragvon Zap » Montag 21. Januar 2008, 12:30

Code: Alles auswählen

def float_input(prompt):
    while True:
        try:
            return float(raw_input(prompt))
        except ValueError:
            print "Na das ist aber keine Zahl!"
   
radius = float_input('Bitte den Radius eingeben: ')
hoehe = float_input('Und die Hoehe: ')

print radius
print hoehe


Jetzt klarer? Du darfst natürlich nicht das raw_input vergessen, und mit dem Return kannst du dir das Break sparen, da die Schleife dann nicht mehr weiterläuft.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Beitragvon mathi » Montag 21. Januar 2008, 12:41

Mensch super, vielen Dank, jetzt hab ich es kappiert :idea:
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Beitragvon mathi » Montag 21. Januar 2008, 13:43

BlackJack hat geschrieben:Das "einfachste" wäre es wahrscheinlich so eine "Konsole" aus einem `Text`-Widget für die Ausgaben und einem `Entry` für die Eingaben zu programmieren, und das über Sockets mit Deinem ``print``/`raw_input()` verwendenden Quelltext so zu verbinden, dass `sys.stdin` und `sys.stdout` mit dieser Konsole verbunden sind.

Das Hauptproblem ist, dass bei ``print``/`rawinput()` Dein Programm die zeitliche Abfolge bestimmt, GUIs aber ereignisbasiert sind, d.h. der Anwender letztendlich bestimmt wann welcher Code ausgeführt wird. Beides zu mischen verträgt sich nicht so besonders gut.

Oder Du ersetzt `raw_input()` durch eine Funktion die jedesmal ein Fenster mit dem Prompt und einem Entry aufmacht. Das ist zwar einfacher, aber für den Benutzer eine ziemlich lästige GUI.

Im Idealfall hast Du beim bisherigen Quelltext Anwendungslogik und UI voneinander getrennt. Dann kannst Du Deine GUI Stück für Stück aufbauen. Es ist zwar dann erst zum Schluss der ganze Funktionsumfang verfügbar, aber es gibt immer eine funktionierende Teilmenge davon.



also mein Programm habe ich mir so vorgestellt:

eine Reihe von Buttons, jeder Button startet ein Programm, welches aber in einer Konsole läuft. mehr wollte ich eigentlich nicht. Habe ich eine Chance das mit geringem Aufwand zu schaffen? sonst bleibt die Programmauswahl über eine Variable j=1,2,...,n

edit: ich könnte mir auch eine GUI vorstellen, bei der auf Knopfdruck eine konsole geöffnet wird: in Windows ähnlich dem Befehl cmd und in linux z.B. konsole (KDE) :?:
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Beitragvon nkoehring » Montag 21. Januar 2008, 15:06

mathi hat geschrieben:also mein Programm habe ich mir so vorgestellt:

eine Reihe von Buttons, jeder Button startet ein Programm, welches aber in einer Konsole läuft. mehr wollte ich eigentlich nicht. Habe ich eine Chance das mit geringem Aufwand zu schaffen? sonst bleibt die Programmauswahl über eine Variable j=1,2,...,n

edit: ich könnte mir auch eine GUI vorstellen, bei der auf Knopfdruck eine konsole geöffnet wird: in Windows ähnlich dem Befehl cmd und in linux z.B. konsole (KDE) :?:


Also wenn das alles ist, brauchst du nur die Ausgaben des Programmes abfangen und ausgeben. Bitte beachte aber, das es nicht so einfach ist, dem Programm Eingaben zu verpassen, wenn man sie nicht gleich als Argument uebergeben kann!

Also nochmal der Einfachheit halber:
Argumente sind Parameter, die beim Start uebergeben werden, zB:
programm.exe -arg1 -arg2 -arg3

Stdin heißt Standard-Input. Startest du ein Programm in der Konsole, welches dich nach dem Start zur Eingabe auffordert, dann erfolgt diese Eingabe ueber den Stdin.


Liefern deine Programme die du per Button starten moechtest nur Ausgaben, oder brauchst du auch den Stdin?
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Beitragvon mathi » Montag 21. Januar 2008, 15:44

im Grunde folgt mein Programm bis jetzt folgendem Muster(alles in der Konsole):

j= 0,1,2,...,n (mittels raw_input)

für j=1:
starte Programm 1:
eingabe mit raw_input,
ausgabe mit print,
sichern=file('Ergebnisse.txt','a')
sichern.write( jeweilige Zeile)

Ich möchte mit der GUI wirklich nur den Wert j auswählen, der Rest soll weiter in der Konsole bleiben.

Ich dachte halt an eine Reihe Buttons und darunter ein Konsolefenster - alles in einem Hauptfenster. Und wenn das schlecht geht, dann wollte ich eben als Krücke ein gesondertes Konsolenfenster öffnen :?

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]