programmier fehler tkinter "pong"

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.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Natürlich bietet eine Klasse auch einen Vorteil.

Wenn es keine Klasse ist, hat man nur ein PingPong Spiel. Aber bei einer Klasse kann man auch das machen:

Code: Alles auswählen

        Spielfeld(self).pack()
        Spielfeld(self).pack()
Oder mit grid lassen sich sogar vier PingPong Spiele auf dem Bildschirm unterbringen. Da könnten dann sogar acht Spieler spielen. Man muss dann allerdings die event Bindings mit zusätzlichem ,'+' machen und bei der Spielfeld Klasse muss man noch die Übergabe für die Bedienung implementieren, damit dann jedes Spiel seine eigenen Tasten hat. Könnte natürlich auf der Tastatur für acht Spieler ein bißchen eng werden.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Melewo hat geschrieben:
Alfons Mittelmeyer hat geschrieben:aber ich habe schon genug getan und würde sagen, dass Du jetzt auch mal an der Reihe bist.
Hier ist gar keiner an der Reihe, mit Ausnahme des Fragestellers. Der Fragesteller ist der einzige hier, der an der Reihe wäre und zwar damit, sich in den nächsten Wochen und Monaten erst einmal tiefgehender mit Python zu beschäftigen, bevor er dieses oder ein anderes Spiel erneut programmieren möchte. Wobei darauf zu achten wäre, hatte Sirius3 ihm in seiner ersten Antwort erklärt. Wenn er dazu weitere Fragen gehabt hätte, hätte er sich melden können. Doch das tat er nicht.
Ist klar, dass er sich nicht mehr meldete. Es kommt ein neuer User in das Forum. Man sollte ihn doch herzlich willkommen heißen. Und man sollte ihm doch helfen, den Fehler zu finden, deshalb fragt er ja hier an. Und was tust Du?
Melewo hat geschrieben:Irgendwie habe ich den Eindruck, Du könntest den ersten Preis gewonnen haben, in Bezug auf die Anzahl von globalen Variablen, deren Verwendung man eigentlich vermeiden sollte.
Also ein freundliches Willkommen ist das nicht. Und was Du dann bringst, ist ja der absolute Hammer.
Melewo hat geschrieben:Tue Dir selbst einen Gefallen und fange noch einmal von vorne an
Der Code war vollkommen in Ordnung, bis auf den Fehler, dass etwas nicht eingerückt war. Und geklärt sollte jetzt auch sein, dass eine KLasse im vorliegenden Fall auch gar nichts bringt
Melewo hat geschrieben:Als ich hier Anfang Mai einen ersten Entwurf von einem Script vorstellte, hatten mir BlackJack und Sirius3 Antworten gegeben, mit denen konnte man etwas anfangen, auch wenn man nicht alles gleich so umgesetzt, verstanden oder eingesehen hat. Aber man hat es im Hinterkopf behalten, um einen Teil davon zukünftig mit einfließen zu lassen.
Wenn Dir BlackJack und Sirius3 wertvolle Antworten gegeben hatten, das gibt Dir lange nicht das Recht, Dich hier als Richter aufzuspielen, was bei einem Programm in Ordnung ist oder nicht. Und so etwas, wie dem User den Eindruck zu vermitteln, dass sein Kode Kacke sei, er sich hier nicht mehr blicken lassen solle, bis er es besser kann und er seinen Code wegwerfen und neu anfangen soll, schadet dem Forum extrem. Der User wird sich wahrscheinlich hier nicht mehr blicken lassen.
Melewo hat geschrieben:Wenn da einer so einen Zirkus wie Du veranstaltet hätte, dabei dann noch diese laufenden Streitereien, um nicht zu sagen fragwürdige Besserwisserei, dann hätte ich mich sicherlich auch so schnell nicht mehr in diesem Forum blicken lassen.
Wer veranstaltet hier einen Zirkus? Und wenn es um solche Programme geht, dann bin ich kein Prinzipienreiter, wie manch andere im Forum. Ich kann beurteilen, ob bei so einem Programm die Verwendung einer Klasse einen Vorteil bringt oder nicht. Und in diesem Fall bringt sie keinen, außer wenn man mehrere PingPong Spiele gerne gleichzeitig hätte.

