Werte für Funktion

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
k-net
User
Beiträge: 24
Registriert: Donnerstag 22. Oktober 2020, 16:43

Hallo,

ich befinde mich noch sehr am Anfang, probiere noch viel herum und komme mit einer Sache nicht weiter und hoffe, ihr könnt helfen.
Ich habe in Pygame einen Kreis gezeichnet. Das war auch kein Problem.

So klappt das problemlos:

Code: Alles auswählen

import pygame
import sys



#Fenster
pygame.init()
screen = pygame.display.set_mode([500, 500])
pygame.display.set_caption('BALLS')
clock = pygame.time.Clock()


#Farben
white = (255, 255, 255)


def ball():
    pygame.draw.circle(screen, white, (250, 250), 20, 20)


#Loop
go = True
while go:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    screen.fill((0, 0, 0))

    ball()

    pygame.display.update()
    clock.tick(60)

Jetzt möchte ich aber gerne die Werte für den Kreis nicht in der Funktion festlegen, sondern erst im Loop (wie gesagt, ich probiere noch viel herum). Das habe ich so versucht:

Code: Alles auswählen

import pygame
import sys


#Fenster
pygame.init()
screen = pygame.display.set_mode([500, 500])
pygame.display.set_caption('BALLS')
clock = pygame.time.Clock()


#Farben
white = (255, 255, 255)


def ball(s, c, x, y, r, w):
    window = s
    color = c
    pos_x = x
    pos_y = y
    radius = r
    width = w
    pygame.draw.circle(s, c, (x, y), r, w)


#Loop
go = True
while go:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    screen.fill((0, 0, 0))

    ball(screen, white, (250, 250), 20, 20)

    pygame.display.update()
    clock.tick(60)
Es kommt aber immer die Meldung: ball() missing 1 required positional argument: 'w'
Wieso vermisst er den Wert zu width? Der steht doch da drin? :roll:
Google konnte mir bisher nicht verständlich helfen, was mache ich falsch?

Vielen Dank!
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

deine Funktion `ball` erwartet 6 Argumente - du übergibst aber nur 5. `(250, 250)` ist _ein_ Argument in Form eines Tupels, darum hast du nur fünf. Mit `ball(screen, white, 250, 250, 20, 20)` wird es funktionieren.

Gruß, noisefloor
k-net
User
Beiträge: 24
Registriert: Donnerstag 22. Oktober 2020, 16:43

Oh Mann... natürlich :?
Vielen Dank!!! :D
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@k-net: Anmerkungen zum Quelltext:

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Konstanten werden per Konvention KOMPLETT_GROSS geschrieben.

`go` wird im Moment nicht wirklich verwendet, weil sich der Wert davon nie ändert. Sollte er aber, denn `sys.exit()` sollte dort nicht verwendet werden wo es steht. Wenn man da nicht mindestens potentiell einen anderen Wert als 0 an das System/das aufrufende Programm zurück gibt, ist das in der Regel ein unsauberer Hack um aus dem Programm zu kommen ohne sich genug Gedanken über einen ordentlichen Programmablauf zu machen.

Funktionen (und Methoden) werden üblicherweise nach der Tätigkeit benannt die sie durchführen, damit der Leser weiss was die Funktion macht und um sie besser von eher passiven Werten zu unterscheiden. `ball` ist keine Tätigkeit und deshalb kein guter Name für eine Funktion. Insbesondere auch weil es ein guter Name für einen Ball ist, wenn man sich beispielsweise entschliesst die Daten dafür in einem `pygame.sprites.Sprite` zusammenzufassen.

`s`, `c`, `x`, `y`, `r`, `w` als Argumentnamen sind unglaublich schlecht. Und *in* der Funktion werden die dann an sinnvolle Namen gebunden, die aber überhaupt nicht verwendet werden‽

Da die Argumente im Grunde fast nur 1:1 an eine andere Funktion weitergegeben werden, ist das eigentlich nur eine Umbenennung dieser anderen Funktion.

Code: Alles auswählen

#!/usr/bin/env python3
import pygame

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)


draw_ball = pygame.draw.circle


def main():
    pygame.init()
    screen = pygame.display.set_mode((500, 500))
    pygame.display.set_caption("BALLS")
    clock = pygame.time.Clock()

    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                break

        screen.fill(BLACK)
        draw_ball(screen, WHITE, (250, 250), 20, 20)
        pygame.display.update()
        clock.tick(60)

    pygame.quit()


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten