Seite 1 von 2
programm läuft nur mit print"" in der main() while
Verfasst: Mittwoch 4. Mai 2005, 15:35
von Gast
hallo,
ich bastel grade an meinem informatik projekt, ein moorhuhn remake.
Dieses will jedoch nicht laufen ausser wenn ich in die while schleife in der main() print "" schreibe.
Bin selber nur auf das print gekommen, weil ich meine cursor position anzeigen lassen wollte, da ich dachte die maus würde in dem program nicht gehen. Und siehe da, mein program lief!
ich erhalte keine fehlermeldung, daher weiss ich nicht so recht welchen teil vom code ich posten soll, wenn ich den ganzen code posten soll (ist nicht viel, bin noch nicht weit), dann sagt bitte bescheid
danke für eure hilfe
Verfasst: Mittwoch 4. Mai 2005, 15:37
von jens
Ohne Code wüßte ich nicht woran es liegt... Drum poste ihn mal...
Verfasst: Mittwoch 4. Mai 2005, 15:39
von Gast
holla geht as schnell

hier ist der code
Code: Alles auswählen
#alles importieren
import os, pygame
from pygame.locals import *
#image quickload
def load_image(name, colorkey=None):
#imagepfad
pfad = os.path.join('Bilder', name)
#image laden aus imagepfad und konvertieren
image = pygame.image.load(pfad).convert()
#transparenz einer farbe des images bestimmen
if colorkey is not None:
#wenn colorkey -1 dann soll die farbe der linken oben ecke transparent werden
if colorkey is -1:
colorkey = image.get_at((0,0))
#transparenz der gewählten farbe festlegen
image.set_colorkey(colorkey, RLEACCEL)
#den wert image zurückgeben
return image
#sound quickload
def load_sound(name):
#soundpfad
pfad = os.path.join('Sounds', name)
#sound laden aus soundpfad
sound = pygame.mixer.Sound(pfad)
#den wert sound zurückgeben
return sound
#hintergrundmusik quickload
def load_musik(name):
#musikpfad
pfad = os.path.join('mp3', name)
#musik laden aus musikpfad
musik = pygame.mixer.music.load(pfad)
#den wert musik zurückgeben
return musik
#Tiere
class Tiere:
def nix():
print "nix"
#hier kommt die level funktion hin
i=0
#MAIN
def main():
#initialisieren
pygame.init()
#fenster öffnen
screen = pygame.display.set_mode((800, 600))
#fenstertitel
pygame.display.set_caption('Save the Animals')
#mauszeiger unsichtbar
pygame.mouse.set_visible(0)
#background images in eine liste laden
backgroundliste = ['Landschaft.bmp','Wald.bmp','Meer.bmp','Urwald.bmp','Wüste.bmp','Weltall.bmp']
#hintergrund laden je nach level
background = load_image(backgroundliste[i])
#lade Fadenkreuz image
fadenkreuz = load_image('Fadenkreuz.bmp', -1)
#gib fadenkreuz höhe und weite
fkhoehe,fkweite=fadenkreuz.get_size()
#hintergrundmusik lieder in eine listeladen
musikliste = ['Beatles - RocknRoll music.mp3','Beatles - Help.mp3','Beatles - A hard days night.mp3','Beatles - Eight days a week.mp3']
#lege musik variable fest
l=-1
#hauptschleife
while 1:
#gib x und y koordinate der mausposition
mausposx,mausposy=pygame.mouse.get_pos()
#imagepos=mausposition um hälfte der imagehöhe und -weite verschoben damit imagemitte=mausposition
fkpos=(mausposx-fkhoehe/2),(mausposy-fkweite/2)
#hintergrund anzeigen
screen.blit(background, (0, 0))
#zeig fadenkreuz imagemitte an mausposition
screen.blit(fadenkreuz, fkpos)
#Fenster aktualisieren
pygame.display.flip()
#check ob musik läuft
if pygame.mixer.music.get_busy() == False:
#variable l für nächstes lied erhöhen
l+=1
#wenn das letzte lied gelaufen ist wieder von vorn anfangen
if l>3:
l=0
#lade lied
load_musik(musikliste[l])
#spiel lied ab
pygame.mixer.music.play()
#bugbehebung
print
Edit (Leonidas): Code in Python-Tags gesetzt.
Verfasst: Mittwoch 4. Mai 2005, 15:44
von jens
Da wird man jetzt nicht schau draus, weil die Eintrückungen futsch sind! benutze bitte den Python-Forum-Tag:
[python]
MEIN CODE
[/python]
Verfasst: Mittwoch 4. Mai 2005, 15:46
von Gast
Code: Alles auswählen
#alles importieren
import os, pygame
from pygame.locals import *
#image quickload
def load_image(name, colorkey=None):
#imagepfad
pfad = os.path.join('Bilder', name)
#image laden aus imagepfad und konvertieren
image = pygame.image.load(pfad).convert()
#transparenz einer farbe des images bestimmen
if colorkey is not None:
#wenn colorkey -1 dann soll die farbe der linken oben ecke transparent werden
if colorkey is -1:
colorkey = image.get_at((0,0))
#transparenz der gewählten farbe festlegen
image.set_colorkey(colorkey, RLEACCEL)
#den wert image zurückgeben
return image
#sound quickload
def load_sound(name):
#soundpfad
pfad = os.path.join('Sounds', name)
#sound laden aus soundpfad
sound = pygame.mixer.Sound(pfad)
#den wert sound zurückgeben
return sound
#hintergrundmusik quickload
def load_musik(name):
#musikpfad
pfad = os.path.join('mp3', name)
#musik laden aus musikpfad
musik = pygame.mixer.music.load(pfad)
#den wert musik zurückgeben
return musik
#Tiere
class Tiere:
def nix():
print "nix"
#hier kommt die level funktion hin
i=0
#MAIN
def main():
#initialisieren
pygame.init()
#fenster öffnen
screen = pygame.display.set_mode((800, 600))
#fenstertitel
pygame.display.set_caption('Save the Animals')
#mauszeiger unsichtbar
pygame.mouse.set_visible(0)
#background images in eine liste laden
backgroundliste = ['Landschaft.bmp','Wald.bmp','Meer.bmp','Urwald.bmp','Wüste.bmp','Weltall.bmp']
#hintergrund laden je nach level
background = load_image(backgroundliste[i])
#lade Fadenkreuz image
fadenkreuz = load_image('Fadenkreuz.bmp', -1)
#gib fadenkreuz höhe und weite
fkhoehe,fkweite=fadenkreuz.get_size()
#hintergrundmusik lieder in eine listeladen
musikliste = ['Beatles - RocknRoll music.mp3','Beatles - Help.mp3','Beatles - A hard days night.mp3','Beatles - Eight days a week.mp3']
#lege musik variable fest
l=-1
#hauptschleife
while 1:
#gib x und y koordinate der mausposition
mausposx,mausposy=pygame.mouse.get_pos()
#imagepos=mausposition um hälfte der imagehöhe und -weite verschoben damit imagemitte=mausposition
fkpos=(mausposx-fkhoehe/2),(mausposy-fkweite/2)
#hintergrund anzeigen
screen.blit(background, (0, 0))
#zeig fadenkreuz imagemitte an mausposition
screen.blit(fadenkreuz, fkpos)
#Fenster aktualisieren
pygame.display.flip()
#check ob musik läuft
if pygame.mixer.music.get_busy() == False:
#variable l für nächstes lied erhöhen
l+=1
#wenn das letzte lied gelaufen ist wieder von vorn anfangen
if l>3:
l=0
#lade lied
load_musik(musikliste[l])
#spiel lied ab
pygame.mixer.music.play()
#bugbehebung
print
Verfasst: Mittwoch 4. Mai 2005, 16:28
von jens
Aha, PyGame benutzt du, interresant