Und wer fängt die Streitereien an? Schau doch was Sirius3 geschrieben hatte:
Sirius3 hat geschrieben:@phbrue: bitte schnell vergessen, was Alfons da schreibt, es sei denn Du willst bleibende Schäden beim Programmieren behalten.
Das war 1a Top Code, wie man ihn bei einem Top Down Entwurf schreibt. Meinst Du ich soll solche Äußerungen einfach hinnehmen? Natürlich nicht. Also entgegne ich etwas. Aber hört es damit auf? Nein, es geht weiter und weiter und weiter und immer kommen neue solche Sachen wie:
Sirius3 hat geschrieben:Wenn Du keine guten Programme postest, sondern nur Quatsch, dann lass das bitte sein.
Ich hatte lediglich für den bestehenden Code einen Teil verbessert, damit er lesbarer wird. Warum wird das jetzt als Quatsch bezeichnet, nur weil ich nicht das ganze Programm umgeschrieben habe? Ich kann doch dem TO zeigen, wie er sein Programm lesbarer gestaltet. Wieso soll ich da sein ganzes Programm umschreiben, damit Sirius3 das nicht als Quatsch bezeichet. Soll er es doch selber umschreiben.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Alfons Mittelmeyer hat geschrieben:Ist klar, dass er sich nicht mehr meldete. Es kommt ein neuer User in das Forum. Man sollte ihn doch herzlich willkommen heißen. Und man sollte ihm doch helfen, den Fehler zu finden, deshalb fragt er ja hier an. Und was tust Du?
Melewo hat geschrieben:Irgendwie habe ich den Eindruck, Du könntest den ersten Preis gewonnen haben, in Bezug auf die Anzahl von globalen Variablen, deren Verwendung man eigentlich vermeiden sollte.
Also ein freundliches Willkommen ist das nicht. Und was Du dann bringst, ist ja der absolute Hammer.
Melewo hat geschrieben:Tue Dir selbst einen Gefallen und fange noch einmal von vorne an
Der Code war vollkommen in Ordnung, bis auf den Fehler, dass etwas nicht eingerückt war. Und geklärt sollte jetzt auch sein, dass eine KLasse im vorliegenden Fall auch gar nichts bringt
Ein Einsteiger kann nicht viel von jemanden lernen, der versucht Pfuscharbeit auszubügeln, sondern nur vor von demjenigen, der ihm sagt, wenn etwas blanke Pfuscharbeit ist. Und bei über ein Dutzend globale Variablen in einem Code von unter 100 Zeilen, da war es halt nichts weiter als Pfusch und der Fragesteller muss sich halt überlegen, ob er Python lernen möchte oder nicht. Doch wenn er es lernen möchte, muss er noch einmal von vorn mit so einem Script beginnen.

Und wenn Du hier allen Ernstes behaupten möchtest, dass der Code bis auf einen Fehler völlig in Ordnung war, na dann kann wohl von Dir auch kaum einer etwas lernen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Melewo hat geschrieben:Ein Einsteiger kann nicht viel von jemanden lernen, der versucht Pfuscharbeit auszubügeln, sondern nur vor von demjenigen, der ihm sagt, wenn etwas blanke Pfuscharbeit ist. Und bei über ein Dutzend globale Variablen in einem Code von unter 100 Zeilen, da war es halt nichts weiter als Pfusch und der Fragesteller muss sich halt überlegen, ob er Python lernen möchte oder nicht. Doch wenn er es lernen möchte, muss er noch einmal von vorn mit so einem Script beginnen.
Wenn Du mit Pfuscharbeit daherkommst, dann mußt Du Dich vorher selbst aufs Korn nehmen. Hier hast Du nämlich bereits selber bei nur 15 Zeilen Code schon drei globale Variablen: viewtopic.php?f=1&t=41196#p314791

