zwei Konsolen! Geht das?

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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Code: Alles auswählen

from xturtle import*
x_werte=[]
y_werte=[]
x=-3
while x<=3:
    y=x**2+1
    x_werte.append(x)
    y_werte.append(y)
    goto(x*50,y*50)
    x=x+0.1

for i, x in enumerate(x_werte)):
    print"x: %s, y: %s" % (x, y_werte[i])
the more they change the more they stay the same
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Das sieht nicht sehr elegant aus...

So wäre es schon besser:

Code: Alles auswählen

from itertools import izip
...
for x,y in izip(x_werte, y_werte):
    print"x: %s, y: %s" % (x, y)
Oder gleich in eine Liste packen ist eigentlich noch geschickter.
Mit numpy.arange sieht das dann auch ein bisschen mehr nach Python aus.

Code: Alles auswählen

from xturtle import*
from numpy import arange
werte = []
for x in arange(-3, 3, 0.1):
    y = x**2+1
    werte.append((x, y))
    goto(x*50, y*50)

for x, y in werte:
    print "x: %s, y: %s" % (x, y)
Edit: Außerdem sollte man nie * importieren, sondern immer nur die Module, die du auch benötigst.
Und ja ich weiß, mit numpy könnte man das noch viel eleganter lösen ;)
Zuletzt geändert von ms4py am Dienstag 3. November 2009, 18:16, insgesamt 1-mal geändert.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

ice2k3 hat geschrieben:Das sieht nicht sehr elegant aus...
Da hast du wohl recht.

Das mit den Tupeln hab ich gesucht, is mir aber einfach nicht eingefallen :roll:
the more they change the more they stay the same
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Oder so (ohne numpy):

Code: Alles auswählen

def arange2(start, stop, interval):
    i = start
    while i <= stop:
        yield i
        i += interval

werte = [(x, x**2+1) for x in arange2(-3, 3, 0.1)]
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

vielen dank Dav1d und ice2k3
eure lösung funktioniert (habe sie etwas "unelegant" :D verändert)
allerdings möchte ich die tabelle nicht in dieser konsole, sondern mithilfe von easygui (ich hoffe, ihr kennt das) erstellen
das sieht dann etwa so aus:

Code: Alles auswählen

from xturtle import*
import easygui as g
x_werte=[] 
y_werte=[] 
x=-3 
while x<=3: 
    y=x**2+1 
    x_werte.append(x) 
    y_werte.append(y) 
    goto(x*50,y*50) 
    x=x+0.1 


###for i,x in enumerate(x_werte): 
###    print"x:"+str(x)+" y:"+str(y_werte[i])

text=g.codebox("aaaaaaaa","bbbbbbbbb",
"""x hat den wert: """+"###"+"""
x= y=
.............
.............""")
das was nach den ### kommt soll sozusagen irgendwie in diese codebox gepackt werden
weis einer wie das gehen könnte???

mfg
LP640
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Zu was mach ich mir eigentlich die Mühe, dir bessere Lösungen vorzuschlagen, wenn du diese eh ignorierst...

Mit meiner Lösung kannst du den Text so erstellen.

Code: Alles auswählen

text = '\n'.join('x: %s, y: %s' % (x,y) for x, y in werte)
Zuletzt geändert von ms4py am Dienstag 3. November 2009, 18:49, insgesamt 1-mal geändert.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

LP640 hat geschrieben:allerdings möchte ich die tabelle nicht in dieser konsole, sondern mithilfe von easygui (ich hoffe, ihr kennt das) erstellen
Ich "kenne" EasyGui und es ist ekelig und überflüssig.
Stattdessen kannst du z.B.
- mittels xturtle direkt auf die Zeichenfläche schreiben und dir so eine Tabelle konstruieren
- oder statt xturtle das frog-Modul einsetzen (such mal im Forum danach) und dann die Zeichenfläche entweder in eine Tkinter-GUI einbinden und dort z.B. ein Text-Widget für die Ausgabe der Wertetabelle verwenden
- oder das frog-Modul einsetzen und dort direkt in die Zeichenfläche schreiben. Das geht damit eigentlich ganz gut. Ansatz dazu (zum selber weiterentwickeln) im Code unten:

Code: Alles auswählen

from frog import Pool, Frog

blatt = Pool(width=600, height=1000)
stift = Frog(blatt, visible=False)
# Punkte berechnen
punkte = [(.1*x,(.1*x)**2+1) for x in xrange(-30,30)]
# Parabel Zeichnen
faktor = 50
x0, y0 = punkte.pop(0)
stift.pos = faktor*x0, faktor*y0
for x,y in punkte:
    stift.moveto(faktor*x, faktor*y)
# Wertetabelle anzeigen
stift.pos = -50,0
zeilenhoehe = stift.textsize("1")[1]+5 # px
for punkt in punkte:
    stift.y -= zeilenhoehe
    stift.write("%.2f | %.2f" %punkt)
blatt.ready()
Zum frog-Modul gibt es eine ausführliche dt. Doku.
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

naja also so wie ich das dann verändert habe verstehe ich selber am besten, das ergebnis ist ja das gleiche und für das, was ich damit bewirken will reicht es jedenfalls
trotzdem danke für deine verbesserungvorschläge
aber weis den jetzt jemand wie das mit easygui geht???

oh schon wieder ne neue antwort da:
das mit frog ist ja eigentlcih das selbe wie mit xturtle (frog kenn ich seit neuem auch schon)
das problem ist ja, dass die gesamte tabelle nicht sichtbar ist, da man nicht runterscrollen kann.

also am liebsten wäre mir wirklich das mit easygui wie beschrieben
hat jemand ne idee?

mfg
LP640
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

oh ice2k3 tut mir echt leid :cry: ich hab irgendwie deine Lösung mit dem code übersehen
vielen dank klappt prima
:D
mfg
LP640
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

LP640 hat geschrieben:das mit frog ist ja eigentlcih das selbe wie mit xturtle (frog kenn ich seit neuem auch schon)
Nicht dasselbe, aber vergleichbar. Ich mag den Frosch lieber als die Kröte, aber das ist sicher Geschmackssache und hat auch damit zu tun, was genau man machen möchte.

Richtig ist: Die Zeichenfläche des frog-Moduls ist nicht scrollbar, die von xturtle (= turtle für Python > 2.5) IMHO schon. Einer meiner Vorschläge war deshalb auch Tkinter-GUI mit Text-Widget für die Wertetabelle (oder auch Listbox), die sich scrollen lassen und eine eingebettete Zeichenfläche, z.B. als frog-Zeichenfläche oder auch ein reines Tkinter-Canvas. Da sind die Zeichenbefehle zwar nicht ganz so eingängig wie bei xturtle/frog, aber wenn es nur um das Zeichnen eines Graphen geht, ist da ja auch nicht viel zu machen.
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

so ich bin jetzt so weit mit meiner "Tabelle":

Code: Alles auswählen

from xturtle import*
import easygui as g
funk1="x**2+1"
funk2="x**3-2"
funk3="x**4-1"
funk4="-x**2"
funk5="2"
start=-3
stop=3
step=0.01
x=start
while x<=stop:
    y=x**2+1
    goto(x*50,y*50) 
    x=x+0.1 

def kogi():
    a=start
    while a<=stop:
        yield a
        a=a+step
        

