Jump to content

Python, die verpasste Chance?


Recommended Posts

Hallo Forum,

 

ich bin mir meiner Vermutung recht sicher, dass es keinen Sinn macht, ein Neuronetz, egal von welchem Design, mit puren Ziehungsergebnissen zu füttern.

Rauschen --> Input  ergibt  Output --> Rauschen...

 

Also muss man die Daten erst aufarbeiten.

Nehmen wir uns mal eine EC vor, so generiert sie nicht nur immer ein neues Ergebnis, sondern füttert gleichzeitig eine Historie.

Man sollte also die Historie im Auge behalten, denn sonst hat man nicht sehr viel.

 

Nehmen wir weiter an, die Historie hat nur eine begrenzete Merkzeit, setzen wir sie mal willkürlich auf 8 Coups fest,

so haben die verschiedenen Historien, die denkbar sind, deutlich unterschiedliche Häufigkeiten.

 

Nimmt man Coups mit Ausgang Zero einfach mal als nicht geschehen an, damit es nicht zu schwierig wird,

dann gibt es nur 1/128 Historien mit nur einer Farbe in allen NonZeroCoups.

Das ist unter 1% und gleichzeitig die seltenste Historie.

 

Trifft die gleiche Farbe auch ein 9. Mal, erhöht sich die Seltenheit der erzeugten Historie auf 1/256 usw.

Zählt man dagegen die Farbtreffer in 8  NonZeroCoups aus, ergibt sich ein moderateres Bild.

Da ich gerade zu faul bin, das auszurechen und andere Rechenkünstler hier vergrault habe, werden wir wohl nie erfahren,

wieviele Historien von NonZeroCoups 4:4 ausgehen. 

 

3:5 und 5:3 werden gleich oft vorkommen, ebenso 2:6 und 6:2.

Selbst 1:7 und 7:1 sind gleich häufig zu erwarten und ganz erheblich häufiger als 0:8 und 8:0.

 

Sicherlich wird auch aus einer 0:8 Historie im nächsten NonZeroCoup zur Hälfte ein 0:9, aber dann wird die Seltenheit weiter gepflegt.

Hier wurden schon EC-Ausbleiber um die 30 Coups berichtet, aber die haben echten Seltenheitswert (19/37)^30.

https://www.wolframalpha.com/input/?i=(19%2F37)^30

 

30 Treffer ohne Zerounterbrechung sind noch deutlich seltener:

https://www.wolframalpha.com/input/?i=(18%2F37)^30

 

Frage: Wenn wir ein seltenes Ereignis in der Histore angereichert haben, wie stark ist die Tendenz des Zufalls, dies noch auszubauen?

Und was macht dann ein Neuronetz aus solchem Input?

 

Bisher habe ich beides noch nicht verheiratet und bin gespannt, wie es weiter geht.

 

 

Gruss vom Ego

 

bearbeitet von Egoist
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 21 Stunden schrieb Egoist:

Hallo Forum,

 

ich bin mir meiner Vermutung recht sicher, dass es keinen Sinn macht, ein Neuronetz, egal von welchem Design, mit puren Ziehungsergebnissen zu füttern.

Rauschen --> Input  ergibt  Output --> Rauschen...

 

 

Hallo Ego, 

 

eine kleine Anregung. Wie schon erwähnt schrieb ich ein Musterverfolgungsprogramm mit dem zu erwartenden Ergebnis, und relativ große Schwankungen.

 

Da sich alleine durch einen Fehltreffer ein Ende eines verfolgten Musters anzeigte (ohne Längenbegrenzung), ist dieser Ansatz zum scheitern verdammt.

Mit einer einfachen Chartanalyse für Figuren mit einer Größe von drei bis fünf Würfen meinerseits, sowie einer Lerntabelle von andere Seite schaffte man auch keine Gleichsatzüberlegenheit.

 

Somit gehe ich konform, und es wurde auch bewiesen, mit der Vermutung eine Auswertung von Daten welche direkt aus Permanz ausgelesen werden können ist nicht zielführend. Nicht wirklich gut formuliert, vielleicht schafft es wer in klarere Weise, als auch exakter (!), zu formulieren.

 

Wenn's also nicht einfach geht, wird's wohl anstrengend. 
Zerlegen wir die Problematik in kleine verdaubere Happen.  

 

