mein switch hat sich aufgehängt

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.
Antworten
IgnibusAurea
User
Beiträge: 2
Registriert: Donnerstag 9. Juni 2022, 14:46

Hey Leute, ich hab eine auswahl durch die ich durch switchen möchte und ich möchte das mit der k taste angezeigt und bei wiederholtem drücken eben nicht mehr angezeigt. Nun mein Programm geht durch die untere if anweisung anscheinend nur einmal durch obwohl ich das mit der variable toggle ändere. Bitte, was übersehe ich?

P.S. Bin noch neu bitte nicht all zu hart Fronten wenn ich nicht so sauber Code schreibe. hab bei meinem letzten post schon hart auf die Finger bekommen. Trotzdem danke für konstruktive Kritik

P.P.S Mein Namensgenerator Funktioniert einwand frei aber wie schaffe ich es die Daten aus der Klasse Kunde_Zufall ordentlich zu verarbeiten. Lösungsansatz von mir: "in einer variable zu packen und als liste drüber iterieren". Habe ich dann nicht das Problem das das als String nur jeder Buchstabe Einzel ab gearbeitet wird?


Code: Alles auswählen

import sys

import pygame
import namensgenerator
import time
counter_variablen_erzeugung = 0


class Kunde_Zufall():
    def __init__(self,):
        self.vorname = namensgenerator.gender_auswahl_zufall()
        self.nachname = namensgenerator.nachnamen_auswahl()
        self.geschlecht = namensgenerator.geschlecht()


def erzeuge_var(name_als_string, inhalt_variable):
	globals()[name_als_string] = inhalt_variable



counter_kundengeneriert = 0

def kundenerzeugung():
    global counter_kundengeneriert
    global counter_variablen_erzeugung
    global liste
    kunden_string = str('Kunde')+str(counter_kundengeneriert)
    erzeuge_var(kunden_string,Kunde_Zufall())
    print(counter_kundengeneriert)
    liste += 1
    counter_kundengeneriert += 1
    counter_variablen_erzeugung += 1

def draw_text(text):
    font = pygame.font.SysFont("arial", 25)
    y_pos = x_pos = 5

    text = font.render(text, 1, (0, 0, 0))
    screen.blit(text, (x_pos, y_pos))
    pygame.display.update()




#lol = [["Alina","Krause","12","Weiblich"],["Hans","Peter","34","Mänlich"]]
#print(lol[0])
#print(lol[1])

liste = 0
loop = liste
toggle = 0
pygame.init()
screen = pygame.display.set_mode((800, 800))
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_g:
                kundenerzeugung()
            if event.key == pygame.K_k:
                if toggle == 0:
                    toggle + 1
                if toggle == 1:
                    toggle - 1
                print("Spieler hat Taste gedrückt")

            if event.key == pygame.K_UP:
                if loop < liste:
                    loop += 1
                    print(loop)
                elif loop == liste:
                    loop = 0
                    print(loop)
            if event.key == pygame.K_DOWN:
                if loop > 0:
                    loop -= 1
                    print(loop)
                elif loop == 0:
                    loop = liste
                    print(loop)
    if toggle == 0:
        screen.fill((0, 0, 255))
        draw_text(str(loop))
        pygame.display.update()
    elif toggle == 1:
        screen.fill((0, 0, 0))
        pygame.display.update()


    #gedrueckt = pygame.key.get_pressed()
    # Taste für Spieler 1
    #if gedrueckt[pygame.K_UP]:
    #    print("Spieler hat Pfeiltaste hoch gedrückt")

    #if gedrueckt[pygame.K_DOWN]:
    #    print("Spieler hat Pfeiltaste runter gedrückt")
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Vergiss ganz schnell, dass es `globals` überhaupt gibt.
Erstens benutzt man keine globalen Variablen und zweitens erzeugt man keine Variablennamen dynamisch.
Die Alternative sind Wörterbücher, bzw. in Deinem Fall eine Liste, was den Code nicht nur besser, sondern auch deutlich einfacher macht.
`toogle` ist ein Wahrheitswert, dafür nimmt man False und True, nicht 0 oder 1. Wenn man dessen Wert ändern will, muss man auch der Variablen den neuen Wert zuweisen.

Code: Alles auswählen

import pygame
import namensgenerator

class Kunde_Zufall():
    def __init__(self,):
        self.vorname = namensgenerator.gender_auswahl_zufall()
        self.nachname = namensgenerator.nachnamen_auswahl()
        self.geschlecht = namensgenerator.geschlecht()


def draw_text(text):
    font = pygame.font.SysFont("arial", 25)
    y_pos = x_pos = 5

    text = font.render(text, 1, (0, 0, 0))
    screen.blit(text, (x_pos, y_pos))


loop = 0
kunden = []
toggle = False
pygame.init()
screen = pygame.display.set_mode((800, 800))
running =True 
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running  = False 
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_g:
                kunden.append(Kunde_Zufall())
            if event.key == pygame.K_k:
                toggle = not toggle 
                print("Spieler hat Taste gedrückt")

            if event.key == pygame.K_UP:
                if loop < len(kunden):
                    loop += 1
                    print(loop)
                else:
                    loop = 0
                    print(loop)
            if event.key == pygame.K_DOWN:
                if loop > 0:
                    loop -= 1
                else:
                    loop = len(kunden) - 1
                    print(loop)
    if not toggle:
        screen.fill((0, 0, 255))
        draw_text(str(loop))
        pygame.display.update()
    else:
        screen.fill((0, 0, 0))
        pygame.display.update()
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

In einem weitern Schritt muß das Hauptprogramm noch in eine Funktion wandern:

Code: Alles auswählen

import pygame
import namensgenerator

class KundeZufall():
    def __init__(self):
        self.vorname = namensgenerator.gender_auswahl_zufall()
        self.nachname = namensgenerator.nachnamen_auswahl()
        self.geschlecht = namensgenerator.geschlecht()


def draw_text(screen, font, text):
    y_pos = x_pos = 5
    surface = font.render(text, 1, (0, 0, 0))
    screen.blit(surface, (x_pos, y_pos))


def main():
    try:
        pygame.init()
        screen = pygame.display.set_mode((800, 800))
        font = pygame.font.SysFont("arial", 25)

        loop = 0
        toggle = False
        kunden = []
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    return
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_g:
                        kunden.append(KundeZufall())
                    elif event.key == pygame.K_k:
                        toggle = not toggle 
                        print("Spieler hat Taste gedrückt")
                    elif event.key == pygame.K_UP:
                        if loop < len(kunden):
                            loop += 1
                        else:
                            loop = 0
                        print(loop)
                    elif event.key == pygame.K_DOWN:
                        if loop > 0:
                            loop -= 1
                        else:
                            loop = len(kunden) - 1
                        print(loop)
            if toggle:
                screen.fill((0, 0, 0))
            else:
                screen.fill((0, 0, 255))
                draw_text(screen, font, str(loop))
            pygame.display.update()
    finally:
        pygame.quit()


if __name__ == "__main__":
    main()
Antworten