werte=[(x,eval(funk1),eval(funk2),eval(funk3),eval(funk4),eval(funk5))for x in kogi()]
text=g.codebox("Tabelle","bbbbbbbbb","\n".join("x:"+str(x)+"     y1:"+str(y1)+"          y2:"+str(y2)+"          y3:"+str(y3)+"          y4:"+str(y4)+"          y5:"+str(y5) for x,y1,y2,y3,y4,y5 in werte))
ich hab ein paar sachen leicht verändert, in der tabelle befinden sich nun ein x wert und fünf y werte
logischerweise sind diese werte zum beispiel von y3 nicht genau untereinander, da die zahlen mit ihren nachkommastellen ja nicht immer gleich lang sind.
gibt es trotzdem eine möglichkeit dies zu umgehen und die jeweiligen werte genau untereinander zu ordnen??? :?:

mfg
LP640
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

LP640 hat geschrieben:gibt es trotzdem eine möglichkeit dies zu umgehen und die jeweiligen werte genau untereinander zu ordnen??? :?:
Sieh dir meinen Code an, dann weißt du wie es geht.
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

tut mir echt leid, ich bin wahrscheinlich zu ****, um das zu erkennen :?
kannst du mir auf die sprünge helfen???

mfg
LP640
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Du solltest grundsätzlich immer String-Formatierung anstatt String-Konkenation mit +-operator verwenden.

In diesem Fall könnte dir die Stringformatierung auch konkret weiterhelfen. Du kannst z.B. immer gleich viele Nachkommastellen pro Wert darstellen, das geht so:

Code: Alles auswählen

In [1]: a = 1.23456

In [2]: '%.2f' % a
Out[2]: '1.23'

In [3]: '%.3f' % a
Out[3]: '1.235'
Wie du siehst wird dabei auch richtig gerundet.

Und verwende dann Tabs (``\t``) und nicht mehrere Spaces für die Abstände, das ist viel eleganter.
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

vielen dank ice2k3
ich hab nur vorher nie mit diesen %-Dingern oder wie das heißt
gearbeitet.
gibt es dazu vielleicht irgendwo eine beschreibung oder ein tutorial zu???

mfg
LP640
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

LP640 hat geschrieben:gibt es dazu vielleicht irgendwo eine beschreibung oder ein tutorial zu???
Dafür gibt es die Dokumentation die auch gleich die neue String Formatting Methode beschreibt.
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

Du solltest grundsätzlich immer String-Formatierung anstatt String-Konkenation mit +-operator verwenden.

In diesem Fall könnte dir die Stringformatierung auch konkret weiterhelfen. Du kannst z.B. immer gleich viele Nachkommastellen pro Wert darstellen, das geht so:
Code: (Python)
1
2
3
4
5
6
7
In [1]: a = 1.23456

In [2]: '%.2f' % a
Out[2]: '1.23'

In [3]: '%.3f' % a
Out[3]: '1.235'

Wie du siehst wird dabei auch richtig gerundet.

Und verwende dann Tabs (``\t``) und nicht mehrere Spaces für die Abstände, das ist viel eleganter.
ja das sieht damit schon besser aus allerdings sind die werte nicht immer genau untereinander, da sich auch die stellen vor dem komma voneinander unterscheiden.
gibt es dafür eine lösung???

mfg
LP640
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

LP640 hat geschrieben:ja das sieht damit schon besser aus allerdings sind die werte nicht immer genau untereinander, da sich auch die stellen vor dem komma voneinander unterscheiden.
gibt es dafür eine lösung???
Ja.
Und wo du suchen musst, ist dir schon mitgeteilt worden.
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

hallo
wenn du die beiden links von DasIch meinst, die hab ich mir beide bereits durchgelesen, konnte jetzt aber nichts finden, was mein problem löst.

mfg
LP640
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

LP640 hat geschrieben:wenn du die beiden links von DasIch meinst, die hab ich mir beide bereits durchgelesen, konnte jetzt aber nichts finden, was mein problem löst.
Meinte ich. In der Tat täten ein paar Beispiele den dortigen Erklärungen gut. Nun denn:

Code: Alles auswählen

>>> a, b = 23.123, 0.1231334
>>> print "%8.5f\n%8.5f" %(a,b)
23.12300
 0.12313
Antworten