Erster Happen: Welche indirekten Informationen würden uns wohl weiterhelfen?
    
    1. abstrahierte Informationen
    
    Ist die Betrachtung von Favoritenwechsel bei Chancen und Mustern in kleineren sowie größeren Abschnitten zu direkt?
    
    1.1. chaotische vs nichtchaotische Abschnitte
    
    Gebildeter Menschen könnten jetzt die aktuellen Theorien bezüglich Entropie einbringen.
    
    Alleine die Information ein Merkmal zeigt sich verstärkt in einer genügend langen Permanenzstrecke würde einem Spieler weiter helfen.
    
    Wobei nicht einmal dieses Merkmal vorweg beschrieben sein müsste, um dem besagten Spieler das Leben zu erleichtern, es reicht den Beginn einer derartigen, nicht zu kurzen, Strecke zu erfahren.
    
    ... Fortsetzung bei Geistesblitz (des koa dauern) 
    
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 12.9.2018 um 13:10 schrieb novice:

Moin, nach meinen Aufzeichnungen sind alle Historien älter als 4 Stunden zu vernachlässigen!

 

Hallo Novice,

 

Deine Zeitangabe ist etwas ungenau, denn je nach Umgebung kann Roulette weniger als 30 Coups pro Stunde generieren, oder aber auch sehr viel mehr.

Deine Angabe würde sich also vermutlich auf 3-6 Rotationen beziehen.

 

Geht man von Plein aus, so gibt es durchaus (sehr selten) 20 Rotationen in denen eine Zahl gar nicht vorkommt.

Spielt man diese Situationen für 80 folgende Rotationen weiter, normalisieren sich die Treffer auf diesem Restanten im weiteren Spiel.

 

Nach meiner Beobachtung kann man nicht genug Historie ansammeln.

Allerdings verblasst mit jedem neuen Coup der Einfluss der älteren logarithmisch.

 

 

Viel Erfolg beim Traden,

Gruss vom Ego

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 13.9.2018 um 00:01 schrieb wiensschlechtester:

Erster Happen: Welche indirekten Informationen würden uns wohl weiterhelfen?

 

Hallo Wiener,

 

was uns helfen kann, werden wir erst hinterher wissen, wenn etwas geholfen haben wird.

Es ist durchaus denkbar, dass gar nichts hilft ;)

 

Am 13.9.2018 um 00:01 schrieb wiensschlechtester:

    1. abstrahierte Informationen
    
    Ist die Betrachtung von Favoritenwechsel bei Chancen und Mustern in kleineren sowie größeren Abschnitten zu direkt?

 

Hier kann ich Dir nicht folgen, von welchen Chancen schreibst Du (EC, Plein),

von Mustern höre ich eher im Zusammenhang mit EC,

von Favoriten eher nur bei Pleinzahlen.

 

Am 13.9.2018 um 00:01 schrieb wiensschlechtester:

    1.1. chaotische vs nichtchaotische Abschnitte

 

Auch muss mehr Präzision her, denn es ist unklar, wie Du (Nicht)Chaos definierst.

 

Man könnte die Ausbildung einer langen EC-Serie als nichtchaotisch einsortieren,

aber eigentlich ist die "lange Ordnung" als ein Ausdruck für die maximale Abweichung

vom Erwartungswert zu werten.

 

Am 13.9.2018 um 00:01 schrieb wiensschlechtester:


    Gebildeter Menschen könnten jetzt die aktuellen Theorien bezüglich Entropie einbringen.
    
    Alleine die Information ein Merkmal zeigt sich verstärkt in einer genügend langen Permanenzstrecke würde einem Spieler weiter helfen.
    
    Wobei nicht einmal dieses Merkmal vorweg beschrieben sein müsste, um dem besagten Spieler das Leben zu erleichtern, es reicht den Beginn einer derartigen, nicht zu kurzen, Strecke zu erfahren.
    

 

Dazu fehlt mir noch so einiger Hintergrund. Mit den Wikipediaartikeln habe ich gewöhnlich einige Schwierigkeiten.

Nett fand ich diese Aussage:

Die Einheit 1 Shannon ist definiert als der Informationsgehalt eines Ereignisses mit der Wahrscheinlichkeit p=0,5{\displaystyle p=0{,}5}p=0{,}5. Ein Beispiel für ein solches Ereignis ist das Ergebnis Kopf eines Münzwurfs.

 

 

Sobald wir in Deep Learning einsteigen, wird sich weisen, dass wir uns nicht um Merkmale kümmern müssen,

denn Neuronetze sind grossartig, wenn es um selbständiges Erkennen dieser Merkmale geht.

 

 

Gruss vom Ego

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 45 Minuten schrieb Egoist:

 

Hallo Novice,

 

