Jump to content
Roulette Forum

Egoist

Mitglieder
  • Gesamte Inhalte

    5.007
  • Benutzer seit

Alle erstellten Inhalte von Egoist

  1. das war ein deadlock... nach Nennung des Avatars war Ende für den Editor... Vor Wochen habe ich besagtem Betreiber einen toxischen Forenbeitrag herausdestilliert. Es gab keine Antwort...
  2. Ich fürchte, das liegt nicht an Übungen, die durchgeführt werden, sondern an Untätigkeit. Vor Wochen habe ich @Paroli
  3. Dein Konzept mit der ComboBox ist für den Durchschnittanwender auch eher überraschend. Normal erwartet man links ein Dateimenü mit dem Eintrag "Lade Pool-Permanenz(en)..." gefolgt von einem normalen Dateidialog, das geht mit tk bzw ttk durchaus auch. Willst Du die Dateien länger im Blick behalten, böte sich ein "Treeview" an. Darf ich fragen, was danach passieren soll? Vermutlich wird die Datei erstmal eingelesen und weil Du sie quasi mit einem Mausklick austauschen kannst, vermute ich weiter, dass die ganze Auswertung danach sofort erfolgt. So könnte man mit der ComboBox die Auswertegrafiken fast wie im Daumenkino durchflippen.
  4. Ohje, armer Albert, hätte ich das heute gemacht, bei voller Sonneneinstrahlung, müsste ich jetzt sicher in die "Eistonne". Es war nicht sonderlich ausgearbeitet, das ginge sicherlich eleganter. Ein wichtiger Punkt ist der Verzicht auf globale Variablen, das erleichtert alles sehr. Dann wurde die Funktion read_Directory() aus der Reihe der Click-Funktionen entfernt und selbständig gemacht. Man übergibt jetzt einfach einen Path als String und erhält eine Liste der Dateien und Unterverzeichnisse zurück. Die Clickfunktionen sind eher nur zum Eventhandling zu gebrauchen, weil sie immer bloss den Parameter (event) erhalten. Ich würde diese möglichst kurz halten und die eigentliche Arbeit in vollwertigen Funktionen mit Input und Output erledigen. Fasse mich wieder kurz, wegen Forenproblemen. Gruss vom Ego
  5. Hallo Hans,ja habs im Kopf überschlagen.Man setzt 143, um 1 evtl zu gewinnen. Langfristig kostet das 3 Stücke pro Kugel. Sorry für das kaputte Format , danke und Gruss vom Ego
  6. Hallo Leute, für die Neugierigen unter Euch, habe ich heute ein Video verlinkt, mit dessen Inhalt man Rüstzeug für eigene Erkundungen erhält. Englisch wird in Grundzügen benötigt. Viel Spass mit Python wünscht Euch Ego
  7. Hallo Albatros, das trifft nicht mindestens 1x pro Rotation, sondern auf lange Sicht maximal einmal pro Rotation/Zeile... Diese Spielweise entbindet Dich allerdings vom Buchführungsstress, den sich hier manche auferlegen, ohne schlechter zu sein. Du kannst Dir ja mal spasseshalber festhalten, wie lange eine Plein braucht, um wieder zu erscheinen. Millimeterpapier, y-Achse für die Treffer pro Slot, x-Achse für die Slots, bei 1 war der Trefferabstand 1, bei x=2 summieren sich die Doppler in 2 Coups, usw. Du bekommst recht rasch eine schöne Kurve, die besagt, dass Slot 1 (unmittelbarer Wiederholer) mehr Treffer hat, als Slot 2 (Treffer nach einer Zwischnniete). Das glättet sich in der langen Sicht ganz phantastisch... Nun guckst Du in Slot 37 nach, dort sind die Treffer Deines Systems. Guck mal links davon... Was fällt Dir auf? Mathematik am Abend, mit Gruss vom Ego
  8. Hallo nochmal, hier die Überarbeitung von Alberts Formular, es sollte alles jetzt laufen. # tkTest04.py # basiert auf dem Code von Dr. Manque # geändert am 23.07.2018 # Egoist www.roulette-forum.de # ======================== # imports # ======================== import tkinter as tk from tkinter import ttk import glob import os hinweis01 = ["(Bitte Pfad oben eingeben)"] fehler01 = ["Pfad ist üngültig!"] # Erzeuge eine Instanz win = tk.Tk() # Füge einen Titel hinzu win.title("Combobox Übung") # Enable resizing x-dimension, disable y-dimension win.resizable(True, True) win.geometry('800x300') # Die Liste [txtfiles] initialisieren ''' txtfiles = [] # kann weg txtfiles.append('file 1') # die Defaultwerte führen ins Nichts txtfiles.append('file 2') # also auch weg ''' # 2 Überschriftszeilen label2 = ttk.Label(win, text="* User Interface für Roulette-Tests *") label2.grid(column=1, row=0) label3 = ttk.Label(win, text="*************************************") label3.grid(column=1, row=1) # Button Click Event Function # Kopierstring für das Irectory-Eingabefeld: "D:\4All\Roulette\Edgar\Wien_F1_1992" def read_Directory(path): txtfiles = [] # leere Liste der Dateinamen, wird nur lokal erzeugt! try: for filename in os.listdir(path): txtfiles.append(filename) print(filename) except: print('Not found: Dir=' + path) txtfiles = fehler01 return txtfiles # Dateiliste zurückgeben (ist leer für ungültige und leere Pfade). def click_FillCombo(entry): fileliste = read_Directory(dirtext.get()) #ruft Dateiliste für aktuellen dirtext ab combo_1['values'] = fileliste # Die Combobox befüllen combo_1.current(0) def print_filename(): fn = "Folgende Datei wurde ausgesucht: \"" fn += dirtext.get() fn += combo_1.get() fn += "\"" print(fn) def callback(entry): # universelle Ausgabe, als temporäre Debugfunktion print(entry) # kann man überall einsetzen, wo Baustelle ist. # Einen Button hinzufügen, neue Funktion, wählt den eingestellten Pfad aus dirtext und combo_1 aus action1 = ttk.Button(win, text="Ok!", command=print_filename) action1.grid(column=2, row=2) # Label hinzufügen label5 = ttk.Label(win, text="Permpool-Pfad:") label5.grid(column=1, row=3) # Eingabefeld für dirname dirtext = ttk.Entry(win, width=40) dirtext.grid(column=2, row=3) dirtext.bind("<Return>", click_FillCombo) # optional die Pfadeingabe schon während der laufenden Eingabe prüfen: dirtext.bind("<Key>", click_FillCombo) # gibt eine Menge Müll auf der Console # Label hinzufügen label4 = ttk.Label(win, text="Click on an entry:") label4.grid(column=1, row=4) # Eine ComboBox hinzufügen combo_1 = ttk.Combobox(win, width=38, values=hinweis01) combo_1.grid(column=2, row=4) combo_1.current(0) combo_1.bind("<<ComboboxSelected>>", callback) # callback als Baustellenschild :) # ================== # GUI-Start # ================== win.mainloop() Viel Spass mit Python, wünscht Ego
  9. Ich finde das sehr unschön, denn txtfiles[] wird ja sonst gar nicht gebraucht. Wenn Du daraus eine globale Variable machst und uU auch noch tausende Namen speicherst, obwohl sie schon in Deiner ComboBox stehen, ist das Platzverschwendung. Ausserdem sind globale Variable GIFT, die in komplexen Programmen später Probleme machen können. Du hast bisher ein Entryfeld in dem Dein Pfad eingegeben wurde. Sofort wenn Du dort RETURN drückst, sollte der Eintrag auf Gültigkeit geprüft werden. Ist er gültig, kann sofort mit der Konstruktion der Combobox begonnen werden. Das ist ein Abwasch, also nur eine Funktion. Das glaube ich nicht. Es wird Dir in ein paar Tagen alles sehr viel leichter fallen. Fortsetzung folgt...
  10. Hallo Albert, ich vermute es nur, weil ich nicht an Deinem Rechner sitze und hatte die Erklärung gestern schon geschrieben: "Nunja, scheinbar hattest Du Dir noch einen ungültigen, nicht druckbaren Charakter eingefangen. Solche Fehler kann das menschliche Auge einfach nicht finden, da muss dann der Verstand ran." Wenn dem so ist, löschst Du einfach die kaputte Zeile komplett und schreibst sie neu hin. Um das genauer zu untersuchen kannst Du auch die Zeile mit Copy auslesen und in einen HEX-Editor einfügen. Ich fasse mich lieber kurz, wegen der "forbidden" Meldung... Ff
  11. Nunja, scheinbar hattest Du Dir noch einen ungültigen, nicht druckbaren Charakter eingefangen. Solche Fehler kann das menschliche Auge einfach nicht finden, da muss dann der Verstand ran. Natürlich lande ich hier auch auf dem Bauch, weil es Probleme in der Logik gibt. Ich habe Dir mal den Code entwanzt, nun sollte es arbeiten, wie gewünscht. Return gibt den eingegebenen String aus, jeder neue Buchstabe wird angehängt und auch ausgegeben. Allerdings laggt hier mein Terminal, die Ausgaben werden zwischengepuffert und verspätet ausgegeben. Zum Löschen des Eingabefeldes drücke ESC, Dann sollte alles hinhauen, wie gewünscht. import tkinter as tk root = tk.Tk() def on_change(event): # Wichtig, alle Definitionen oben schreiben inp = entry.get() print (inp) def entry_del(event): # entry_delete fand ich, lag zu nah an entry.delete, umbenannt entry.delete(0, 'end') entry = tk.Entry(root) entry.pack(side='left') entry.bind("<Key>", on_change) # Sonst knallt es, wenn man sie später benutzen will. entry.bind("<Escape>", entry_del) # Man kann durchaus für alle Tasten individuelle Funktionen anbinden, toll... entry.grid(row=2, column=2) entry.focus() root.mainloop()
  12. Noch ein Happen: Praktischerweise erweitern sich die Eigenschaften einer Permanenz später jedes Mal, wenn sie jemand auswertet. Dazu bräuchte es eine Liste, die in der Perm geführt wird, in die alles hineinkommt, was man später noch abrufen möchte. zB Gespielt nach SystemX ergab sich am Freitag folgender Kapitalverlauf, Einzelheiten: a, b, c als Unterliste oder der längste Ausbleiber war 23 und so weiter... ---------------------- Standardauswertungen wie Trefferzahlen je Einzelplein, Treffer auf Rot oder Schwarz, was Euch einfällt. Etwas ausgefallenere Standardauswertungen wie Anzahl 1er 2er... Xer Serien/Ausbleiber auf Rot, D3, TVS3, Cheval 1-2 ... Indikatorverläufe wie Favorator und was es noch alles geben wird... Das ist schon eine Menge Holz, aber man sollte im Hinterkopf behalten, es ist erst der Anfang einer Überlegung. Prinzipiell gibt es Python her, dass man einer vordefinierten Permanenz-Klasse zur Laufzeit beliebige Elemente hinzufügt, die dann nur in der einzelnen Permanenz gespeichert werden. Da dürfte dann aber das Wegschreiben auf Massenspeicher und das Zurückladen richtig lustig werden. Erstmal, Spass mit Python, Gruss vom Ego
  13. Hier wieder ein Fitzel meiner vorherigen Überlegungen. Die Forensoftware nervt wie Sau! Optional könnten beliebig viele weitere Eigenschaften der Permanenz festgehalten werden, wie Art der Kugel Kessel Marke, Typ, Baujahr, Seriennummer usw. Wartungszustand Wetterverhältnisse Drehgeschwindigkeiten Info ob Rechts- Linkslauf erfasst wurde Fehlermeldungen bisher unzuordenbare Informationen, wie Getränkepreise und/oder Scherze des Personals
  14. Ich lese solche Bücher nicht, weiss aber, dass sie ganz hervorragende Nachschlagewerke sein können. Es ist schon mindestens seit meinem letzten Staatsexamen (ewig her) so, dass man nicht alles wissen muss. Man muss nur wissen, wo man es möglichst schnell nachschlagen kann. Damals gab es noch kein Internet, wohl aber sehr gute Nachschlagewerke... Nicht selten sind wir das Problem und nicht der Computer. Erst mit der Erfahrung (was nun mal dauert) kehrt sich dann das Verhältnis langsam um. Wenn wir sagen können, das Problem ist der Computer, sind wir schon fast Experten. Ich kann Dein Leiden sehr gut nachvollziehen, das kenne ich zur Genüge aus eigener Erfahrung. Vielleicht ist es bei Dir noch schmerzhafter, weil Du sehr viel länger ohne Objekte gearbeitet hast. Ich gestehe das Brimborium um Klassen selbst erst jetzt langsam zu begreifen, weil ich Python anwede. Früher habe ich in C (ohne ++) meinen Strukturen Pointer auf Funktionen verpasst, damit ich sowas wie OOP hinkriegte. Programmiererhölle... Dagegen ist Python ein Zäpfchen Gruss vom Ego
  15. Aus Deiner Beschreibung werde ich auf die Schnelle nicht schlau, lösche bitte alles aus Deinem Code, was überflüssig ist und poste dann alles. Ich wette "Das Schwein werden wir schon schlachten, wenn ihm auch quiekt."
  16. Hallo Albert, wenn Du entry_delete aufrufst, dann löscht Du doch alles, sobald RETURN gedrückt wird... Man muss nicht emotional werden, wenn man eine neue Sprache lernt, sonst hat man bald gar kein Haar mehr auf dem Kopf. Aber 4 Augen sehen bekanntlich immer mehr als 2... Mich nervt mal wieder die Forensoft wie Hulle, denn mein Artikel ging nicht durch, das wichtigste fehlt noch... Gruss vom Ego
  17. Ich sehe mich gezwungen meinen langen Beitrag zu zerstückeln, um das "forbidden..." zu umgehen: Ich war heute zum Beispiel faul und habe nichts neues geschafft, weil ich am Strand war. Vielleicht kann ich das noch etwas ausbügeln. Wir brauchen immer wieder Permanenzen, seien sie nun schon bekannt, oder lägen sie noch in der Zukunft, egal. Alle sollten bestimmte Eigenschaften haben, die für eine spätere Verwendung (Suche, Auswertung, Gruppierung etc) wichtig sein könnten. Eine essentielle und immer bekannte Eigenschaft ist der Ort der Entstehung. Wobei der Ort nicht immer eine feste Stelle im Universum sein muss (RNG, Laptop von Hein-Blöd im Zug von Hamburg nach Hannover).
  18. Nicht doch Wiener, die paar Fragen stören doch (zumindest mich) nicht wirklich. Was ich mir aber mehr wünschen würde, wären Rückmeldungen, an welchen Stellen bei Euch Schwierigkeiten auftreten. Dann könnten die anderen evtl weiterhelfen. Noch schöner wären natürlich Eure Erfolgsmeldungen über bisher geschaffte Testprogrämmchen. ------------------------------X8----------------- wegen Postingverbot.....
  19. Hallo Hans, das darfst Du mir gern mal vorrechnen. Danke für die Mühe, Ego
  20. 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
  21. 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 ...
  22. 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
  23. 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)
  24. 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
  25. 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
×
×
  • Neu erstellen...