programm läuft nur mit print"" in der main() while

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.
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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ohne Code wüßte ich nicht woran es liegt... Drum poste ihn mal...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Da wird man jetzt nicht schau draus, weil die Eintrückungen futsch sind! benutze bitte den Python-Forum-Tag:

[python]

MEIN CODE

[/python]

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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

Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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???)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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 ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gast

nein es geht nicht, aber ich habe von einem freund aus unserem info kurs den tipp bekommen das hier in meine funktion einzubauen

Code: Alles auswählen

 

for event in pygame.event.get():
    pass

jetzt geht es

danke für eure bemühungen
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Die Schleife ist ja eigentlich Sinnlos... Reich nicht evtl auch einfach ein:

Code: Alles auswählen

pygame.event.get()

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Gast

das programm ist ja noch nicht fertig, da kommen noch objekte rein die sich hin und her bewegen
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()

Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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)

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

IDLE? *weghau*
Das ist doch IDLE-typisch: Tkinter-Fehler in Programmen zu bekommen, die Tkinter nicht einmal nutzen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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?
Gast

k hat sich erledigt musste da (0, 0, 255, 255) hinschreiben..
Antworten