Deine Zeitangabe ist etwas ungenau, denn je nach Umgebung kann Roulette weniger als 30 Coups pro Stunde generieren, oder aber auch sehr viel mehr.

Deine Angabe würde sich also vermutlich auf 3-6 Rotationen beziehen.

 

Geht man von Plein aus, so gibt es durchaus (sehr selten) 20 Rotationen in denen eine Zahl gar nicht vorkommt.

Spielt man diese Situationen für 80 folgende Rotationen weiter, normalisieren sich die Treffer auf diesem Restanten im weiteren Spiel.

 

Nach meiner Beobachtung kann man nicht genug Historie ansammeln.

Allerdings verblasst mit jedem neuen Coup der Einfluss der älteren logarithmisch.

 

 

Viel Erfolg beim Traden,

Gruss vom Ego

 

Hi Egoist,

 

kommt darauf an, bei EC sollte man irgendwann "abschneiden", sonst gibt es zuviele Möglichkeiten und wird eher verwirrend.

Und man möchte nicht auf eine nicht mehr aktuelle Struktur/Ordnung setzen.

 

Gruß

roemer

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Minuten schrieb roemer:

kommt darauf an, bei EC sollte man irgendwann "abschneiden", sonst gibt es zuviele Möglichkeiten und wird eher verwirrend.

Und man möchte nicht auf eine nicht mehr aktuelle Struktur/Ordnung setzen.

 

Hallo roemer,

 

in der Praxis gebe ich Dir Recht, man muss die Tauglichkeit im Auge behalten, das im Casino (ohne elektronische Hilfe)

umzusetzen.

Wenn ich mal auf EC spielen sollte (selten) reicht mir die Ampel mit 10-20 Coups oft aus, um lohnenswerte Prognosen zu erstellen.

Das sind dann aber eher seltene Konstellationen, die ich dann angreife.

 

 

Gruss vom Ego

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.)

 

EGO-Grafik1.gif.3a11df541d5eaa8ba6c122394ee2367c.gif

 

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin Herr Dr.

 

und vielen Dank für Dein Lebenszeichen.

 

Zitat

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.

 

So soll es auch (fast) sein.

In meiner Umgebung wirft matplotlib.pyplot.show() jedoch immer ein extra Fenster aus, welches man mit den einschlägigen Piktogrammen bis auf Vollbild stellen kann.

 

Es gibt, soweit ich weiss, einen Metabefehl ("inline" oder so) für die Jupyternotebooks, die die Grafik in den Fliesstext der Konsole integrieren.

So etwas ähnliches muss wohl bei Dir in Spyder vorbelegt sein.

 

Zitat

(Die volle Grafik sieht man nur, wenn man scrollt. Mein Snippettool kann nur aktuell sichtbare Bereiche des Bildschirms aufnehmen.)

 

EGO-Grafik1.gif.3a11df541d5eaa8ba6c122394ee2367c.gif

 

Im Extrafenster, so wie bei mir, kannst Du auch Zoomen, Scrollen, Speichern und noch mehr.

Musst Du selber gucken, Spyder nutze ich noch nicht.

 

Zitat

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.

 

Ja das kann sein, aber numpy wird sicherlich noch gebraucht, daher kannste das übergehen.

"re" wird schon genutzt, daher auch nicht bemängelt (suche "re.match").

 

Zitat

Ich kämpfe noch mit tkinter, das sehr merkwürdige Effekte zeigt.

 

Wo hapert's?

Ich habe damit zwar nicht weitergearbeitet, aber das finden wir gemeinsam sicher schnell raus.

 

 

Gruss vom Ego

bearbeitet von Egoist
Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 13.9.2018 um 00:01 schrieb wiensschlechtester:

 Wobei nicht einmal dieses Merkmal vorweg beschrieben sein müsste, um dem besagten Spieler das Leben zu erleichtern, es reicht den Beginn einer derartigen, nicht zu kurzen, Strecke zu erfahren.

 

Es wird wohl darauf hinauslaufen, verschieden lange Historien mit verschiedenen Modellen zu trainieren/optimieren.

Dann kann man anschliessend alle gleichzeitig zur Situation befragen, um eine demokratische Abstimmung zu veranstalten.

 

Schaltet man noch ein Neuronetz dazwischen, welches die Stimmrechte aller so optimiert, dass das beste Ergebnis erscheint,

hat man langsam Boden unter die Füsse geschüttet.

 

 

Gruss vom Ego

bearbeitet von Egoist
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 10 Stunden schrieb Egoist:

Und hier noch ein fetter Zoom für @novice

 

 