Also daran kann ich jetzt spontan nicht erkenne, warum es nicht auch ohne dem letzten Print gehen soll... Was passiert denn, wenn das print nicht da ist??? Oder an andere Stelle?
Ach, ist ja schön, das du das Programm so gut dokumentierst! Aber ich würde immer die Kommentarzeile ebenfalls einrücken! Das ist wesendlich lesbarer
(Warum hast du den Thread in "Python und Netzwerke" eröffnet???)
Verfasst: Mittwoch 4. Mai 2005, 16:34
von Gast
ähm sry vllt könntet ihr den thread verschieben, ich hab nur python und unten klein programmierung gelesen...
wenn das print nicht da ist, dann bewegt sich mein fadenkreuz net... kannst es ja ausprobieren indem du andere lieder (oder die funktion löschst) und 800*600 bilder reinhaust
aber eine fehlermeldung kommt nicht, das ist ja das komische
wenn ich das print ausserhalb der while platziere passiert auch nix
werde mir den tipp mit den komenntaren zu herzen nehmen

Verfasst: Mittwoch 4. Mai 2005, 17:41
von Leonidas
Ich habe mal deinen Code angepasst:
Code: Alles auswählen
#!/usr/bin/env python
# -*- encoding: latin-1 -*-
import os
import pygame
from pygame.locals import *
def load_image(name, colorkey=None):
"""image quickload"""
#imagepfad
pfad = os.path.join('Bilder', name)
#image laden aus imagepfad und konvertieren
image = pygame.image.load(pfad).convert()
#transparenz einer farbe des images bestimmen
if colorkey != None:
#wenn colorkey -1 dann soll die farbe der linken oben ecke transparent werden
if colorkey == -1:
colorkey = image.get_at((0,0))
#transparenz der gewählten farbe festlegen
image.set_colorkey(colorkey, RLEACCEL)
#den wert image zurückgeben
return image
def load_sound(name):
"""sound quickload"""
#soundpfad
pfad = os.path.join('Sounds', name)
#sound laden aus soundpfad
sound = pygame.mixer.Sound(pfad)
#den wert sound zurückgeben
return sound
def load_musik(name):
"""hintergrundmusik quickload"""
#musikpfad
pfad = os.path.join('mp3', name)
#musik laden aus musikpfad
musik = pygame.mixer.music.load(pfad)
#den wert musik zurückgeben
return musik
#Tiere
class Tiere:
def nix():
print "nix"
#hier kommt die level funktion hin
i=0
def main():
"""MAIN"""
#initialisieren
pygame.init()
#fenster öffnen
screen = pygame.display.set_mode((800, 600))
#fenstertitel
pygame.display.set_caption('Save the Animals')
#mauszeiger unsichtbar
pygame.mouse.set_visible(False)
#background images in eine liste laden
backgroundliste = ['Landschaft.bmp',
'Wald.bmp','Meer.bmp','Urwald.bmp','Wüste.bmp',
'Weltall.bmp']
#hintergrund laden je nach level
background = load_image(backgroundliste[i])
#lade Fadenkreuz image
fadenkreuz = load_image('Fadenkreuz.bmp', -1)
#gib fadenkreuz höhe und weite
fkhoehe, fkweite=fadenkreuz.get_size()
#hintergrundmusik lieder in eine listeladen
musikliste = ['Beatles - RocknRoll music.mp3',
'Beatles - Help.mp3',
'Beatles - A hard days night.mp3',
'Beatles - Eight days a week.mp3']
#lege musik variable fest
l =- 1
#hauptschleife
while True:
#gib x und y koordinate der mausposition
mausposx, mausposy=pygame.mouse.get_pos()
#imagepos=mausposition um hälfte der imagehöhe und -weite verschoben damit imagemitte=mausposition
fkpos = (mausposx-fkhoehe/2), (mausposy-fkweite/2)
#hintergrund anzeigen
screen.blit(background, (0, 0))
#zeig fadenkreuz imagemitte an mausposition
screen.blit(fadenkreuz, fkpos)
#Fenster aktualisieren
pygame.display.flip()
#check ob musik läuft
if not pygame.mixer.music.get_busy():
#variable l für nächstes lied erhöhen
l +=1
#wenn das letzte lied gelaufen ist wieder von vorn anfangen
if l > 3:
l = 0
#lade lied
load_musik(musikliste[l])
#spiel lied ab
pygame.mixer.music.play()
#bugbehebung
if __name__ == '__main__':
main()
Versuchs mal damit.
Achja, ich habe deinen Thread verschoben.
Verfasst: Mittwoch 4. Mai 2005, 17:57
von Gast
nein es geht nicht, aber ich habe von einem freund aus unserem info kurs den tipp bekommen das hier in meine funktion einzubauen
jetzt geht es
danke für eure bemühungen
Verfasst: Mittwoch 4. Mai 2005, 18:41
von jens
Die Schleife ist ja eigentlich Sinnlos... Reich nicht evtl auch einfach ein:
Verfasst: Mittwoch 4. Mai 2005, 19:20
von Gast
das programm ist ja noch nicht fertig, da kommen noch objekte rein die sich hin und her bewegen
Verfasst: Samstag 7. Mai 2005, 15:12
von Gast
ich hab ein test program erstellt welches ein bild rein und raus zoomt, aber das ganze bild nimmt die farbe der linken oberen ecke an, warum? wie kann ich das umgehen?
Code: Alles auswählen
import pygame, os
#image quickload
def load_image(name):
pfad=os.path.join('Bilder',name)
image=pygame.image.load(pfad).convert()
return image
#main
def test():
#erstelle eine fenster
screen=pygame.display.set_mode((800, 600))
#lade den hintergrund
background=load_image('Meer.bmp')
#lade tier
Tier=load_image('Tier.bmp')
#rechteck an 0.0
TierRect=Tier.get_rect()
#zoomfaktor
Zoomfaktor=1.2
while 1:
#mal hintergrund an 0.0
screen.blit(background, (0, 0))
#mal tierimage in tierRect
screen.blit(Tier, TierRect)
#zoom tierimage mal zoomfaktor
Tier=pygame.transform.scale(Tier,(Tier.get_width()*Zoomfaktor,Tier.get_height()*Zoomfaktor))
#wenn zoomfaktor zu groß zoom raus
if Tier.get_width()>70:
Zoomfaktor=0.8
#wenn zoomfaktor zu klein zoom rein
if Tier.get_width()<10:
Zoomfaktor=1.2
#fenster aktualisieren
pygame.display.update()
Verfasst: Sonntag 8. Mai 2005, 13:15
von Leonidas
Ich würde es ja so machen:
Code: Alles auswählen
#!/usr/bin/env python
# -*- encoding: latin-1 -*-
import os
import pygame
import pygame.locals as pyl
def load_image(name):
"""image quickload"""
pfad = os.path.join('data', name)
image = pygame.image.load(pfad).convert()
return image
def test():
"""main"""
#erstelle ein Fenster
pygame.init()
screen = pygame.display.set_mode((800, 600))
#lade den Hintergrund
background = load_image('background.jpg')
#lade Tier
Tier = load_image('gnome-foot.png')
#rechteck an 0.0
TierRect = Tier.get_rect()
#zoomfaktor
Zoomfaktor = 1.2
clock = pygame.time.Clock()
TierSurf = Tier
while True:
clock.tick(10)
#mal hintergrund an 0.0
screen.blit(background, (0, 0))
#mal tierimage in tierRect
screen.blit(TierSurf, TierRect)
#zoom tierimage mal zoomfaktor
TierSurf = pygame.transform.scale(Tier,
(int(TierSurf.get_width() * Zoomfaktor),
int(TierSurf.get_height() * Zoomfaktor)))
#wenn zoomfaktor zu groß zoom raus
if TierSurf.get_width() > 70:
Zoomfaktor = 0.8
#wenn zoomfaktor zu klein zoom rein
if TierSurf.get_width() < 10:
Zoomfaktor = 1.2
#fenster aktualisieren
pygame.display.update()
for event in pygame.event.get():
if event.type == pyl.QUIT or event.type == pyl.KEYDOWN:
return
if __name__ == '__main__':
test()
Anderungen: Code an Styleguide angepasst (Freiräume zwischen '='), kommentare eingerückt, Aus einigen Kommentaren Docstrings gemacht, FPS-Limiting eingebaut (auf 10 fps gestellt, so kann man dem Bug auf die Schliche kommen), Eventverarbeitung eingebaut, Kopie von Tier, TierSurf erstellt (um nicht das skalierte Bild zu skalieren sondern das Original, häufig Problematisch bei pygame und SDL).
Verfasst: Sonntag 8. Mai 2005, 15:01
von Gast
ich erhalte bei diesem veränderten code diesen fehler:
Code: Alles auswählen
Exception in Tkinter callback
Traceback (most recent call last):
File "D:\Python24\lib\lib-tk\Tkinter.py", line 1345, in __call__
return self.func(*args)
File "D:\Python24\lib\idlelib\ScriptBinding.py", line 138, in run_module_event
filename = self.getfilename()
File "D:\Python24\lib\idlelib\ScriptBinding.py", line 188, in getfilename
self.editwin.io.save(None)
File "D:\Python24\lib\idlelib\IOBinding.py", line 336, in save
self.save_as(event)
File "D:\Python24\lib\idlelib\IOBinding.py", line 358, in save_as
self.updaterecentfileslist(filename)
File "D:\Python24\lib\idlelib\IOBinding.py", line 543, in updaterecentfileslist
self.editwin.update_recent_files_list(filename)
File "D:\Python24\lib\idlelib\EditorWindow.py", line 598, in update_recent_files_list
rf_file.writelines(rf_list)
TypeError: writelines() argument must be a sequence of strings
Exception in Tkinter callback
Traceback (most recent call last):
File "D:\Python24\lib\lib-tk\Tkinter.py", line 1345, in __call__
return self.func(*args)
File "D:\Python24\lib\idlelib\ScriptBinding.py", line 141, in run_module_event
code = self.checksyntax(filename)
File "D:\Python24\lib\idlelib\ScriptBinding.py", line 100, in checksyntax
return compile(source, filename, "exec")
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 93: ordinal not in range(128)
Exception in Tkinter callback
Traceback (most recent call last):
File "D:\Python24\lib\lib-tk\Tkinter.py", line 1345, in __call__
return self.func(*args)
File "D:\Python24\lib\idlelib\ScriptBinding.py", line 141, in run_module_event
code = self.checksyntax(filename)
File "D:\Python24\lib\idlelib\ScriptBinding.py", line 100, in checksyntax
return compile(source, filename, "exec")
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 93: ordinal not in range(128)
Exception in Tkinter callback
Traceback (most recent call last):
File "D:\Python24\lib\lib-tk\Tkinter.py", line 1345, in __call__
return self.func(*args)
File "D:\Python24\lib\idlelib\ScriptBinding.py", line 141, in run_module_event
code = self.checksyntax(filename)
File "D:\Python24\lib\idlelib\ScriptBinding.py", line 100, in checksyntax
return compile(source, filename, "exec")
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 93: ordinal not in range(128)
Exception in Tkinter callback
Traceback (most recent call last):
File "D:\Python24\lib\lib-tk\Tkinter.py", line 1345, in __call__
return self.func(*args)
File "D:\Python24\lib\idlelib\ScriptBinding.py", line 141, in run_module_event
code = self.checksyntax(filename)
File "D:\Python24\lib\idlelib\ScriptBinding.py", line 100, in checksyntax
return compile(source, filename, "exec")
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 93: ordinal not in range(128)
Exception in Tkinter callback
Traceback (most recent call last):
File "D:\Python24\lib\lib-tk\Tkinter.py", line 1345, in __call__
return self.func(*args)
File "D:\Python24\lib\idlelib\ScriptBinding.py", line 141, in run_module_event
code = self.checksyntax(filename)
File "D:\Python24\lib\idlelib\ScriptBinding.py", line 100, in checksyntax
return compile(source, filename, "exec")
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 93: ordinal not in range(128)
Verfasst: Sonntag 8. Mai 2005, 21:35
von BlackJack
Ich konnte auf die schnelle kein 'ä' in dem Quelltext entdecken. Das hat nämlich die Fehlermeldung ausgelöst. Entweder hast Du die Zeile mit dem Encoding vergessen -- ``# -*- encoding: latin-1 -*-`` oder welches auch immer Du benutzt -- oder das ist ein Problem von IDLE. Versuchs mal ohne IDLE auszuführen.
Verfasst: Montag 9. Mai 2005, 12:26
von Leonidas
IDLE? *weghau*
Das ist doch IDLE-typisch: Tkinter-Fehler in Programmen zu bekommen, die Tkinter nicht einmal nutzen.
Verfasst: Montag 9. Mai 2005, 22:36
von BlackJack
Der Fehler kommt doch gar nicht im Programm sondern beim speichern/übersetzen. Und ein Unicode-Encode-Fehler ist auch nicht unbedingt auf IDLE oder Tkinter zurück zu führen.
Verfasst: Dienstag 10. Mai 2005, 12:29
von Leonidas
BlackJack hat geschrieben:Der Fehler kommt doch gar nicht im Programm sondern beim speichern/übersetzen.
Also kenn man keine Programme speichern, weil der Editor gerade mal keine Lust dazu hat.
BlackJack hat geschrieben:Und ein Unicode-Encode-Fehler ist auch nicht unbedingt auf IDLE oder Tkinter zurück zu führen.
Nein, durchaus nicht. Nur ist dies recht oft der Fall, und wenn das Programm nichmal Unicode nutzt ist das einfach nur traurig. Was wäre wenn vim oder emacs solche Probleme hätten? Aber nein, interessanterweise hat nicht nur IDLE gerne Bugs, auch DrPython der ein ansonsten recht gelungener Editor ist, hatte auf meinem System gleich mehrere Bugs (allesamt nun gefixt).
Verfasst: Dienstag 10. Mai 2005, 16:11
von Gast
2 fragen:
1. warum geht das nicht? (keine fehlermeldung, setzt aber meine objekte nicht zurück wenn ich sie treffe)
Code: Alles auswählen
for z in range(3):
if hitboxliste[z].pos.collidepoint(pygame.mouse.get_pos()):
hitboxposx, hitboxposy = hitboxliste[z].pos.topleft
if hitboxliste[z].name.get_at(((mausposx - hitboxposx),(mausposy - hitboxposy))) == (0,0,255):
tierliste[z].setzzurueck()
hitboxliste[z].setzzurueck()
else:
pass
2. ich möchte (sobald diese funktion geht) die farben der hitboxen unsichtbar machen, wird dann trotzdem noch diese abfrage gehen welche farbe der getroffene pixel hat?
Verfasst: Dienstag 10. Mai 2005, 19:13
von Gast
k hat sich erledigt musste da (0, 0, 255, 255) hinschreiben..