
Dr. Manque
Mitglieder-
Gesamte Inhalte
387 -
Benutzer seit
-
Letzter Besuch
Inhaltstyp
Profile
Forum
Kalender
Articles
Alle erstellten Inhalte von Dr. Manque
-
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Ego, nicht resignieren bei diesem Thema! Für mich hatte sich die "Urlauberei" etwas verlängert. Seit 2 Tagen mühe ich mich wieder stundenweise mit Python ab. Ein gutes E-Book habe ich mir gekauft: "Time Series Forecasting with Python". (Dauer des Kaufvorgangs - Bestellen, Bezahlen, Download - ca. 5 Minuten!). Es gibt noch eine Menge anderer Lernmethoden für Vorhersagen als Neuronale Netze. Wenn Du schon mit Keras experimentierst, dann gehst Du ja gleich hoch ran! Wir sollten noch darüber diskutieren, mit welchen Chancenarten wir welche Lernmethode(n) probieren. Die verschiedenen Lernverfahren werden auch im scikit-Tutorial beschrieben. Im genannten Buch gibt es ein Kapitel und Beispielcode für den "Random Walk" (Zufalsszahlenfolgen). Die ersten 3 Schritte des Code-Beispiels: 1. Start with a random number of either -1 or 1. 2. Randomly select a -1 or 1 and add it to the observation from the previous time step. 3. Repeat step 2 for as long as you like. Ich dachte, hey, da kann man ja gleich eine EC-Perm einsetzen, denn auch der line plot des Codebeispiels sieht genau so aus wie Novice's Grafiken. Dann wendet der Autor des Buches statistische Tests an und zeigt damit, dass Random Walks "non-stationary" sind und kommt zu folgender Aussage: A random walk is unpredictable; it cannot reasonably be predicted. Given the way that the random walk is constructed, we can expect that the best prediction we could make would be to use the observation at the previous time step as what will happen in the next time step. Simply because we know that the next time step will be a function of the prior time step. This is often called the naive forecast, or a persistence model (covered in Chapter 18). Diese Aussage bezieht sich auf die gesamte Stichprobe von 1000 Zufallszahlen. Man sieht aber am Plot, dass es "stationäre" Teilstrecken gibt, zu erkennen an "consistent mean and/or variance over time.". Diese sollten "predictable" sein. Das ist ja auch die Hoffnung von Novice. Demnächst werde ich da herum etwas probieren. Die Bereitstellung der EC-Random Walks funktionierte ja schon vor der Urlaubspause. Bis bald! Albert -
Positive Wurfweitenanalyse und Ergebnis auf Huxley
topic antwortete auf Dr. Manque's physik_18 in: Physikalische Lösungsansätze
Hallo physik_18, so ergeht es jedem in diesem Forum, der hier Messungen zeigt, oder neue Ideen vorstellt. Die Dogmatiker und fundamentalistischen Roulette-Theoretiker, die das Forum dominieren, interessieren sich gar nicht für technische Details. Da müssten sie sich nämlich reindenken. Das ist zu mühsam! Mehr Freude bringt ihnen das einfache, grobkörnige Miesmachen. Es gibt halt Typen, die ein Posting nur mit dem einzigen Satz füllen: "Du bist doof!". Daraus schöpft so ein Minderbemittelter eine mentale Befriedigung. Dafür muss man Verständnis haben! Sein Horizont reicht nicht weiter. Meine Empfehlung und Bitte: 1. Lass' Deinen Thread von Paroli so einstellen, dass da nur ausgewählte User oder gar keine User (Dich ausgenommen) Schreibrechte haben. 2. Wiederhole bitte Deine Messungen mit einer neuen, etwa gleich großen Stichprobe. 3. Wiederhole bitte Deine Messungen mit einer Zusammenfassung beider Stichproben. Der Grund meiner Bitte: Vor einiger Zeit habe ich WW-Auswertungen für Dublinbet programmiert (Bevor Dublinbet nach Malta umgezogen ist.). Ich könnte Dein Partner werden. Gruß! Albert -
kombinierte Verlust- und Gewinnprogressionen
topic antwortete auf Dr. Manque's Ropro in: Roulette-Systeme
Es passt zu dieser Diskussion, dass Dolomon auf meine Lernprogramme hinweist: https://www.roulette-forum.de/topic/18361-lernfähige-roulettesysteme-ecs-figuren-learn-feldzug/?page=2 Nehmen wir z.B. das Ergebnis des letzten Feldzugs von gestern: Man kann es leicht anhand der Trefferverläufe nachzählen: Es wurden in 10 Partien 174 Coups gespielt, davon 100 gewonnen, also 74 verloren. Das ergibt einen Gleichsatz-Überschuss von 26 Stck. Lernverfahren sind ein neues und noch völlig offenes Feld in der Rouletteforschung. Ich sage schon seit Jahren: Der Marsch ist das A und das O! Meine Lernprogramme bestätigen das. Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Ego, ich konnte das vorige Posting nicht zu Ende bringen. Es kam immer eine Meldung "Access Forbidden". Mal sehen, ob diese Ergänzung durchgeht. Auch lange Perms sind unterhalb 1 sec. durchgelaufen. Dieses GIF-Bild, zeigt eine Endabrechnung: Die Testprint-Zeilen in der Console bestätigen, dass die coupliste richtig gefüllt wird - auch mit >1000 Coup-Objekten. Die print-Zeilen zeigen die Plein-Nrn., ihre Dtz und TVS. Die coupliste kann nun mit cp = coupliste[index] rauf und runter iteriert und so für irgendein Simulationsverfahren ausgewertet werden. Für den Test gespeicherter Perms ist der Testrahmen fertig, wenn auch in der GUI noch Felder für Parameter, Satzanzeigen und Abrechnungen einzurichten sind. Zuerst möchte ich das novice-Verfahren damit ausprobieren. Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Ego Das Prinzip habe ich übernommen: mit objekt as class zuerst ein Objekt anlegen und damit weiterarbeiten. Ein paar Namensunterschiede stören die Zusammenarbeit nicht. Abstimmen werden wir die Algorithmen. Wenn dabei einige Umbenennungen nötig sind, dann steigert das die Aufmerksamkeit und verbessert die Kontrolle - nehme ich an. Ich bin auch ab morgen bis zum 15. Aug. ausgeknockt. Wir fahren mit 2 Enkeln nach Dierhagen an die Ostsee. Ich hatte eben ein langes Posting fertiggemacht. Beim Abschicken wurde "FORBIDDEN" angezeigt. Den 2. Teil konnte ich über Word retten. Mal schauen, ob er sich separat posten lässt. Bis gleich! Albert Vor der Reise wollte ich noch eine Miniform der Klasse 'Coup' ausprobieren. Hier ist sie: class Coup: counter = 0 def __init__(self): type(self).counter += 1 pl_nr = 0 ec_SR = 0 ec_GU = 0 ec_MP = 0 dc_KO = 0 dc_DU = 0 c6_TVS = 0 c12_TVP = 0 @classmethod def AnzahlCoups(): return Coup.counter pass Die Initialisierung der Daten-Attribute ist wahrscheinlich gar nicht notwendig? Bei der Instanziierung der Coup-Objekte wiederholt sich das jedesmal. Nach dem bisherigen Stand wird mit der Liste Perm schon ein Vektor, eine eindimensionale Tabelle der gefallenen Zahlen erzeugt. Das geschieht in der Methode "print_filename", die per callback() angesprochen wird, wenn man auf ein Combobox-Entry klickt. Parallel dazu lasse ich nun mit 'couplist' eine Liste von Coup-Objekten erzeugen. Jedes Coup-Objekt enthält noch einmal die Plein-Nr. und die Attribute, die zusätzlich für verschiedene Roulette-Simulationen gebraucht werden. Bei der Benennung der Attribute möchte ich bei dem bleiben, woran ich gewöhnt bin, also RS, GU, MP, KO, DU. Hier ist der erweiterte Code der Methode "print_filename": def print_filename(): fn = dirtext.get() fn += "\\" fn += combo_1.get() print(fn) file = open(fn) lines = file.readlines() print(str(len(lines)) + " Permlines gefunden.") file.close() x = 0 tx = 0 perm = [] couplist = [] for each in lines: ti = lines[x].rstrip() # Escapes und Blanks herausnehmen try: i = int(ti) # print(i) perm.append(i) cp = roul.Coup() # eine neue Coup-Instanz # die Attribute aktualisieren cp.pl_nr = i cp.ec_SR = ChArten.ec_RS[i] cp.ec_GU = ChArten.ec_UG[i] cp.ec_MP = ChArten.ec_TH[i] cp.dc_KO = ChArten.dc_col[i] cp.dc_DU = ChArten.dc_duz[i] cp.c6_TVS = ChArten.c6_tvs[i] cp.c12_TVP = ChArten.c12_tvp[i] # ein paar Testausgaben print(str(cp.pl_nr) + " " + str(cp.dc_DU) + " " + str(cp.c6_TVS)) couplist.append(cp) except: tx += 1 # print("Textzeile:" + ti) x += 1 sizePerm = len(perm) # Anzahl der Permzahlen # Anzeige der Textzeilen und Permzahlen in label6 label6.configure(text=(str(tx) + " Textzeilen, " + str(sizePerm) + " Permzahlen")) def callback(entry): # universelle Ausgabe, als temporäre Debugfunktion print_filename() lastcoup = roul.Coup.counter print(str(lastcoup) + " Coup-Objekte angelegt") -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Ego, danke für den Link, kann folgen, aber das Problem hat sich inzwischen erledigt. Habe erst jetzt gesehen, dass ein eigenes Verzeichnis in sys.path registriert ist. Das ist wohl bei der Anaconda-Installation da hinein gekommen. Ich musste also nur meine *.py-Moduln dahin kopieren und jetzt geht's. x = 0 tx = 0 perm = [] for each in lines: ti = lines[x].rstrip() # Escapes und Blanks herausnehmen try: i = int(ti) print(i) perm.append(i) print(roullib00.ChancenArten.c12_tvp[i]) print(roullib00.ChancenArten.ec_RS[i]) except: tx += 1 # print("Textzeile:" + ti) x += 1 Die Klasse "Roulette_franz" in roullib00 habe ich in "ChancenArten" umbenannt. Die beiden prints hinter try: haben mir gezeigt, dass der Zugriff auf die von Dir definierten Listen hinhaut. Nun kann die Klasse 'Coup' kommen. Gruß! Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Ja, es ist im gleichen Verzeichnis gespeichert, aber der Fehler kommt trotzdem. Ob der Name des py-files 1 oder 2 oder 7 l hat, das ist völlig egal, denn es ist ja alles auf meiner Kiste. Ich habe schon reichlich Dr. Google befragt. a) Das eigene Verzeichnis muss in die PYTHONPATH-Variable mit hinein. Aber wie??? b) Temporär kann man ganz oben im Testmodul schreiben: import sys sys.path.append("D:\Python"), wenn D:\Python das eigene Verzeichnis ist. Geholfen hat es nicht (bisher)! Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Nimm "Ärger" nicht wörtlich. Python wirkt halt hinterfotzig, weil so vieles implizit angelegt ist. Wie hier die Klassen, Methoden, Attribute lokal/global zusammenspielen, das habe ich überhaupt noch nicht geschnallt. Mir erklärt sich da noch nüscht, wird hoffentlich noch kommen. Ich bleib' ja dran, schon deinetwegen. Endlich ein Partner für's Rouletteprogrammieren! Nur noch lernende Programme will ich machen. Die beiden VBA-Programme "ECS-Learn" und "TVS-Learn", die mit einfachen skalierbaren Lerntabellen arbeiten, sind ermutigend. Es ist spannend, ob es mit Neuronalen Netzen noch besser geht. Das ist doch unser gemeinsames Ziel!!!? Unter VBA verwende ich pro Coup eine Struktur, in der die Chancenarten registriert sind, die zu der Coup-Plein gehören, also R oder S, 1. oder 2. Dtz, xte TVS u.s.w. Das war immer nützlich, obwohl ein paar simple Zuordnungen zu viel laufen. So könnte man eine Coup-Klasse verwenden, um dort die Chancenarten-Attribute unterzubringen. Die Methoden pro Coup wären dann die Satzanalysen für den nächsten Coup und die Abrechnung der gefallenen Zahl. Unter VBA habe ich das immer in einer Subroutine "CoupMain" zusammengefasst. Doch, wir machen eine Coup-Klasse! Man könnte auch dynamisch einfach auf die Listen in Deiner Klasse "Roulette-franz." zugreifen. (- müsste noch umbenannt werden -). class Roulette_franz(): pl_kessel = [0, 32, 15, 19, 4, 21, 2, 25, 17, 34, 6, 27, 13, 36, 11, 30, 8, 23, 10, 5, 24, 16, 33, 1, 20, 14, 31, 9, 22, 18, 29, 7, 28, 12, 35, 3, 26] pl_fach = [0, 23, 6, 35, 4, 19, 10, 31, 16, 27, 18, 14, 33, 12, 25, 2, 21, 8, 29, 3, 24, 5, 28, 17, 20, 7, 36, 11, 32, 30, 15, 26, 1, 22, 9, 34, 13] ec_RS = [0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, 1] ec_TH = [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1] ec_UG = [0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1] dc_col = [0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3] dc_duz = [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] c6_tvs = [0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6] c12_tvp = [0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12] c9_car = [(0, 1, 2, 3), (1, 2, 4, 5), (2, 3, 5, 6), (4, 5, 7, 8), (5, 6, 8, 9), (7, 8, 10, 11), (8, 9, 11, 12), (10, 11, 13, 14), (11, 12, 14, 15), (13, 14, 16, 17), (14, 15, 17, 18), (16, 17, 19, 20), (17, 18, 20, 21), (19, 20, 22, 23), (20, 21, 23, 24), (22, 23, 25, 26), (23, 24, 26, 27), (25, 26, 28, 29), (26, 27, 29, 30), (28, 29, 31, 32), (29, 30, 32, 33), (31, 32, 34, 35), (32, 33, 35, 36)] c18_che = [(0, 1), (0, 2), (0, 3), (1, 2), (1, 4), (2, 3), (2, 5), (3, 6), (4, 5), (4, 7), (5, 6), (5, 8), (6, 9), (7, 8), (7, 10), (8, 9), (8, 11), (9, 12), (10, 11), (10, 13), (11, 12), (11, 14), (12, 15), (13, 14), (13, 16), (14, 15), (14, 17), (15, 18), (16, 17), (16, 19), (17, 18), (17, 20), (18, 21), (19, 20), (19, 22), (20, 21), (20, 23), (21, 24), (22, 23), (22, 25), (23, 24), (23, 26), (24, 27), (25, 26), (25, 28), (26, 27), (26, 29), (27, 30), (28, 29), (28, 31), (29, 30), (29, 32), (30, 33), (31, 32), (31, 34), (32, 33), (32, 35), (33, 36)] format_Farbe = ['\x1b[1;42;30m 0 \x1b[0m', '\x1b[1;41;37m 1 \x1b[0m', '\x1b[1;40;37m 2 \x1b[0m', '\x1b[1;41;37m 3 \x1b[0m', '\x1b[1;40;37m 4 \x1b[0m', '\x1b[1;41;37m 5 \x1b[0m', '\x1b[1;40;37m 6 \x1b[0m', '\x1b[1;41;37m 7 \x1b[0m', '\x1b[1;40;37m 8 \x1b[0m', '\x1b[1;41;37m 9 \x1b[0m', '\x1b[1;40;37m 10 \x1b[0m', '\x1b[1;40;37m 11 \x1b[0m', '\x1b[1;41;37m 12 \x1b[0m', '\x1b[1;40;37m 13 \x1b[0m', '\x1b[1;41;37m 14 \x1b[0m', '\x1b[1;40;37m 15 \x1b[0m', '\x1b[1;41;37m 16 \x1b[0m', '\x1b[1;40;37m 17 \x1b[0m', '\x1b[1;41;37m 18 \x1b[0m', '\x1b[1;41;37m 19 \x1b[0m', '\x1b[1;40;37m 20 \x1b[0m', '\x1b[1;41;37m 21 \x1b[0m', '\x1b[1;40;37m 22 \x1b[0m', '\x1b[1;41;37m 23 \x1b[0m', '\x1b[1;40;37m 24 \x1b[0m', '\x1b[1;41;37m 25 \x1b[0m', '\x1b[1;40;37m 26 \x1b[0m', '\x1b[1;41;37m 27 \x1b[0m', '\x1b[1;40;37m 28 \x1b[0m', '\x1b[1;40;37m 29 \x1b[0m', '\x1b[1;41;37m 30 \x1b[0m', '\x1b[1;40;37m 31 \x1b[0m', '\x1b[1;41;37m 32 \x1b[0m', '\x1b[1;40;37m 33 \x1b[0m', '\x1b[1;41;37m 34 \x1b[0m', '\x1b[1;40;37m 35 \x1b[0m', '\x1b[1;41;37m 36 \x1b[0m'] Ich habe dieses Teil als 'roullib00.py' gespeichert, aber der import-Befehl im Testmodul sieht es nicht: Da muss irgendwo eine Systemvariable gestellt werden. Weißt Du, wo und welche? "Selbst bei der Klasse Perm bin ich mir nun nicht mehr sicher.." Man hat ja immer nur eine Perm am Wickel. Ein Perm-Klasse hätte die Liste der Coup-Instanzen als Attribut. Als Methoden kämen Perm speichern, Perm laden, Perm löschen, Permtest und Pooltest in Frage. Wenn die Coup-Klasse geklärt ist, kann ich mit der Codierung des ersten Systems anfangen. Egon, Du bist doch sicherlich in Deiner PyCharm-Umgebung auch so weit? Schade, dass Du nicht Anaconda/Spyder benutzt. Der Spyder-Editor ist wirklich gut. Python macht Arbeit! Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Ego, Durch 'Enkel-Betreuung' war ich 2 Tage außer Gefecht gesetzt. Heute habe ich mich stundenlang mit .isdigit(), .lstrip() und .isalnum() herumgeärgert. Ich wollte beim Thema "Permanenz extrahieren" ohne 'if re.match(parsePermFile[status],lines[x]):' auskommen (verzeih mir!). Am Schluss hat es geklappt. (Und es war im Grunde auch wieder ganz einfach.) def print_filename(): fn = dirtext.get() fn += "\\" fn += combo_1.get() print(fn) file = open(fn) lines = file.readlines() print(str(len(lines)) + " Permlines gefunden.") file.close() x = 0 tx = 0 perm = [] for each in lines: ti = lines[x].rstrip() # Escapes und Blanks herausnehmen try: i = int(ti) # print(i) perm.append(i) except: tx += 1 # print("Textzeile:" + ti) x += 1 print(str(tx) + " Textzeilen") sizePerm = len(perm) print(str(sizePerm) + " Permzahlen") def callback(entry): # universelle Ausgabe, als temporäre Debugfunktion print_filename() Beim Klick auf ein Entry der Combobox wird 'print_filename' gerufen. Wenn man die beiden einkommentierten print's entkommentiert, sieht man genau, was abläuft. Ansonsten erscheinen nur 4 Meldungen in der Console: - Dateiname - x Permlines gefunden - y Textzeilen - x-y Permzahlen Das Verfahren klappt auch für Wiesbaden-Perms. Ich habe 389 Wiebaden-Perms von 2017. Da sehen die Kopfzeilen so aus (Beispiel): TB1R-2017-01-04 N Z R 2 7 0 22 1 24 30 ... ... Die Combobox zeigt die Dateinamen an und jeder Klick auf ein Entry füllt die int-Liste Perm[]. Jetzt brauchen wir die Klassen COUP und PERM. Die kann man einfach im try-Block bedienen. Da habe ich erstmal eine Menge zu 'studieren'. Viel Mühe mit Python! Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Ego, Dein Code-Snippet für's Permeinlesen funktionierte auf Anhieb. Es geschieht das callback-Wunder Nr. 2: Klickt man auf ein Combobox-Entry, dann wird "callback(entry)' angesprochen. Dort lasse ich die von Dir codierte Funktion 'print_filename()' rufen (s. Code-Snippet ganz unten). In 'print_filename' habe ich Deine 4 Zeilen file = open(fn) ... file.close() reingesetzt. Es funktioniert! Die mit 'print(len(lines))' angezeigte Zahl der lines-Elemente stimmt. Ich kann das ganz schnell mit einem meiner Excel-Programme kontrollieren. Und das Permlesen geht sehr sehr schnell! def print_filename(): fn = dirtext.get() fn += "\\" fn += combo_1.get() print(fn) parsePermFile = ["CC-Permanenz", "gespeichert", "um", "Gewinnzahlen"] sizePF = len(parsePermFile) print(sizePF) file = open(fn) lines = file.readlines() print(len(lines)) file.close() # status = 0 # x = 0 # perm = [] # for each in lines: # if re.match(parsePermFile[status],lines[x]): # temp = lines[x].split(" ") # print(x, temp) # perm.append(x) # x += 1 # sizePerm = len(perm) # print("Gefunden",sizePerm,"\n",perm) def callback(entry): # universelle Ausgabe, als temporäre Debugfunktion print_filename() Die Schlüsselworte für's Parsen habe ich auf meine Kopfzeilen eingestellt, aber es hat nicht geklappt. Dieses Einlesen auf Hauruck mit readlines möchte ich umstellen auf readline in einer Schleife, so dass man auf jede einzelne Zahl Zugriff hat. Dann kann man die Instanzen der Klasse 'COUP' bilden und Textzeilen (is not numeric(...)) einfach übergehen. Man ist nicht an feste Parser-Keys gebunden. Das callback-Wunder Nr. 1 - man wechselt das Poolverzeichnis, drückt Enter und die Combobox wird korrekt neu gefüllt - wird durch 'print_filename' nicht gestört. (Definition: Ein Pool ist ein Verzeichnis mit mehreren Permdateien.) Wir sind wieder einen kleinen Schritt weiter - dank Deiner Vertrautheit mit Python. Python ist halt eine Wundertüte! Morgen noch 40 m Hecke. Gute Nacht! Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Ego, mit dem letzten Satz zeigst Du, dass Du das Konzept verstanden hast. Ich hab's seit 12 Jahren in jedem Rouletteprogramm drin und nie einen Anlass gesehen, es durch ein Menü zu ersetzen. Also der Klick auf ein Combobox-Entry bewirkt "Lade diese Permanenz". Die Zahlen sollen in eine integer-Liste und gleichzeitig in eine Liste von Instanzen der Klasse 'COUP' gehen. Letztere Liste wäre dann eine Instanz der Klasse 'PERM'. Das ist jetzt die nächste Aktion, die codiert werden muss. Das Laden einer Perm (- wenn CC-Perm, dann bis zu 2.880 Coups -) dauert sicherlich nur Millisekunden. Wenn eine Perm geladen ist, kann sie mit 1000 verschiedenen Verfahren verarbeitet werden. Das ist der "Permtest" Die Combobox hat den Vorteil, dass man in einer Schleife über die Combobox-Entries "Pooltests" fahren kann. Zum Simulationsgerüst gehört noch die Anzeige der Satzanweisungen, die von den verschiedenen Verfahren erzeugt werden und deren Abrechnung - pro Perm und pro Pool. Und die Eingabe einer Zahl zur Erweiterung oder zum Aufbau einer Perm gehört auch noch zum Gerüst. 60 m Heckenschnitt habe ich heute geschafft. Morgen sind noch ca. 90 m zu machen. Gute Nacht! Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Ego, Also es funktioniert perfekt! Wenn man den PermPool-Pfad in das Entry-Feld einkopiert hat und man drückt die Taste 'Enter', dann zack im Bruchteil einer Sek. ist alles fertig. Die Combobox ist mit 348 Filenamen gefüllt. Das Tolle ist, wenn man im Pfadnamen nur 1 Zeichen austauscht und der neue Pfadname ist gültig und man drückt 'Enter', zack, sind die neuen Filenamen in der Combobox. Ohne dass man es codieren musste, wurde die Combobox vor der Neubeladung 'gecleared'. Dann habe ich den Pfadnamen meines 3000er Pools eingegeben und nach 'Enter' zack, waren 3035 Filenamen in der Combobox - auch im Bruchteil einer Sekunde, Wahnsinn!!! By the way: in "read_Directory (path)" habe ich "print(filename)' durch einen Zähler zz = zz + 1 ersetzt und den vor dem 'Return' geprinted - klappt! Es ist schon ein komischer Mechanismus: Die Enter-Taste löst über "dirtext.bind("<Return>", click_FillCombo)" den Aufruf von 'click_FillCombo(entry) mit 'entry' als Argument aus. 'click_fillCombo' ermittelt mit 'fileliste = read_Directory(dirtext.get())' die Liste 'txtfiles' und kopiert sie zur Liste 'fileliste'. Mit 'combo_1['values'] = fileliste' wird dann die Combobox befüllt. 'callback' mit dem Parameter 'entry' bewirkt also, dass die Funktion mit dem Argument 'entry' wiederholt wird? Kann man mehrere callback's mit verschiedenen 'entry'-Parametern anlegen? Mannomann, ist Python geheimnisvoll und verzwickt! Also vielen Dank, dass Du das Combobox-Problem gelöst hast! Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Ego, ja, es läuft - wenn auch anders als erwartet und für meinen Kenntnisstand überraschend. Ich muss mir den Code genauer anschauen. Leider kann ich erst heute am Abend weitermachen, muss 150 m Hecken schneiden. Gruß! Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Ego, ich wusste gar nicht, dass man mehrere Entry.bind-Funktionen definieren und auf einzelne Tasten legen kann. Die Escape-Funktion ist sehr nützlich. Für die Pleinzahlen-Eingabe ist entry.bind("<Return>", on_change) geeigneter. Das funktioniert auch im obigen Kontext. In meinem Testprogramm erzeugt entry.bind("<Return>", on_change) einen SyntaxError: invalid character in identifier. Der Editor schreibt schon vor dem "Run" einen roten Marker an die Zeile: Gott sei Dank kann ich aber die Permzahl in der Callback-Funktion "click_Ok" mit ...get() abfangen: Plötzlich funktioniert das Befüllen der Combobox! Hier die ganz einfache Definition der Combobox: Und hier die ebenfalls ganz einfache Callback-Funktion: Genau entsprechend Deinem Vorschlag!!! Die Liste "txtfiles" muss vorher gefüllt werden. Das geschieht mit diesem Callback: "click_PermFilesLesen" funktioniert auch, wenn man "txtfiles = [] in die Funktion hineinnimmt. Aber dann erkennt "click_FillCombo" die Liste "txtfiles" nicht mehr. Wenn man aber "zz = 0" aus "click_PermFilesLesen" herausnimmt und sozusagen global macht, dann gibt es einen Syntaxfehler. Es wird noch lange brauchen, bevor ich Python verstehe. Als Nächstes liegen an: 1. Die Callback-Funktion für die Klicks in die Combobox. 2. Die Klassen "Coup" und "Perm". Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Ego, dieses Beispiel aus dem Internet macht genau dasselbe wie Du: import tkinter as tk #import os root = tk.Tk() def on_change(entry): inp = entry.get() print (inp) entry = tk.Entry(root) entry.pack(side='left') entry.bind("<Return>", on_change) entry.grid(row=2, column=2) entry.focus() def entry_delete(evt): entry.delete(0, 'end') entry.bind("<Return>", entry_delete) root.mainloop() 1. Bei "Run" erscheint auch ein kleines Fenster mit dem Entry-Feld darin. Wenn man dort etwas eingibt und die Enter-Taste drückt, verschwindet die Eingabe, aber es wird nichts geprinted! Die Übergabe an die on_change-Funktion klappt also nicht. Wie schaut's bei Dir aus, wenn Du den obigen Test machst? 2. Wenn ich genau dieselbe Chose in mein Testprogrämmchen übertrage, dann kommt bei entry.pack und entry.bind ein "SyntaxError: invalid character in identifier". Bis zu dem unter 1. beschriebenen Effekt komme ich gar nicht erst, egal, ob die .bind-Funktion vor oder hinter die Entry-Definition gesetzt wird. 3. Dein Vorschlag, mit combo_1['values'] = click_FillPermFiles() in der "Fill Combo"-Callback-Funktion die Combobox zu füllen hat nicht geklappt, aber immerhin wurde die Funktion click_FillPermFiles sauber ausgeführt. In der Combobox ist nichts angekommen, egal, ob sie vorbelegt oder jungfräulich angesprochen wurde. Aber nach einigen Code-Umstellungen ging auch click_FillPermFiles nicht mehr 4. Ich vermute, man muss sich gründlich mit mit den namespaces befassen, dann kommt man vielleicht einigen Fehlern auf die Schliche. Zitat aus meiner Python-Bibel (1540 Seiten): "Python's universal first-class object model and lack of type declarations make for an incredibly flexible programming language." Jawohl, die einfachsten Sachen sind hier incredibly schwierig. Viel Frust mit Python! Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Egon, Du bist wirklich "edel, hilfreich und gut"! Ich habe Deinen Quelltext kopiert und unter Spyder getestet. Er hat sofort funktioniert: Dann habe ich das von Dir angewendete Verfahren zum Auffüllen der Combobox auf mein Progrämmchen übertragen. Hier ist der Code: #======================== # imports #======================== import tkinter as tk from tkinter import ttk import glob import os # Erzeuge eine Instanz win = tk.Tk() # Füge einen Titel hinzu win.title("Meine erste GUI") # Enable resizing x-dimension, disable y-dimension win.resizable(True, True) win.geometry('800x300') # Die Liste [txtfiles] initialisieren txtfiles = [] txtfiles.append('file 1') txtfiles.append('file 2') # 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) # D:\4All\Roulette\Edgar\Wien_F1_1992 # 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 # Button Click Event Function # Kopierstring für das Irectory-Eingabefeld: "D:\4All\Roulette\Edgar\Wien_F1_1992" def click_FillPermFiles(): dirname = dirtext.get() print('Dir=' + dirname) # combo_1.clear() # for file1 in glob.glob(name): # txtfiles.append(file1) # print(file1) txtfiles = [] for filename in os.listdir(dirname): txtfiles.append(filename) print(filename) pass def click_FillCombo(): global txtfiles # Das ist nicht sehr sauber, die Liste wird aus dem globalen Kontext abgesaugt. global combo_1 # ebenso die Combobox, das geht sicher alles besser. combo_1['values'] = txtfiles # 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. pass # Label hinzufügen label1 = ttk.Label(win, text="Enter a Plein-Nr.:") label1.grid(column=0, row=2) # Eingabefeld für Permzahlen PZahl = tk.StringVar() ZahlEingabe = ttk.Entry(win, width=4, textvariable=PZahl) ZahlEingabe.grid(column=1, row=2) # Einen Button hinzufügen, def click_me1 noch nicht in Betrieb action1 = ttk.Button(win, text="Ok!", command=click_me1) action1.grid(column=2, row=2) # Label hinzufügen label5 = ttk.Label(win, text="Permpool-Directory:") label5.grid(column=1, row=3) # Eingabefeld für dirname dirtext = ttk.Entry(win, width=40, textvariable=name) dirtext.grid(column=2, row=3) # Label hinzufügen label4 = ttk.Label(win, text="Click on an entry:") label4.grid(column=1, row=4) # Eine ComboBox hinzufügen #number = tk.StringVar() combo_1 = ttk.Combobox(win, width=38, values=txtfiles) combo_1.grid(column=2, row=4) combo_1.current(0) # Button für die Ermittlung der PermFiles action2 = ttk.Button(win, text="Fill PermFiles", command=click_FillPermFiles) action2.grid(column=3, row=4) # Button für die Übertragung der Permfiles in die Combobox action2 = ttk.Button(win, text="Fill Combo", command=click_FillCombo) action2.grid(column=4, row=4) # Einen 3. Button hinzufügen action3 = ttk.Button(win, text="Permtest von oben", command="") action3.grid(column=1, row=5) # Einen 4. Button hinzufügen action4 = ttk.Button(win, text="Pooltest", command="") action4.grid(column=2, row=5) # Setze den Cursor in die Textbox ZahlEingabe.focus() #================== # GUI-Start #================== win.mainloop() Das Startfenster sieht so aus: Du musst jetzt einen Verzeichnisnamen eingeben (full, mit Doppelbackslash wie D:\\4All\\Roulette\\Edgar\\Wien_F1_1992, ohne '...' oder "...". Dann "Fill PermFiles" klicken. Das funktioniert bei mir. Dann "Fill Combo" klicken. Da geht bei mir nichts. Das Feld "Enter a Plein-Nr.: muss auch anfangs leer sein. Wenn man dort eine Zahl eingibt und "Ok" klickt, dann wird was ganz Komisches geprintet. Die Macke kriegst Du sicherlich schnell raus. Sorry, dass ich noch so doof bin! Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Mitstreiter Gestern den halben Tag plus heute den ganzen Tag habe ich darum gekämpft, eine tkinter-Combobox mit Items zu füllen. Es geht, wenn man die Liste beim Anlegen der Combobox unter dem Attribut 'values' mit angibt. Es geht also nur für kurze Listen Ich brauche aber eine Combobox, in die ich bis zu 3000 Filenamen variabel aus verschiedenen Directories reinpacken kann. Die ist ein zentrales Element in allen meinen bisherigen Systemen, um einzelne Perms und/oder ganze Pools für den Test bereitzustellen. Die tkinter-Combobox kennt keine Funktionen wie "additem" (Anfügen eines Items), "additems" (Anfügen einer Liste) oder "append" (Anfügen eines Items). Weder In den Python- und tkinter-Dokus, noch unter Dr. Google war etwas zu holen. Wenigstens ist das Auslesen der Filenamen aus einem Directory möglich, aber das String-Handling danach ist mit solchen Problemen behaftet, dass einem hierbei der Spaß an der Freude vergeht. Ein wichtiger Punkt: Der Testservice von Python ist weit unter dem von Excel-VBA. In Python muss man nach jeder Änderung im Quelltext auf "Run" gehen. In Excel-VBA kann man "on the fly" in vielen Fällen Änderungen und Tests fahren ohne neu zu starten. Sorry, ich muss mich von Python verabschieden. Das Leben ist zu kurz für diese Sch... Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Ego, Deine Klassendefinitionen in roulib00.py finde ich ok und werde sie verwenden. Bewundernswert ist Deine Geduld beim Editieren von "format_Farbe" in der Klasse Roulette_franz(). Kapieren kann ich diese Variable allerdings noch nicht. Du bist doch schon recht weit. Ich quäle mich immer noch durch Tutorials und Bücher. Die Python-Syntax ist verdammt eigenwillig und gewöhnungsbedürftig. Dies ist ein Posting-Test. Bitte nicht darauf reagieren! Albert nach 3mal "Bearbeiten" und "Speichern": Es geht offenbar wieder!!! -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Egoist, ich habe Deinen Quelltext in ein spyder-Project kopiert. Nach "Run" gab es keinen Fehler und in der Console erschienen eine Menge eindimensionaler Tabellen. Mit dem Verständnis dafür hapert es noch. Das liegt nicht an Dir, sondern an mir. Deine Kommentare in den Präsentationen sind vorbildlich. Eine persönliche Bemerkung: VBA, C, C++, Java habe ich mir früher selber beigebracht und damit auch Geld verdient. Meistens genügte 1 Buch, und man hatte die Grundprinzipien drauf. Jetzt für Python blättere ich schon tagelang in 4 Büchern und gucke immer noch wie eine Katze auf den Kalender. In Python passiert so vieles implizit! Das kotzt mich an! Erstmal die GUIs mit tkinter sehen beschissen aus. Wie man da lokale und/oder globale Subroutinen/Funktionen/Klassen einhängen kann, das sind für mich noch "böhmische Dörfer". Bitte antworte nicht auf diese Klage! Es ist vor allem ein Test, ob ich wieder posten kann. Albert Nach "Bearbeiten": Der Test war positiv! -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Genau diese Codierung der EC verwende ich in Excel-VBA und werde auch unter Python dabei bleiben. Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Vielleicht kann jemand diese Fehlermeldung interpretieren?: Danach färbt sich der "Speichern"-Button grau und es passiert nichts mehr. Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Ego, Du machst das hier so gut! Du variierst und experimentierst auch gleich! Man könnte eine Kooperation in Sachen Rouletteprogrammierung aufziehen, wie ich sie mir seit 12 Jahren wünsche und nun das: Gestern habe ich bis nachts halb 2 Uhr erfolglos darum gekämpft, 10 Zeilen Erklärungstext abzuschicken. Auch über PN hat es nicht geklappt. Womit hab' ich das bloß verdient? Mein neuer Versuch heute ging auch wieder schief. Der "Antworten"-Button wird zu "Speichern", färbt sich grau und es geht nicht weiter. Albert Über "Bearbeiten" probiere ich eine Ergänzung: -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Egoist, Ich habe versucht, die Erklärungen zum GUI-Code hier nach dem Zitat unterzubringen. Es ging wieder nicht. Mein Account ist irgendwie im Eimer! Wie komme ich nur an Paroli ran? Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Ego, mein Versuch, die Erklärungen, zum Pythoncode hier nach dem Zitat unterzubringen, hat wieder nicht geklappt. Mein Forumzugang ist irgendwie im Eimer: Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Danke, Ego, probieren wir es mal aus: Spyder Editor This is a temporascry ript file. """ #======================== # imports #======================== import tkinter as tk from tkinter import ttk # Erzeuge eine Instanz win = tk.Tk() # Füge einen Titel hinzu win.title("Meine erste GUI") # Enable resizing x-dimension, disable y-dimension win.resizable(True, True) # Labels hinzufügen label1 = ttk.Label(win, text="Enter a Plein-Nr.:") label1.grid(column=0, row=5) label2 = ttk.Label(win, text="********** User Interface für Roulette-Tests **********") label2.grid(column=0, row=0) label3 = ttk.Label(win, text="*******************************************************") label3.grid(column=0, row=1) # Button Click Event Function def click_me1(): action1.configure(text= 'Hallo ' + name.get()) label1.configure(foreground='red') label1.configure(text=" rotes Label ") # Button Click Event Function def click_me2(): action2.configure(text= " Button2 wurde geklickt") label1.configure(foreground='blue') label1.configure(text=" blaues Label ") # Ein Text Widget hinzufügen name = tk.StringVar() name_entered = ttk.Entry(win, width=4, textvariable=name) name_entered.grid(column=1, row=5) # Einen Button hinzufügen action1 = ttk.Button(win, text="Ok!", command=click_me1) action1.grid(column=2, row=5) # Einen 2. Button hinzufügen action2 = ttk.Button(win, text="Permtest vom Ende", command=click_me2) action2.grid(column=0, row=7) # Einen 3. Button hinzufügen action3 = ttk.Button(win, text="Permtest von oben", command="") action3.grid(column=1, row=7) # Einen 4. Button hinzufügen action4 = ttk.Button(win, text="Pooltest", command="") action4.grid(column=12, row=7) # Setze den Cursor in die Textbox name_entered.focus() #================== # GUI-Start #================== win.mainloop()