WB2018voll_zoom_fett.PNG

 

 

Sehr schön, da bekomme ich doch gleich wieder Interesse :)

 

Ein grober Überblick und ich greif mal "Ungerade" raus und erkenne mein Handlungsmuster! Gleiche Logik, nur andere Umsetzung für den Profitweg!

 

 

UNGERADE.png

Example.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja zwangsläufig, darum habe ich für mich eine Mindeststrecke definiert ab welcher ich meine auftretende Muster akzeptiere. Anderseits zeigen meine Aufzeichnungen auch, das im "flachen" Verlauf genauso gut agiert werden kann, mit dem Nachteil einer sinkenden Trefferqoute.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 46 Minuten schrieb Dr. Manque:

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

Hi Albert,

 

ich sehe das nicht so. Es ist der Auflösung geschuldet, dass der (eher geringe) Anstieg im Chart so steil erscheint.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 14 Stunden schrieb Egoist:

...

...

Wo hapert's?

Ich habe damit zwar nicht weitergearbeitet, aber das finden wir gemeinsam sicher schnell raus.

 

Gruss vom Ego

Hallo Ego,

 

es hapert mit tkinter an allen Ecken und Enden.

Nimm dieses Fenster:

tkinter-Fenster1.gif.ee67f7c745ba351d3665adb89322d57d.gif

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:

tkinter-Fenster2.gif.ee36acb45eb9977d3707173b056462f0.gif

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:

tkinter-Fenster3.gif.257c48fa6208c4e5690ee7c5441d45c1.gif

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

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 12.9.2018 um 02:13 schrieb Egoist:

 

Nimmt man Coups mit Ausgang Zero einfach mal als nicht geschehen an, damit es nicht zu schwierig wird,

dann gibt es nur 1/128 Historien mit nur einer Farbe in allen NonZeroCoups.

Das ist unter 1% und gleichzeitig die seltenste Historie.

 

 

Hallo Ego,

 

bitte erläutere das mal im Detail. Für mich gilt bisher, dass eine 8er-Serie zu 1/256 erscheint...

 

Gruss

Frenchy

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Minuten schrieb Dr. Manque:

...

...

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

 

 

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Dr. Manque:

Das probiere ich jetzt für ein "novice-analoges" Modell aus und messe die Arbeitszeit.

 

 

Albert, dir fehlt dazu noch das hier:

 

 

MUSTER.png

 

und wer mitdenken kann, sieht auch die anderen 3 Winner :)

bearbeitet von novice
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Dr. Manque:

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:

 

Hallo Albert,

 

Das ist fast wie bei Excel, denn dort richtet sich auch alles nach der breitesten Zelle.

Was halt nicht geht, ist spaltenübergreifend Zellen zu vereinen.

Wenn Du sowas willst, schaue Dir doch mal den "pack"-Manager an.

 

https://www.python-kurs.eu/tkinter_layout_management.php

 

vor 2 Stunden schrieb Dr. Manque:

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.

 

Sorry, aber das sind keine Macken, das hast Du so bestellt  :P, wenn Du mit Gridlayout arbeitest.

 

vor 1 Stunde schrieb Dr. Manque:

Hier ist der Quelltext:

 

vor 1 Stunde schrieb Dr. Manque:

Gebraucht wird aus Ego's roulib01.py nur eine einzige Tabelle. Die steckt in roullib00.py:

 

Ich finde es sehr schade, dass Du lieber Deine eigene (inkompatible) Moduldatei benutzen willst, ich musste deshalb alles zurückändern, ehe es lief.

Deine Klasse "Coup" habe ich vorläufig an meine angehängt.

 

vor 2 Stunden schrieb Dr. Manque:

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.

 

Wenn schon klar ist, dass Du den Gridmanager nicht nach Deinen Wünschen brauchen kannst,

schau doch auch mal nach pyQT, da gibt es einen graphischen Designer, mit dem Du Deine Widgets einfach zusammenklicken kannst.

 

vor 2 Stunden schrieb Dr. Manque:

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.

 

Aua,  wie wäre es, wenn Du einen Prototypen Deines Gui in VBA machen würdest?

So ein fertiges Fenster könnte man dann doch immernoch in Python übersetzen.

 

 

Gruss vom Ego

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie ist deine Meinung dazu?

Du kannst jetzt schreiben und dich später registrieren. Bereits registrierter Teilnehmer? Dann melde dich jetzt an, um einen Kommentar zu schreiben.
Hinweis: Dein Beitrag wird nicht sofort sichtbar sein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Neu erstellen...