Jump to content

Egoist

Mitglieder
  • Gesamte Inhalte

    4.185
  • Benutzer seit

  • Letzter Besuch

4 User folgen diesem Benutzer

Über Egoist

  • Rang
    Analytiker

Profile Information

  • Gender
    Male

Letzte Besucher des Profils

3.082 Profilaufrufe
  1. Moin Lexis, natürlich braucht man weder Python noch Excel, um Roulette mathematisch in Bedrängnis zu bringen. Ich brauche dazu nicht einmal Papier und Bleistift, obwohl solche Hilfsmittel noch erlaubt sind. Die Vokabel "schlagen" würde ich in dem Zusammenhang nicht gern benutzen, denn es ist nur eine Optimierung der eigenen Möglichkeiten. Das Konzept von Excel ist zwar bestechend (und ist von Miniweich damals geklaut worden), ist aber stark limitiert. Sofern man auf das angeflanschte VBA ausweicht, wie z.B. @Dr. Manque, hat man zwar erweiterte Möglichkeiten, diese sind aber trotzdem extrem begrenzt. Mit Python liegt einem sozusagen die aktuelle Welt zu Füssen, denn es gibt enorm viele Erweiterungen/Module für jeden Zweck. Ich wage nicht einmal anzufangen zu umreissen, welchen Umfang das hat. Aber ein paar Beispiele trotzdem: Es gibt die öffentlich verfügbare OCV-Library, mit der man im Fluge Videodaten auswerten kann, Gesichtserkennung wäre da nur ein Stichwort. Damit ist es zB kein Problem eine Roulettekugel zu verfolgen nebst Rotor, um einen KG Algorithmus zu basteln. Es gibt hochoptimierte Matrizenberechnungen, die Milliarden Coups zerknuspern können, als wären es Kartoffelchips. Excel macht schon bei einer Millionenperm mächtig die Backen dick. Heutige KI-Anwendungen sind für Python ein Klacks, weil es auch dafür Module gibt. All das kann man sich oft mit wenigen Codezeilen zu Nutze machen. Wer also halbwegs uptodate sein will, sollte Python können. Nicht mehr und nicht weniger, wollte ich mit diesem Thread transportieren. Und falls es ein physikalisches OC geben sollte, bei dem man noch mindestens 5sec nach Abwurf setzen kann, wäre ich für eine Info dankbar. Leider wäre das dann dort nicht mehr lange möglich... Gruss vom Ego
  2. Nachmal @Dr. Manque In dieser Passage taucht der gleiche Fehler auf, den ich im ersten Posting angesprochen hatte: # Eingabefeld für Permzahlen PZahl = tk.StringVar() ZahlEingabe = ttk.Entry(win, width=4, textvariable=PZahl) ZahlEingabe.grid(column=1, row=2) Da "textvariable=" weggeworfen wird, gibt es auch keinen Bezug zu Deinem Entry-Widget Hier greifst Du in einer Funktion darauf zurück und wunderst Dich über den Output: # Button Click Event Function def click_me1(): print(PZahl) # nur zum Test, funktioniert nicht! if label1.configure(foreground='red'): label1.configure(foreground='blue') elif label1.configure(foreground='blue'): label1.configure(foreground='red') # label1.configure(text=name) pass Scheinbar wird von tkinter durch Deine vorherige Deklaration eine Stringvariable geführt, die man auch im Namespace von Funktionen findet. Wäre das nicht so, wäre sie hier undefiniert. Ich bin auch noch selbst überrascht, dass man GUI-Widgets so einfach im Namensraum einer eigenen Funktion vorfindet. Die scheinen allesamt zwangsglobalisiert zu sein ...
  3. Nachdem Teil 1 dankenswerterweise von der Forensoft angenommen wurde, gehts jetzt weiter. In meinem letzten Codebeispiel hatte ich folgende Passage: e = Entry(frame1, width=20, bg="yellow") e.bind("<Return>", set_in) e.pack(side=LEFT) e ist das Eingabe-Widget vom Typ "Entry" frame1 das übrgeordnete Layoutelement da das kein Gridlayout war, kam e.pack Methode zum Einsatz, um es in Erscheinung zu bringen. e.bind ruft jedesmal wenn die Return-Taste dort gedrückt wird, die Funktion "set_in" auf (Achtung hier immer ohne Klammern!). Schreiben wir nun eine neue, einfache Version der Funktion "set_in": def set_in(event): print(e.get()) Falls gewünscht, kann man e.get() in einem String zwischenspeichern und den dann an eine Liste anhängen usw... Die Angabe von "event" als Parameter soll nötig zu sein, auch wenn wir den nicht auswerten (Hörensagen). Viel Spass mit Python wünscht Euch Ego
  4. Hallo Albert, das funktioniert hier auch, allerdings gibt es vorher in Zeile 83 ein Problem. dirtext = ttk.Entry(win, width=40, textvariable=name) "name" ist bei Dir nicht initialisiert. Ich hatte es ersetzt mit "D:\\", aber das verhindert nur den Fehler, hat aber sonst keine Auswirkung. Ich vermute das Entry-Widget ignoriert diesen Parameter. Interessanterweise kann ich in das Eingabefeld sowohl "D:\\Text" eingeben, als auch "d:\text" oder "d:\\\\\\\\\Text", es wird immer das Text-Verzeichnis auf der D:\ Partition richtig gelesen. Einfacher Backslash genügt also, jede Mehrzahl entfernt die aufgerufenene Methode kommentarlos. Füge mal in die noch leere Zeile 58 print(str(txtfiles)) ein, ohne eine neue Zeile zu erzeugen. Merkst Du was? Wie kann denn sowas wohl passiert sein??? Auf jeden Fall ist es höchst problematisch, mit Variablen ausserhalb ihres Geltungsbereichs zu hantieren. Für Testzwecke mag es mal angehen, aber wenn Du so ein Feature öfter brauchst, sollten wir eine eigene Combobox definieren, die sowas kann. Bis dahin gibt es ein einfaches Workarround: def click_FillPermFiles(): dirname = dirtext.get() print('Dir=' + dirname) filesnames = [] # txtfiles war hier von Dir lokal erneut erzeugt worden, umbenannt... for filename in os.listdir(dirname): filenames.append(filename) print(filename) return(filenames) # Nun gibt die Funktion eine Liste zurück und müsste nicht mehr click_XXX heissen. # Der Aufruf über einen Button würde evtl sogar schief gehen. # Stattdessen ruft die nächste Funktion click_FillPermFiles() gleich selbst auf: def click_FillCombo(): #global txtfiles # Das kann jetzt entfallen global combo_1 # das leider noch nicht, das geht aber alles besser. combo_1['values'] = click_FillPermFiles() # Die Combobox holt sich selbst die aktuellen Files aus dem Verzeichnis # das habe ich alles noch nicht eingehackt, sondern nur hier ins Codefenster geschrieben. # es kann also noch Überraschungen geben. Sicherlich, aber das obige ist erstmal wichtiger und ich habe Angst das Posting zu lang zu machen. Gruss vom Ego (nicht Egon)
  5. Egoist

    Spiel die Progression nicht die Chance

    Das scheint mir mal ein guter Ansatz zu sein... Ich werde es mal als Anregung übernehmen. Allerdings kann man maximal 2 Plein weglassen, sonst setzt man 36 gegen 37 ohne Gewinnaussicht. Also ist der definitiv schlechteste Marsch nun auch verhaftet: Setze die 36 zuletzt getroffenen Plein gleichzeitig Du hast die Chance alles zu verlieren, eingetauscht gegen die Chance nichts zu gewinnen... Bombensicheres Verlustgeschäft... Gruss vom Ego
  6. Egoist

    Spiel die Progression nicht die Chance

    Hallo Starwind, das hatte ich doch schon hier mehrfach vorgeführt, aber danke für die interessante Frage. Die Progression läuft nur mit dem Geld der Bank, das eigene Kapital wird quasi aus dem Spiel genommen. So lange es keine Ballungen gibt, gibt es auch keine echten Einsätze. Die Jetons wandern dann nur intern von der rechten in die linke Tasche. Das ist nicht zur Selbstbefriedigung, sondern eine besondere Art der papierlosen Buchführung. Gruss vom Ego
  7. Hallo Wiener, sicherlich ist es ok, Gültigkeitsabfragen out zu sourcen (grässliches Deutsch), dann gibt es intern keinen Overhead. Halt, Stopp! Ich hatte doch schon mit grosser Mühe herausgefunden, dass "conda" die "kivy 1.10.1" lauffähig sortiert kriegt. Weil ich das aber im Systemumfeld gestartet hatte , gab es Rückschritte beim Navigator und bei Spider. Das muss man nicht so machen, die Installation gehört in ein virtuelles Umfeld. Hätte ich mich nicht heute um Alberts tkinter-Problem gekümmert, wäre ich dort evtl schon weiter. Gruss vom Ego
  8. Hier nun mein modifizierter Code, bitte dafür die Tutorials von Frederik Weitz ansehen (zwinker). from tkinter import * from tkinter.scrolledtext import * from tkinter.ttk import Combobox # Vorbelegung einer Liste mit allerhand einzelnen Strings, die schliesslich in der Combobox landen werden. comboliste = ["Hallo ", "Albert!\n\n", "Das ", "ist ", "mein ", "erster ", "Text.\n", "Der ", "ist ", "noch ", "kurz."] comboliste += ["\n\nDas gelbe Feld ist ein Eingabefeld."] comboliste += ["\nEingaben dort mit <Return> beenden."] comboliste += ["\nBitte die Combobox (rechts) vorher"] comboliste += ["\nund nachher genau durchsehen..."] # hier wird nur ein langer String (Zeichenkette) daraus gemacht. volltext = " ".join(comboliste) def set_in(event): # Diese Funktion wird bei Eingabe von <Return> im Entryfeld (gelb) aufgerufen. global comboliste # Das ist nicht sehr sauber, die Liste wird aus dem globalen Kontext abgesaugt. global cb # ebenso die Combobox, das geht sicher alles besser. zettel.insert(END, "\n" + e.get()) # Pipifax es wird der Inhalt des Entryfeldes (e) angehängt. comboliste = (zettel.get("1.0", END)).split() # interessanter, alle Worte im Textfeld werden in eine Liste überführt. print(comboliste) # die kann man auf der Console nun begutachten. # Jetzt kommt die Wurzel des Übels, welche Albert gequält hat, wie ein fauler Zahn. # Wir haben zwar etwas unschönes gemacht, um in der Definition an die Combobox zu gelangen, # aber es demonstriert die grundsätzliche Vorgehensweise. cb['values'] = comboliste # Die Combobox hat eine für mich auch noch seltsame Eigenschaft, # da das wie ein Listenindex aussieht, dürfte 'values" intern # auch einem Integer entsprechen. # Immerhin kann man mit dem String "values" als Index auf das Objekt ComboBox schreibend zugreifen. # Das scheint es gewesen zu sein... return root = Tk() # Falls es zu dem folgenden noch Fragen gibt, Tutorial gucken und dann hier fragen... frame1 = Frame(root) frame1.pack(fill=X) e = Entry(frame1, width=20, bg="yellow") e.bind("<Return>", set_in) e.pack(side=LEFT) cb = Combobox(frame1, height=5, width=15, values=comboliste) cb.pack(side=LEFT) zettel = ScrolledText(root, bg="white", width=50, height=20, font="Arial 10") zettel.pack() zettel.insert("1.0", volltext) zettel.tag_config("fett", font=("Georgia", "10", "bold")) root.mainloop() Viel Spass mit Python wünscht Ego
  9. Bitte, bitte Albert! Bitte nicht den Sand in den Kopf stecken!!! Als ich das gelesen habe, war ich noch zuversichtlich, es mit ein paar Zeilen Code hinzukriegen, denn ich dachte man könne den Namen einer Liste übergeben und gut ist. Leider wird nicht der Name in values referenziert, sondern der aktuelle Inhalt der Liste wird übernommen. Solche Verständigungsprobleme wird es zu Beginn immer wieder geben. Bitte quäle Dich dann nicht so lange im stillen Kämmerlein, bis zur totalen Aufgabe. Poste lieber Dein Problem hier, oder in einem Pythonforum (für bessere Antworten). Obwohl ich nicht verstehe, was eine Combobox mit 3000+ Zeilen für den Anwender bringen kann, habe ich mich sofort um Dein Problem gekümmert. Dabei habe ich auf ein anderes Tutorial zurückgegriffen, aus dem das Gerüst des folgenden *.py besteht. https://www.youtube.com/watch?v=ahtKa4MiJgs&amp;list=PLAy9pyHEMnr0oBS3b4TeEAg49RhnvQQVK Angefangen habe ich in #44 wo es um die Combobox ging. Daher ist noch der "zettel"-Code aus den vorhergehenden Folgen drin. Meinen modifizierten Code spalte ich ab, wegen den Forenproblemen. Viel Spass mit Python, wünscht Ego
  10. Hallo nochmal, ich freue mich über jede praktische Übung hier sehr. Ohne es jetzt schon in PyCharm überführt zu haben, sieht alles ganz ordentlich und lauffähig aus! Zur Übung kann man das so machen und wenn es fehlerfrei ist, kommen die beiden def-Blöcke bitte in Deine Klasse "RouldefWien" in der Datei roulib00.py. Danach kannst Du die Datei unter roulib01rc01.py abspeichern. Deine Übung ginge dann etwa so weiter: import RouldefWien from roulib01rc01 as RdW #RdW ist die hier jetzt gültige Abkürzung (frei wählbar) chance = RdW() # greift auf das eingebundene Modul zurück, der Rest ist dann wie gehabt chance.bestimmen(int(input("Zahl eingeben:"))) print("EC:",chance.rn,chance.pi,chance.mp) Hoffentlich habe ich keine Fehler eingehackt, denn das war nicht aus getestetm Code kopiert. Die Methode "bestimmen()" gehört dann ab sofort zu den neuen Fähigkeiten Deiner Wiener Klasse. Zu meiner numerischen Klasse passt Deine Definition allerdings nicht und ist ihr (noch) unbekannt. Ich gebe aber noch zu bedenken, dass Deine Methode unpassende Parameter mit einem Bauchklatscher quittieren wird. Viel Spass mit Python wünscht Euch Ego
  11. Moin Wiener, es hat mich einen Batzen Versuche gekostet, bis es so halbwegs hingehauen hat. Bestimmt habe ich mir schon im Vorfeld die Hürden selbst tüchtig hoch gesetzt. Kivy 1.10.1 braucht eine Tonne voll anderer Module, die alle zueinander passen müssen. Unangenehmerweise dürfen viele davon nicht die aktuellsten sein. Vermutlich bin ich daher mit dem Pip- Installer so herzhaft gestrandet. In meiner Not habe ich schliesslich Anaconda installiert, was allerdings dauerte. Nach einem Fehlstart, weil ich noch massig Programme auf dem Schirm offen hatte, konnte ich auf der frisch gebooteten Maschine in der Eingabeaufforderung mit einem Einzeiler: conda install kivy -c conda-forge das Problem teilweise lösen. Teilweise nur deshalb, weil sich danach weder der Anaconda Navigator noch Spyder mehr starten liessen. Wer das verhindern will, muss kivy unbedingt in eine virtuelle Umgebung installieren, denn es werden dabei z.T. neuere Libraries durch ältere ersetzt. Das dürfte der Grund dafür sein, dass bei mir der Navigator und Spyder futsch sind. Mit PyCharm konnte ich aber den zurückgelassenen Systeminterpreter mit den kivy-Modulen problemlos einbinden und endlich das kleine s_cript aus o.a. Tut#9 laufen lasen... Du siehst, man bekommt nicht alles geschenkt. Viel Erfolg und zähe Nerven wünscht Euch Ego
  12. Moin nach Wien, vorhin habe ich begonnen ein Tutorialfile einzuhacken (das s_cript aus den o.a.Crashkurs #9) ende aber bei PyCharm auf der Schnauze. Es fehlt eine Anbindung an sdl2 DLL oder so, daher habe ich nach kivy.org mein Systempython beackert und diesen als Interpreter bei PyCharm gewählt. Das brachte keine Besserung. Vorläufig stehe ich mit dem kivy-Paket auf dem Schlauch... Wäre für Hinweise dankbar, Ego
  13. Hallo Wiener, natürlich habe ich auch Kivy schon in der engeren Wahl. Was mich an QT so angemacht hatte, war der Designer. Ob es sowas auch schon für Kivy gibt, weiss ich leider nicht. Falls Du das noch nicht gesehen hast, ist es vielleicht eine Blick wert: https://www.youtube.com/watch?v=F7UKmK9eQLY&amp;list=PLdNh1e1kmiPP4YApJm8ENK2yMlwF1_edq Wenn es gefällt, kannst Du das in Deinen Thread überragen. Kivy hat den Vorteil Touchscreens einzubinden und hat den Anspruch auf grösste Plattformunabhängigkeit. Klar, dass Dich das als Smartphonejunkie besonders anmacht... Bei der ersten Ansicht hatte ich mitgenommen, man müsse auch noch Kivyfiles schreiben, jetzt sehe ich mir das nochmal an. Gruss vom Ego
  14. Meine Wut über den verlorenen Artikel hat sich etwas gelegt, zumal ich auch an der Pythonfront mit hartnäckigen Problemen zu kämpfen hatte. Die Notwendigkeit einer graphischen Benutzeroberfläche(GUI) wird immer dringender, denn ohne sie kann man kein vernünftiges Programm bauen. Meine Suche nach einer erfolgversprechenden Lösung führte mich zu Qt, bzw zu PyQt und dem Tool "designer.exe" Leider ist die Verbindung der GUI mit einem Pythonprogramm noch vergleichsweise knochig, aber der Designer ist schon klasse. Weniger klasse ist aber, dass man ohne Klassendefinitionen in Python nicht weit kommt. Gruss vom Ego
  15. Moin Feuerstein, +1 ist auch wirklich keine Progression, die man lange gegen einen fiesen Rücklauf spielen kann. Sie ist noch nicht einmal sinnvoll für kürzere Spiele, denn die Umsatzrendite geht kontinuierlich zurück. Im Idealfall kommen EC intermittent, also RSRSRSRS, so machst Du mit 3 Stücken Einsatz ein Stück Gewinn. Dauerintermittenz ist aber alles andere als normaler Zufall. Obige RSRSRSRS-Folge ist genau so selten, wie 8xR oder 8xS in Folge. Gehts Du mit +1 nach Verlust (und -1 nach Gewinn) gegen die Permanenz vor und kassierst eine Abweichung von -18, dann machst Du bei der erlösenenden Intermittenz aus 18+19 = 37 Einsatz ein Stück Gewinn. Da wir wissen, dass jedes 37. gesetzte Stück normal an die Bank geht, wissen wir auch, bei Stufe 18 ist der Arsch schon ab. (Eine Ausnahme stellen Tische mit Zeroteilung auf EC dar, da ist es nur jedes 74. Stück) Also ist die +1 eine gänzlich uneeignete Progression überhaupt. Gruss vom Ego
×