Das ist aber dann auch nichts weiter als Pfusch und Du mußt Dir überlegen, ob Du Python lernen möchtest oder nicht. Du erwartest von anderen dass sie etwas tun, was Du selber nicht tust. Aber bei denen ist es Pfusch und bei Dir völlig in Ordnung?
Melewo hat geschrieben:Und wenn Du hier allen Ernstes behaupten möchtest, dass der Code bis auf einen Fehler völlig in Ordnung war, na dann kann wohl von Dir auch kaum einer etwas lernen.
Dieser Code vom TO war kein Beispiel für Code, den man präsentiert, damit sich andere ein Beispiel nehmen. Es war Code wie man ihn für sich selber schreibt. Und da will man nicht so viel tippen.

Wenn man schreibt play_field_height, weiß jeder was gemeint ist, aber was ist gheight?
Oder gar wenn es um racket_width geht und man schreibt nur rs, dann kann sich keiner unter rs etwas vorstellen.

Wenn man lernen will, wie tkinter funktioniert, dann schreibt man Code für sich und spart sich Tipparbeit. Für Code, den man für sich selber zum Lernen schreibt, war der Code in Ordnung. Für Code, den man an andere weitergibt, wie etwa gar einen Kunden, war er natürlich nicht in Ordnung, weil sich da keiner auskennt.

Aber es sollte doch in Ordnung sein, wenn jemand hier fragt, wo der Fehler sein könnte. Da muß man ihn doch nicht gleich fertig machen, weil das kein Muster Code war.

Und zu globalen Variablen und globalen Zuständen: Wenn mehrere Objekte gegenseitig auf Variablen (sogenannte globale Variablen) zugreifen, das sollte man vermeiden. Wenn ein Objekt auf seine eigenen Variablen zugreift, dagegen gibt es doch nichts einzuwenden. Und hier gab es nur das eine Objekt, nämlich das PingPong Spiel mit einem Canvas als Spielfeld. Und es waren die Variablen für das Geschehen auf diesem Spielfeld. Man hätte natürlich die meisten Variablen vermeiden können, indem man sich umständlich die Koordinaten aus den Canvas Items holt. Aber mit Variablen geht es einfacher. Nur hätte man sie aussagekräftig benennen sollen, damit auch andere etwas damit anfangen können.

Dem TO zu schreiben, dass das Pfusch wäre und er zuerst Python lernen solle und von vorn beginnen, war total nicht in Ordnung. Ihn höflich zu bitten, die Variablen aussagekräftig zu benennen, damit man versteht was gemeint ist, das wäre richtig gewesen.

Das wäre ein guter Anfang gewesen und sicher hätte er den Gefallen getan. Da wäre er aber dann wohl schon selber auf den Fehler gekommen - ist er wahrscheinlich auch schon längst. Dann wäre eine gute Beziehung hergestellt gewesen und man hätte ihm weitere Tipps gehen können, damit er mehr lernt. Aber wenn man ihm gleich seinen Code als Pfusch vor die Ohren knallt und das völlig unberechtigt, dann ist es eben mit dem Gewinn eines neuen Mitgliedes vorbei.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Hier ein Vorschlag zur Benennung:

Code: Alles auswählen

class Var: pass

def main():

    # constants ====================

    FIELD_WIDTH = 800
    FIELD_HEIGHT = 400
    BALL_SIZE = 20
    RACKET_SPEEED = 20
    RACKET_HEIGHT = 60
    RACKET_WIDTH = 20
    
    # variables =====================

    score = Var()
    racket_ypos = Var()
    # es geht auch
    def ball(): pass

    score.left = score.right = 0

    racket_ypos.left = racket_ypos.right = (FIELD_HEIGHT - RACKET_HEIGHT)/2

    ball.x , ball.y = RACKET_WIDTH , (FIELD_HEIGHT - BALL_SIZE)/2
    ball.dx = ball.dy = 15
    ball.playing = 0

    # sonstiger Code würde folgen

main()
Man kann eine Var Klasse machen oder einfach als Funktion deklarieren, damit man Objekte bekommt, deren Werte man auch in einer Funktion verändern kann. Damit braucht man kein global und kann das jederzeit in einer Funktion verwenden.

Mit entsprechender Benennung wäre der Code vom TO auch verständlich und man kann mit den Objekten das auch in einer Funktion unterbringen und braucht kein global.

