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
Die Seite ist von meiner Kiste mit Chrome nicht erreichbar. Gibt es andere Layout-Optionen, die man wählen kann? Es ist kein Problem, zu Deiner roulib01.py zurückzukehren. Meine Klasse "Coup" habe nur übungshalber gemacht. So mager, wie sie bisher angelegt ist, braucht man sie nicht. Mir ist klar, dass man sich die EC's zu jeder Zeit aus Deiner Klasse "Roulette-franz()" holen kann, wenn man eine Plein am Wickel hat. Unter Anaconda ist eine "qtconsole" verfügbar. Im zugehörigen Helpfile gibt es keinen Hinweis auf eine GUI mit variablen Widgets. Danke, dass Du diese Vorgehensweise akzeptierst. Wenn es soweit ist, wirst Du sicher bei der Umsetzung in Python helfen. Gruß von Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hier ist der Quelltext: # -*- coding: utf-8 -*- #======================== # imports #======================== #import sys #sys.path.append("D:\Python") #print(sys.path) #import re # Modul für Regular Expressions #import numpy as np #import matplotlib.pyplot as plt #import roulib01 as roulEGO # Unsere eigene Library, sie hat eine neue Versionsnummer. import tkinter as tk from tkinter import ttk import os import roullib00 as roul ChArten = roul.ChancenArten() # Konstruktor, der eine Instanz mit frei wählbarem Namen erzeugt. # globale Strings hinweis01 = ["(Bitte Pfad oben eingeben)"] fehler01 = ["Pfad ist üngültig!"] fehler02 = ["keine Coup-Nr.!"] fehler03 = ["Eingabe ungültig!"] # 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') # Modul-globale Variable #----------------------------- lastcoup = 0 perm = [] couplist = [] # Kopierstrings für das Directory-Eingabefeld: # D:\4All\Roulette\Edgar\Wien_F1_1992 # F:\Roulette\Faustan def ResetPerm(): pass # lastcoup2 = 0 # perm2 = [] # couplist2 = [] # lastcoup = lastcoup2 # perm = perm2 # couplist = couplist2 def read_Directory(path): txtfiles = [] # leere Liste der Dateinamen, wird nur lokal erzeugt! zz = 0 try: # Die Dateinamen einsammeln for filename in os.listdir(path): txtfiles.append(filename) zz = zz + 1 #print(zz) #print(filename) except: print('Not found: Dir=' + path) txtfiles = fehler01 print(str(zz) + ' Permfiles gefunden') 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 = dirtext.get() fn += "\\" fn += combo_1.get() # angeklickte Datei anhängen print(fn) # Anzahl der Perms wird angezeigt # Die Perm mit allem Drum und Dran in die Liste lines einlesen #---------------------------------------------------------------- file = open(fn) lines = file.readlines() print(str(len(lines)) + " Permlines gefunden.") file.close() # Die Listen perm und couplist füllen, dabei die Textzeilen aus lienes abtrennen #--------------------------------------------------------------------------------- x = 0 tx = 0 for each in lines: ti = lines[x].rstrip() # Escapes und Blanks herausnehmen try: i = int(ti) # print(i) perm.append(i) # der perm[]-Vektor wird gefüllt 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.ec_SR) + " " + str(cp.ec_GU)) # nur Testanzeige couplist.append(cp) # die Couptabelle wird gefüllt except: tx += 1 # nichtnumerische Zeilen zählen # 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") def entry1_return(event): try: i = int(entry1.get()) # if i<0 or i>36: print(i) perm.append(i) # der perm[]-Vektor wird gefüllt cp = roul.Coup() # eine neue Coup-Instanz # die aktuellen Attribute holen 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] # ein paar Testausgaben print(str(cp.pl_nr) + " " + str(cp.ec_SR) + " " + str(cp.ec_GU)) # nur Testanzeige couplist.append(cp) # die Couptabelle wird gefüllt label6.configure(text=(str(len(perm)) + " Permzahlen")) # neue Perm-Anzahl anzeigen label7.configure(text=(str(i) + " angefügt")) # neue Permzahl anzeigen except: label7.configure(text=fehler03) def entry1_del(event): # entry_delete fand ich, lag zu nah an entry.delete, umbenannt entry1.delete(0, 'end') # Eingabefeld für Permzahlen entry1 = tk.Entry(win, width=6) #win, width=4, textvariable=PZahl) #entry1.bind('<Return>', on_change) entry1.bind("<Escape>", entry1_del) entry1.bind("<Return>", entry1_return) entry1.grid(column=1, row=3) entry1.focus() # Setze den Cursor in die Textbox # Eingabefeld für dirname name = tk.StringVar() dirtext = ttk.Entry(win, width=40, textvariable=name) dirtext.grid(column=2, row=4) dirtext.bind("<Return>", click_FillCombo) # Eine Combobox anlegen # Eine ComboBox hinzufügen combo_1 = ttk.Combobox(win, width=38, values=hinweis01) combo_1.grid(column=2, row=5) combo_1.current(0) combo_1.bind("<<ComboboxSelected>>", callback) # callback als Baustellenschild :) # Textfelder (Labels) hinzufügen #---------------------------------------------------- label1 = ttk.Label(win, text="Enter a Plein-Nr. & Return:") label1.grid(column=0, row=3) #label1.configure(text=fehler01) # 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) # Labels hinzufügen label4 = ttk.Label(win, text="Click on an entry:") label4.grid(column=1, row=5) # Labels hinzufügen label5 = ttk.Label(win, text="Permpool-Directory:") label5.grid(column=1, row=4) # Labels hinzufügen label6 = ttk.Label(win, width=100, text='Anzeigen') label6.grid(column=3, row=5) # Labels hinzufügen label7 = ttk.Label(win, width=42, text='Next Plein') label7.grid(column=2, row=3) # Buttons hinzufügen #-------------------------------------------------------- action1 = ttk.Button(win, text="Reset Perm", command='') action1.grid(column=1, row=2) #action1.configure(text="NO!") #action1.configure(text="NO!") # Einen 3. Button hinzufügen action2 = ttk.Button(win, text="Permtest von oben", command="") action2.grid(column=1, row=8) # Einen 3. Button hinzufügen action3 = ttk.Button(win, text="Permtest von unten", command="") action3.grid(column=1, row=10) # Einen 5. Button hinzufügen action4 = ttk.Button(win, text="Pooltest", command="") action4.grid(column=1, row=12) #================== # GUI-Start #================== win.mainloop() Gebraucht wird aus Ego's roulib01.py nur eine einzige Tabelle. Die steckt in roullib00.py: # -*- coding: utf-8 -*- """ Created on Thu Jul 12 20:40:55 2018 @author: Anwender """ # Ego's numerische Listen class ChancenArten(): 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'] 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 Falls jemand das testen will, dann nach Run genau diese Reihenfolge beachten: - Zuerst einen Dir-Namen ohne Single-oder Doublequotes in das Directoryfeld kopieren und "Enter". - Danach in der Combobox scrollen und ein Entry anklicken. Die Perm ist dann in der Liste "perm" und etwas aufbereitet in der Liste "couplist" für die Verarbeitung bereit. Es gibt noch Macken: Der Button "ResetPerm" ist außer Funktion. Beim Anklicken eines 2., 3. etc. Entrys in der Combobox werden die Pleins addiert. Es gibt halt noch keine "ResetPerm"-Funktion. Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo Ego, es hapert mit tkinter an allen Ecken und Enden. Nimm dieses Fenster: Man sieht, das längste Element bestimmt die horizontale Ausrichtung. Da kann man für ein einzelnes Element im Parameter "width=..." eintragen was man will. Das Element selbst wird richtig bedient (Verbreiterung von width=6 auf width =60), aber es wirkt sich auf alle aus: In der Vertikalen gibt es eine ähnliche Macke. Ich habe die row-Parameter für die Buttons "Permtest von oben", "Permtest von unten" und "Pooltest" so eingestellt, dass diese Buttons weiter unten gestreut erscheinen müssten. "Pustekuchen" sagt tkinter und knallt die Buttons immer untereinander. Man kann keine Rahmen setzen. Man hat fast keine Macht über die Positionierung der Anzeigeelemente. Wenn man bedenkt, was dieses Fenster noch zeigen muss: die Satzanweisungen, die Abrechnungen, gestaffelt nach Coup, Perm und Pool, und die Trefferverläufe, dann spüre ich richtig körperliche Bauchschmerzen. In Excel-VBA wäre das alles easy und transparent und - schnell zu machen. Das probiere ich jetzt für ein "novice-analoges" Modell aus und messe die Arbeitszeit. Im Prinzip ist meine primitive tkinter-GUI soweit, dass man ein Modell einbauen könnte: Man kann ein beliebiges Verzeichnis anwählen, dann die darin enthaltenen Permnamen in die Combobox holen (Duisburg, Wien, CC, egal), dann eine Perm auswählen, die man über das Eingabefeld "Enter a Plein" fortsetzen kann. Den Quelltext stelle ich vorsichtshalber in das nächste Posting ein. Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo novice, schau Dir mal bitte weitere Charts aus dem Trader-Umfeld an und vergleiche mit Ego's Bildern. Könnte es sein, dass die Roulette-Charts generell flacher sind? Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
Hallo EGO, Die beiden Quelltexte vom Dienstag 00:58 und 01:04 habe ich übernommen. Nach dem Einsetzen eines eigenen Dateinamens path = 'F:\\Roulette\\Faustan\\Faustan1.txt' lief das Programm auf Anhieb und im spyder- Consolfenster sind die ganzen Listenprints und am Ende die Grafik erschienen - halt wie programmiert. (Die volle Grafik sieht man nur, wenn man scrollt. Mein Snippettool kann nur aktuell sichtbare Bereiche des Bildschirms aufnehmen.) Deinen Code habe ich weitgehend verstanden, und er hilft mir weiter. "import numpy as np" wird bei mir als "unused" markiert. "import re" nutzt Du ja auch noch nicht, wird aber nicht als "unused" markiert. Ich kämpfe noch mit tkinter, das sehr merkwürdige Effekte zeigt. Bis bald! Albert -
Python, die verpasste Chance?
topic antwortete auf Dr. Manque's Egoist in: Excel Formeln und Makros, Programmier-Lehrgänge
@novice Es ist gut, dass Du Dich offen von diesem Thema abgemeldet hast. So entstehen für Ego keine falschen Erwartungen, die enttäuscht werden, weil nichts geliefert wird. Gestern ist mir das Buch "Der Schwarze Schwan" von Nassim Nicholas Taleb (ein Ami, im Libanon geboren) in die Finger gekommen und hat mir den ganzen Tag "geraubt", weil ich es nach den ersten Seiten nicht mehr weglegen konnte. Darin ist viel vom Traden und von (unfähigen!) Tradern die Rede. Taleb war selbst Trader. Deshalb empfehle ich es Dir (8,41€ bei Amazon). Schwarze Schwäne sind überraschende Ereignisse, bzw. Umbrüche, die mit den an Gauß orientierten statistischen Methoden nicht vorhersagbar sind, aber oft die Welt mehr verändern als das statistisch bewertete "weiter so" (Beispiele: Börsencrashs, Kriege, 9/11, Ehescheidungen = negative Schwarze Schwäne) Taleb unterscheidet "skalierbare" und "nicht skalierbare" Tätigkeiten und Berufe. Skalierbar ist z.B. die Tätigkeit eines Bäckers. Sein Einkommen ist abhängig von der Menge der Brötchen, die er backt, und er muss für jedes Brötchen annähernd den gleichen Aufwand leisten. In nicht skalierbaren Berufen (Schauspieler, Trader, Schriftsteller, Glücksspieler etc.) gibt es mehr Freiheiten aber auch riesige Unterschiede beim Ertrag. Hier gilt die Regel "The winner takes all", die anderen hungern. Taleb zeigt nun, dass meistens der Erfolg der Winner nicht auf Talent beruht, sondern auf Glück und Zufall (= positive Schwarze Schwäne) - ein Zufall, der nicht berechenbar ist. @Ego Rein theoretisch sind Zweifel angesagt, ob der Roulette-Zufall mit Python besser beherrscht werden kann. Also in den nächsten Tagen versuche ich, ein Programm hinzukriegen, mit dem man testen kann, ob man nach Jason Brownlee höchstens den letzten Satz für die EC-Prognose verwenden kann oder ob Deine Vermutung "I know that the next time step depends on nearly all predecessors." richtig ist. Jason Brownlee heißt der Autor des von mir erwähnten E-Books "Introduction to Time Series Forecasting with Python", Untertitel "How to Prepare Data and Develop Models to Predict the Future". Gruß! Albert -
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!