Optimierung meines Codes.

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.
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Und ich arbeite hart und gar die ganzen Tage. Ich sehe nur noch Python Syntax^^

Gleich vorab es geht um Python nicht um Pygame.
Folgendes Problem, in Pygame ist es nicht möglich einen new line text auszugeben. Ist schade, aber ist nun mal so.

Deswegen will ich mir mit Python Abhilfe schaffen und schreibe gerade eine Funktion, die die Zeilen aus einer Textdatei ausliest. (Was für mich sehr praktisch wäre).

Folgender Snippet:

Code: Alles auswählen

    
f = open("Template.txt", "r")
text = f.readlines()

font = pygame.font.Font(None, 30)


text[0] = text[0][0:-1]
text[1] = text[1][0:-1]
text[2] = text[2][0:-1]
text[3] = text[3][0:-1]
text[4] = text[4][0:-1]

name = font.render(text[0], 1, (255, 255, 255))
name2 = font.render(text[1], 1, (255, 255, 255))
name3 = font.render(text[2], 1, (255, 255, 255))
name4 = font.render(text[3], 1, (255, 255, 255))
name5 = font.render(text[4], 1, (255, 255, 255))

screen.blit(name, (0, 0))
screen.blit(name2, (0, 20))
screen.blit(name3, (0, 40))
screen.blit(name4, (0, 60))
screen.blit(name5, (0, 80))


Kann man das irgendwie mit variablen und mit FOR IN managen? Der Code funktioniert, ist aber äußert hässlich.

Ich habe es selber versucht, aber keinen Erfolg erzielt.

ah ja zur Info:

das text[0] = text[0][0:-1] ist dafür da, weil wie erwähnt "/n" pygame nicht erkennt und es als ein hässliches Kästchen am ende ausgibt.

und in dem ich das letzten char/index lösche unterbinde ich dieses.

MFG,
Mr.Wolna
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

1.) Du willst Dich mit Schleifen befassen!

2.) Wenn Du anfängst, Namen zu nummerieren, dann hast Du einen Fehler in Deinem Konzept und Du suchst eine passende Datenstruktur dafür!

3.) Versuche nicht nur die Python-Syntax zu lernen, sondern auch allgemeine Konzepte!

Wenn man sich das Problem anguckt, dann sieht man, dass es nur eine Schleife braucht, in der die aktuelle Zeile eingelesen, gerendert und in eine Datenstruktur gespeichert werden muss. Wenn Du das Blitten dann später durchführst, musst Du nur wieder über die Schleife iterieren.

Prinzipiell findest Du genau das auch in meinem Menücode, den ich für Dich geschrieben habe, nur dass ich dort ein Dictionary nutze. Aber vom Prinzip ist das genau das, was Du suchst.

4.) Beim Öffnen von Dateien arbeite mit "with"!

5.) file.readlines() ist unnötig, da Du direkt über die Zeilen iterieren kannst. Es gibt genug Beispiele im Forum ;-)

So, ich überlasse Dir mal die Umsetzung ;-) Denn nur dadurch lernst Du etwas.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ich ergänze mal `str.strip()` und `str.rstrip()`
http://docs.python.org/library/stdtypes.html#str.strip
http://docs.python.org/library/stdtypes.html#str.rstrip
Hyperion hat geschrieben:So, ich überlasse Dir mal die Umsetzung ;-) Denn nur dadurch lernst Du etwas.
Ich war schon versucht die 5 Zeilen zu schreiben :roll:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

cofi hat geschrieben: Ich war schon versucht die 5 Zeilen zu schreiben :roll:
Hehe... nur zu, ich wills ja keinem verbieten! ;-)
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Wenn ich ehrlich bin, habe ich diesmal mich auf ein fertiges Produkt gehofft.

Nicht falsch verstehen, aber für heute habe ich die Nase voll von Python und würde langsam mein Arbeit abspielen. Ich habe vieles geschafft und hätte dieses Ding auch gerne noch heute in meinem Arbeitspensum.

Bitte nicht falsch verstehen, wenn ich für alles fertigen Code haben wollte, hätte ich die zahnlosen bereits von anderen gecodeten Module genommen, ich will das schon selber machen. Bloß sitze ich an diesem Problem schon mehr als ich eigentlich sollte. Und ich bin sicher wenn ich den fertigen Code vor mir habe, das mir ein Licht aufgeht (wie immer -.- )