Und da muss man auch nicht von vorne anfangen, sondern kann mit search und replace die Variablen ersetzen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Andere Benennungen gemacht (search replace). Eine Funktion außen rum, damit sich keiner beschwert und übersichtlicher umsortiert, nämlich Konstanten, Variablen, Widgets, Bindings und Spiel Ablauf und alles sieht doch gut aus:

Code: Alles auswählen

import tkinter as tk

class Var: pass

def main():

    # constants ====================

    FIELD_WIDTH = 800
    FIELD_HEIGHT = 400
    BALL_SIZE = 20
    RACKET_SPEEED = 20
    RACKET_HEIGHT = 60
    RACKET_WIDTH = 20

    # variables =====================

    score = Var()
    racket_ypos = Var()
    ball = Var()

    score.left = score.right = 0

    racket_ypos.left = racket_ypos.right = (FIELD_HEIGHT - RACKET_HEIGHT)/2

    ball.x , ball.y = RACKET_WIDTH , (FIELD_HEIGHT - BALL_SIZE)/2
    ball.dx = ball.dy = 15
    ball.playing = 0

    # widgets =======================

    win = tk.Tk();
    win.title("Pong")

    playing_field = tk.Canvas(win, bg='black',height=FIELD_HEIGHT, width=FIELD_WIDTH)
    playing_field.pack()
    ping_pong_ball = playing_field.create_oval(ball.x, ball.y, ball.x+BALL_SIZE, ball.y+BALL_SIZE, width=2, fill='white')
    line = playing_field.create_line(FIELD_WIDTH/2, 0, FIELD_WIDTH/2, FIELD_HEIGHT, width=4, fill="white", dash=(4, 8 ))
    left_racket  = playing_field.create_line(RACKET_WIDTH, racket_ypos.left, RACKET_WIDTH, racket_ypos.left+RACKET_HEIGHT, width=10, fill="white")
    right_racket  = playing_field.create_line(FIELD_WIDTH-RACKET_WIDTH, racket_ypos.right, FIELD_WIDTH-RACKET_WIDTH, racket_ypos.right+RACKET_HEIGHT, width=10, fill="white")
    # Create the score text
    counter=playing_field.create_text(FIELD_WIDTH/2, 20, text='0:0', font=('courier', 20), fill="white")

    # bindings ======================


    def lup(event):
        if racket_ypos.left > RACKET_SPEEED:
            racket_ypos.left=racket_ypos.left-RACKET_SPEEED

    def ldown(event):
        if racket_ypos.left < (FIELD_HEIGHT-RACKET_HEIGHT-RACKET_SPEEED):
            racket_ypos.left=racket_ypos.left+RACKET_SPEEED

    def rmove(event):
        ypos = event.y
        if ypos > 0 and ypos < (FIELD_HEIGHT-RACKET_HEIGHT):  # if in range
            racket_ypos.right = ypos

    def startit(event):
        ball.playing = 1

    # Use the following keys to move the racket
    win.bind('q', lup)
    win.bind('a', ldown)
    win.bind('<B1-Motion>', rmove)
    win.bind('<space>', startit) # start game by hitting space


    # game sequence ===============================================

    def move():

        if wenn_die_runde_nicht_zu_ende_ist():
            bewegt_sich_der_ball_ueber_das_spielfeld()

        if wenn_der_ball_am_oberen_rand_anstoesst():
            dann_soll_der_ball_sich_wieder_nach_unten_bewegen()

        elif wenn_der_ball_am_unteren_rand_anstoesst():
            dann_soll_der_ball_sich_wieder_nach_oben_bewegen()

        if wenn_der_ball_auf_den_linken_schlaeger_knallt():
            dann_soll_er_vom_linken_schlaeger_zurueckprallen()

        elif wenn_der_ball_auf_den_rechten_schlaeger_knallt():
            dann_soll_er_vom_rechten_schlaeger_zurueckprallen()

        if wenn_der_ball_ins_rechte_aus_geht():
            dann_erhoehe_die_trefferzahl_fuer_den_linken_spieler()
            positioniere_den_ball_auf_der_startposition_fuer_den_rechten_spieler()
            und_die_runde_ist_zu_ende()    

        elif wenn_der_ball_ins_linke_aus_geht():
            dann_erhoehe_die_trefferzahl_fuer_den_rechten_spieler()
            positioniere_den_ball_auf_der_startposition_fuer_den_linken_spieler()
            und_die_runde_ist_zu_ende()    
                
        schlaeger_ball_und_treffer_darstellen()
        
        win.after(50, move)


    def wenn_die_runde_nicht_zu_ende_ist():
        return ball.playing

    def bewegt_sich_der_ball_ueber_das_spielfeld():
        ball.x, ball.y = ball.x +ball.dx, (ball.y+ball.dy)
        
    def positioniere_den_ball_auf_der_startposition_fuer_den_linken_spieler():
        ball.x,ball.y,ball.dx = RACKET_WIDTH+10, racket_ypos.left+(RACKET_HEIGHT-BALL_SIZE)/2, abs(ball.dx)

    def positioniere_den_ball_auf_der_startposition_fuer_den_rechten_spieler():
        ball.x,ball.y,ball.dx = FIELD_WIDTH-RACKET_WIDTH-10, racket_ypos.right+(RACKET_HEIGHT-BALL_SIZE)/2,-abs(ball.dx)

    def wenn_der_ball_am_oberen_rand_anstoesst():
        return ball.y > (FIELD_HEIGHT-BALL_SIZE)

    def dann_soll_der_ball_sich_wieder_nach_unten_bewegen():
        ball.y, ball.dy = FIELD_HEIGHT-BALL_SIZE, -ball.dy

    def wenn_der_ball_am_unteren_rand_anstoesst():
        return ball.y < 0

    def dann_soll_der_ball_sich_wieder_nach_oben_bewegen():
        ball.y, ball.dy= 0, -ball.dy

    def wenn_der_ball_ins_rechte_aus_geht():
        return ball.x > (FIELD_WIDTH-BALL_SIZE)

    def wenn_der_ball_ins_linke_aus_geht():
        return ball.x < 0

    def dann_erhoehe_die_trefferzahl_fuer_den_linken_spieler():
        score.left=score.left+1     # increment score for left player

    def dann_erhoehe_die_trefferzahl_fuer_den_rechten_spieler():
        score.right=score.right+1   # increment score for right player

    def wenn_der_ball_auf_den_linken_schlaeger_knallt():
        return ball.x <= RACKET_WIDTH and ball.y>racket_ypos.left and ball.y < (racket_ypos.left+RACKET_HEIGHT)

    def dann_soll_er_vom_linken_schlaeger_zurueckprallen():
        ball.x, ball.dx = RACKET_WIDTH+5, -ball.dx

    def und_die_runde_ist_zu_ende():
        ball.playing = 0  # stop the game

    def wenn_der_ball_auf_den_rechten_schlaeger_knallt():
        return ball.x >= (FIELD_WIDTH-RACKET_WIDTH-BALL_SIZE) and ball.y >= racket_ypos.right and ball.y <= (racket_ypos.right+RACKET_HEIGHT)

    def dann_soll_er_vom_rechten_schlaeger_zurueckprallen():
        ball.x, ball.dx = (FIELD_WIDTH-RACKET_WIDTH-BALL_SIZE-5), -ball.dx

    def schlaeger_ball_und_treffer_darstellen():
        playing_field.coords(ping_pong_ball, ball.x, ball.y, ball.x+BALL_SIZE, ball.y+BALL_SIZE)
        # draw current score
        playing_field.itemconfigure(counter, text=str(score.left) + ":" + str(score.right))
        # Change the positon of the two rackets
        playing_field.coords(right_racket, FIELD_WIDTH-RACKET_WIDTH, racket_ypos.right, FIELD_WIDTH-RACKET_WIDTH, racket_ypos.right+RACKET_HEIGHT)
        playing_field.coords(left_racket, RACKET_WIDTH, racket_ypos.left, RACKET_WIDTH, racket_ypos.left+RACKET_HEIGHT)

    # == start game ======================

    move()  # draw next sequence
    win.mainloop()

main()
Ich meine, das macht man eben so. Zum Schluß benennt man besser und kopiert übersichtlicher um. Aber es dass man es wegwirft, weil es noch nicht übersichtlich geordnet ist, ist Krampf. Also, so ein Programm ist kein Pfusch es fehlten nur noch abschließende Verschönerungsarbeiten.

Allerdings RACKET_WIDTH habe ich nicht richtig benannt. Es handelt sich hierbei um den Abstand vom Spielrand. Die Breite ist 10.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alfons Mittelmeyer: man kann eine Var-Klasse deklarieren und einfach irgendwelche Attribute nachträglich dranhängen, macht man aber nicht. So hast Du also Deine globalen Variablen in mehrere Gruppen einsortiert, macht die Sache etwas übersichtlicher, man sollte aber erst gar nicht mit globalen Variablen anfangen. Die Sortierung ist aber auch falsch. Es gibt keinen Score mit left und right, sondern einen left_player und einen right_player, die jeweils einen Score und eine Position haben und auch noch ein Canvas-Objekt, das bei Dir noch extra ist. Und da sowohl left_player als auch right_player die selben Attribute haben, ist das die Gelegenheit, daraus EINE Player-Klasse zu machen. Das ist aber für den TE wahrscheinlich noch ein Schritt zu viel, so dass ich schon als erste Antwort geschrieben habe, erst einmal mit Funktionen anzufangen (richtigen und nicht die »def«-Kommentare, die das Programm so schön unstrukturiert machen, wie Du sie hast)
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Ich kann es nicht verstehen, warum man hier persönlich wird. Das Forum soll doch als Spielwiese für Diskussionen offen sein. Natürlich sollen und können verschiedenste Herangehensweisen diskutiert werden. Dabei können Vor- und Nachteile erörtert werden. Es gibt doch den Spruch: " Es führen viele Wege nach Rom.
Ihr könnt und dürft doch nicht über richtig und falsch urteilen, sondern darauf hinweisen, dass man mit der oder der Methodik durchaus unvorhergesehene Systemverhalten erzeugt. (z.B. globale Variablen definieren, obwohl es schön ist g=9,81 m/s^2 als global zu haben)