Nochmal, ich will das kein falscher Eindruck entsteht. Ich bin sicher alles andere als arbeitsfaul, bloß will ich dieses Ding heute fertig kriegen, und ich habe einfach nicht mehr die Power und die Geduld.

Hm, am Ende liegt es bei dir(euch) und wenn nicht werde ich mich sicherlich morgen bzw. nach dem WE damit befassen. Aber wie gesagt ich will diese Kleinigkeit nicht wider mit in die neue Woche nehmen.

MFG
Zuletzt geändert von Mr.Wolna am Donnerstag 18. Februar 2010, 21:41, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Hyperion hat geschrieben:
cofi hat geschrieben: Ich war schon versucht die 5 Zeilen zu schreiben :roll:
Hehe... nur zu, ich wills ja keinem verbieten! ;-)
Nein, ich war nur schon versucht die zu posten :) Aber das hilft ihm ja nichts.

Edit: Der code:

Code: Alles auswählen

font = pygame.font.Font(None, 30)
with open("Template.txt", "r") as f:
    for i, line in enumerate(f):
        name = font.render(line.rstrip(), 1, (255, 255, 255)) 
        screen.blit(name, (0, i*20))
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Ok, funktioniert einbahhfrei.

Ich würde lügen, würde ich sagen so hätte ich es auch gemacht bzw. eher gedacht^^ Hätte nie dort ein while vermutet.

Ich geh nun mit der Gewissheit alles geschafft zu habe ins Bett. Danke dafür.

Werde mir morgen früh noch die Zeilen durch den Kopf gehen lassen. Ist ja nicht mehr viel.

Naja, jedenfalls zeigt es mir das ich noch viel zu lernen habe. SEHR VIEL.

Ich bin froh das es hier dieses Forum gibt. Und Leute wie euch, die einen kompetent weiterhelfen. Ist nämlich keines Falls ein Standart in heutigen WWW (Leider).

MfG,
Wolna
Zuletzt geändert von Mr.Wolna am Donnerstag 18. Februar 2010, 22:05, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Mr.Wolna hat geschrieben:Hätte nie dort ein while vermutet.
Erm? Da ist auch kein while? Oder meintest du generell eine Schleife? Die will man im allgemeinen immer, wenn man etwas wiederholt.
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Jo, die meine ich. Dachte ich könnte es alleine mit FOR regeln.

Ist ja auch ne Schleife. :P
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mr.Wolna hat geschrieben:Jo, die meine ich. Dachte ich könnte es alleine mit FOR regeln.

Ist ja auch ne Schleife. :P
Kann es sein, dass Du das WITH mit while verwechsest?
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Hyperion hat geschrieben:
Mr.Wolna hat geschrieben:Jo, die meine ich. Dachte ich könnte es alleine mit FOR regeln.

Ist ja auch ne Schleife. :P
Kann es sein, dass Du das WITH mit while verwechsest?
UPS! Na da siehst du wie ausgebrannt ich heute schon bin.

Ich bedanke mich noch einmal und wünsche jeden eine gute Nacht.
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

So, ich liebe Freitag. Ei kurzer Arbeitstag Tag.

Also ich habe mich gleich nach dem Essen mich wieder hingesetzt. Und sofort macht mit diese Ding wieder Probleme -.- Es soll eigentlich ein Intro werden, wo der Text runter scrollt. War aber gestern nicht mehr in der Lage dies zu beenden, nun wortreich das jetzt machen bevor es dann auf die Piste geht. (WE und so^^).

Also folgendes:

Code: Alles auswählen

def draw_txt():
    font = pygame.font.Font(None, 30)
    with open("Template.txt", "r") as f:
        for i, line in enumerate(f):
            name = font.render(line.rstrip(), 1, (255, 255, 255))
            screen.blit(name, (0, i*20))
und im main loop dann.

y += 1
draw_txt()

Keine Ahnung was da los ist, ich sehe einfach nicht den Fehler. Irgendwie versage ich total bei dieser Sache, dabei habe ich vieles andere schon gut hin gekriegt.

Jedenfalls KA, mit einer Zeile klappt das ja auch. Aber eben nicht mit der Funktion.