Aus meiner Sicht hatte Alfons nicht "Pfuscharbeit" betrieben oder den Code sonderlich umgearbeitet, sondern nur das bis dahin bestehende Programm zum laufen gebracht und das Systemverhalten wie erwartet, richtig gestellt. Kann es nicht sein, dass manch anderer den ursprünglichen Code nicht richtig verstanden haben und das dann als Pfusch bezeichnet hat?

Ich möchte mich an dieser Stelle an die Forumseigner wenden, da ich mit dem Ausschluß von Alfns nicht einverstanden bin. Ich möchte nicht streiten und böses Blut schüren, sondern möchte das hier konstruktiv gearbeitet wird. Aber die Anschludigungen und Beleidungen, man sollte erst einmal die Grundlagen lernen und den Code wegschmeißen, zeigen eher, dass einige so abgestumpft sind, immer dasselbe zu den neuen Programmierern zu erzählen.

Ich bin selbst auch jemand, der erst neu in der Python-Programmierung ist. Mir hat Alfons mit dem GUI-Designer und zahlreichen anderen Vorschlägen zur Seiten gestanden. ich denke, ich habe ihn mit 100000 Fragen genervt, da ich seine Codevorschläge nicht verstanden hatte. Durch ihn habe ich durchaus vieles dazu gelernt, da ich an meinem Projekt gelernt habe und nicht an Codeschnipseln.

Ich hoffe, dass sich der rauhe Ton in dem Forum ändert und konstruktiv gearbeitet wird. Ansonsten muss es eben umgetauft werden in "PYTHON-EXPERT-Forum.de".
Ich hoffe, dass hier auch mal der Besitzer des Forums etwas dazu sagen könnte und nicht nur die Moderatoren.

Im Übrigen appeliere ich an die Moderatoren auch mal an ihre Anfänge zu denken und Alfons wieder zuzulassen. Er zeigt euch , dass andere Wege, andere Gesichtspunkte, andere Hernagehensweisen möglich sind. Bitte verwerft nicth alles. Es geht auch anders, Wie gesagt, viele Wege führen ans Ziel.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Gegen

Code: Alles auswählen

GRAVITY_CONSTANT = 9.81  # m/s^2
auf globaler Ebene ist gar nichts einzuwenden. Problematisch wird es, sobald es sich um veränderbare Inhalte handelt. Dann wird ein Programm potentiell fragil, da die Gefahr von Seiteneffekten zunimmt. Code dieser Art ist schwerer zu debuggen und wird, wenn er mit der Zeit an Umfang zunimmt, im Extremfall sogar unwartbar.

Erstaunlicherweise musste dieses hier immer wieder durchdiskutiert werden, solange, bis einige wohl dünnhäutig wurden, da auch der Anspruch bestand, gerade Anfänger keine Lösungen zu zeigen, die erfahrungsgemäß problematisch sind.

Was im Forum hinter den Kulissen geschehen ist, vermag ich nicht zu sagen. Ich bin jedoch in einem anderen Forum (ein B2B Forum, das mit Programmieren überhaupt nichts zu tun hat) Moderator und wir hatten einmal das Problem sehr rüder Inhalte, wobei ich auch per PM angegangen wurde. Wir konnten mit der Situation dann umgehen, in Folge aber haben einige Moderatoren ihre Tätigkeit niedergelegt. Machen waren vielleicht auch nicht darauf vorbereitet, dass Kommunikationsstil und Moderationsmöglichkeiten in einem Forum nicht mit denen in einer persönlichen Gesprächsrunde deckungsgleich sind.

Ich finde es gehört zur Netiquette sich in einem Forum so zu verhalten, dass ein Moderator erst gar nicht in Verlegenheit gebracht wird, moderieren zu müssen.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

stefanxfg hat geschrieben:Ich kann es nicht verstehen, warum man hier persönlich wird. Das Forum soll doch als Spielwiese für Diskussionen offen sein. Natürlich sollen und können verschiedenste Herangehensweisen diskutiert werden. Dabei können Vor- und Nachteile erörtert werden. Es gibt doch den Spruch: " Es führen viele Wege nach Rom.
Ihr könnt und dürft doch nicht über richtig und falsch urteilen, sondern darauf hinweisen, dass man mit der oder der Methodik durchaus unvorhergesehene Systemverhalten erzeugt. (z.B. globale Variablen definieren, obwohl es schön ist g=9,81 m/s^2 als global zu haben)

....

Im Übrigen appeliere ich an die Moderatoren auch mal an ihre Anfänge zu denken und Alfons wieder zuzulassen. Er zeigt euch , dass andere Wege, andere Gesichtspunkte, andere Hernagehensweisen möglich sind. Bitte verwerft nicth alles. Es geht auch anders, Wie gesagt, viele Wege führen ans Ziel.
Mir ist nicht klar wovon du da redest. Niemand hat Alfons irgendwo rausgeworfen. Das mag mancher sich wuenschen, aber es ist ein grosser Schritt, und er ist schlicht nicht gegangen worden.
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Hallo __deets__,

ich bin mit Alfons noch im Kontakt. Mir hat er mitgeteil, dass er sein Login gesperrt ist. Daher habe ich mich hier zu Wort gemeldet. Aber nicht um ihn zu verteidigen, sondern um zu sagen, dass ich mir die Art und Weise der Diskussionen nicht gefällt. Jedenfalls kann es nicht sein, dass man als Neuling für offentsichtliche Fehler an den Pranger gestellt wird.
Ich möchte und werde darüber nicht weiter diskutieren. Ich lese jedenfalls solche Kommentare mit großem Bedauern.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hier besteht eben ein gewisser Anspruch, dass man tendenziell eher hochwertigen Code vermitteln möchte. Anfänger sollen von erfahrenen Programmierern lernen können. Alfons untergräbt dieses Prinzip völlig, weil die meisten seiner Vorschläge an sich funktionieren mögen, aber stilistisch unterirdisch sind. Und nachdem wohl niemand mehr so wirklich auf seine Monologe im TKinter-Forum eingegangen ist, fing er an sich in fremde Threads einzumischen. Mal als Beispiel: Normalerweise sollten Doppelposts die Ausnahme bleiben. Alfons hingegen knallt regelmäßig Fünfachposts raus. Und Alfons verstößt auch anderweitig IMHO völlig bewusst gegen hier geltende Verhaltensregeln. Sofern er tatsächlich gesperrt wurde, finde ich das ehrlich gesagt in diesem Fall nachvollziehbar. Zensur muss manchmal sein, wenn Freundlichkeit und Offenheit schamlos ausgenutzt wird. Aus meiner Sicht ist Alfons ein klassischer Troll, der zur Zeit äußerst erfolgreich vorgeht, da er es schafft, das Klima hier zunehmend zu vergiften.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn
stefanxfg hat geschrieben:Hallo __deets__,