Ah ja noch was zum Thema:

Den Code verstehe ich soweit, bis auf diese Zeile:
for i, line in enumerate(f):
Und ich habe gehört das der main loop, CPU spezifisch funktioniert, stimmt das? -.- Und wie kann man den vorbeugen.


MFG
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mr.Wolna hat geschrieben:Den Code verstehe ich soweit, bis auf diese Zeile:
for i, line in enumerate(f):
Die Dokumentation zu enumerate enthält doch sogar ein Beispiel. Welches konkrete Problem hast du denn damit?
Mr.Wolna hat geschrieben:Und ich habe gehört das der main loop, CPU spezifisch funktioniert, stimmt das? -.- Und wie kann man den vorbeugen.
Das stimmt. Wenn einer die CPU klaut funktioniert es nämlich ganz spezifisch nicht mehr. Vorbeugen kann man dem, indem man den Rechner gut wegschließt.
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Keines, ich will das nur verstehen. *sich dem Link durchles*

Das Problem liegt eher daran das ich keinen logischen Fehler erkenne. Ich will m eine Textdatei immer ein Pixel nach unten bewegen und somit die Schrift animieren für mein Intro.

MFG

edit: gibt da auch was im deutschen? mein englisch ist nicht allzu gut (aber auch nicht SOOO schlecht. :P )
BlackJack

@Mr.Wolna: In der Funktion kommt kein `y` vor also werden die gerenderten Zeichenketten immer an der selben Stelle geblittet. Falls das jetzt Dein Problem sein sollte. Ansonsten ist eine Beschreibung der Art "geht nicht" und "ich sehe keinen Fehler" nicht wirklich hilfreich, denn wir sehen auch keinen Fehler… ohne Quelltext.

Kann sich der Inhalt der Textdatei während des Scrollens ändern? Falls nicht, ist es vielleicht keine so gute Idee für jedes Pixel das sich der Text bewegen soll, die Datei immer wieder neu einzulesen und den Text in `Surface`\s zu rendern.
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Hm, hier der ganze Code.

Code: Alles auswählen

#! /usr/bin/env python
# -*- coding: cp1252 -*-
import pygame
from pygame.locals import *

def draw_txt():
    font = pygame.font.Font(None, 30)
    with open("Template.txt", "r") as f:
        for i, line in enumerate(f):
            name = font.render(line.rstrip(), 1, (255, 255, 255))
            screen.blit(name, (0, i*20))

pygame.init()
screen = pygame.display.set_mode((800, 600))    

#font = pygame.font.Font(None, 30)
#name = font.render("TESTLINE",1,(255,255,255))
#y = 0
#screen.blit(name, (0, y))
font = pygame.font.Font(None, 30)
with open("Template.txt", "r") as f:
    for i, line in enumerate(f):
        name = font.render(line.rstrip(), 1, (255, 255, 255))
        y = i*20
        screen.blit(name, (0, y))




while True:

            y =200
            draw_txt()
    pygame.display.update()
    for event in pygame.event.get():
        keyinput = pygame.key.get_pressed()
        if event.type == QUIT:
            pygame.quit()
            

Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Sorry, dir fehlen einfach die Grundlagen. Klar könnten wir deinen Code fixen, aber dann stehst du vor dem nächsten Stolperstein und kommst nicht weiter.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Mr.Wolna hat geschrieben:edit: gibt da auch was im deutschen? mein englisch ist nicht allzu gut (aber auch nicht SOOO schlecht. :P )
Nein, nur das Tutorial ist fuer Python3.1+ uebersetzt, ich hatte es mir angeschaut, aber ohne weit groessere Manpower ist da nichts zu machen.
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Eine Erklärung, WARUM es nicht geht würde schon reichen.

ah ja die Zeilen die NICHT in der Funktion hingehören auskommentiert.

Das sind Überbleibsel. Weil ob ich jetzt die Funktion oder direkt das ganze im main loop mache, geht es nicht. Mit einer Zeile schon. -.-


MFG
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Weil die Funktion dein globales `y` nicht kennt. (Selbst wenn, du ueberschreibst es ja gleich wieder)
Also uebergebe das `y` an die Funktion und aendere die Funktion so ab, dass das `y` sinnvoll verwendet wird.
Antworten