ich bin mit Alfons noch im Kontakt. Mir hat er mitgeteil, dass er sein Login gesperrt ist. Daher habe ich mich hier zu Wort gemeldet. Aber nicht um ihn zu verteidigen, sondern um zu sagen, dass ich mir die Art und Weise der Diskussionen nicht gefällt. Jedenfalls kann es nicht sein, dass man als Neuling für offentsichtliche Fehler an den Pranger gestellt wird.
Ich möchte und werde darüber nicht weiter diskutieren. Ich lese jedenfalls solche Kommentare mit großem Bedauern.
Dafuer, das du ihn nicht verteidigen moechtest, springst du recht nachdruecklich in die Bresche fuer ihn.

Das er dir persoenlich geholfen hat ist schoen fuer dich. Das er aber gleichzeitig nun ein leuchtendes Beispiel fuer eine gelungene Diskussionskultur ist entbehrt nicht einer gewissen Ironie. Alfons ist alles andere als ein unbschriebenes Blatt wenn es um die Herabsetzung der Ansaetze anderer geht. Insofern muss er es auch aushalten, wenn es ihm mal entgegenschallt, wie er es in den Wald hineinrief.

Ob die Disukssionskultur im allgemeinen hier der Verbesserung bedarf, steht auf einem anderen Blatt. Das mag sein. Auf der anderen Seite zeugt deine Haltung nicht von viel Verstaendnis fuer die Position derjenigen hier, die ebenfalls unter viel Aufwand Antworten auf die Fragen vieler Leute hier geben.

Zum einen ist hier halt der Anspruch, nicht "irgendwie" etwas zum laufen zu bringen. Genausowenig wie dir ein Installateur-Meister anerkennend auf die Schulter klopft, wenn du die Gastherme mit Klebeband und Spucke an der Wand befestigt hast, und dir dringend anraet, das vernuenftig zu machen, so versuchen auch wir hier, die Anfaenger auf den richtigen Weg zu setzen. Und ja, dazu gehoert auch die Ansagen, das etwas mal einfach Mist ist.

Zum anderen gibt es hier einen deutlichen Aufwaertstrend (ich mache dafuer den Raspberry PI "verantwortlich") von Leuten, die statt anfangen einfach abgreifen wollen. Wir sollen hier eine Art Programmierbasar darstellen, bei dem einen unverzueglich und natuerlich kostenlos geholfen wird. Ein Wunsch, das richtige Programmieren zu erlernen, ist nicht wirklich zu erkennen.

Das Tag fuer Tag immer wieder zu erleben, und damit umzugehen ohne den Glauben daran zur verlieren, das hier jemand Hilfe zur Selbsthilfe moechte, ist halt auch nicht so ganz einfach. Das rechtfertigt keine Unverschaemtheit, aber eine gewisse Zurueckhaltung nicht gleich alles frei Haus zu liefern und zu verlangen, dass die Leute ernsthaftes Interesse zeigen, durchaus.
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

stefanxfg hat geschrieben:Hallo __deets__,

ich bin mit Alfons noch im Kontakt. Mir hat er mitgeteil, dass er sein Login gesperrt ist.

Der User Alfons Mittelmeyer wurde von mir für unbestimmte Zeit gesperrt.
Antworten