Jump to content

Python, die verpasste Chance?


Recommended Posts

vor 2 Stunden schrieb Dr. Manque:

Hallo Ego,

 

Deine Klassendefinitionen in roulib00.py finde ich ok und werde sie verwenden.

 

Hallo Albert,

 

schön, dass Dir das zusagt. Es spricht aber auch nichts dagegen, den Klassen weitere Tabellen/Listen anzufügen.

Speziell bei den numerischen EC-Listen ist aber auch super einfach z.B. das Vorzeichen zu tauschen.

 

vor 2 Stunden schrieb Dr. Manque:

Bewundernswert ist Deine Geduld beim Editieren von "format_Farbe" in der Klasse Roulette_franz().

Kapieren kann ich diese Variable allerdings noch nicht.

 

Scheinbar ist es Deiner Aufmerksamkeit entgangen, aber die Listen in meiner numerischen Klasse

wurden alle mit meinem älteren Pythons_cript erzeugt und nur in die roulib00.py mit copy & paste eingefügt.

 

Die kryptischen Zeichen rund um die einzelnen Pleinzahlen stellen ANSI-Escapesequenzen zur Steuerung eines Terminals dar.

https://de.wikipedia.org/wiki/ANSI-Escapesequenz

 

vor 2 Stunden schrieb Dr. Manque:

Du bist doch schon recht weit.

 

Das täuscht, sicherlich habe ich etwas mehr Zeit aufgewendet, als üblich zur Verfügung steht, weil ich Urlaub hatte.

Das ist jetzt aber vorbei und ich werde Eure Mithilfe brauchen, um den Karren zu ziehen.

 

vor 2 Stunden schrieb Dr. Manque:

Ich quäle mich immer noch durch Tutorials und Bücher. Die Python-Syntax ist verdammt eigenwillig und gewöhnungsbedürftig.

 

In Wieners Thread habe ich einen Videolink hinterlassen.

Der lesende Mathematiker und Informatiker stellt die Irritationen, die durch Python bei Umsteigern generiert werden können, gelegentlich dar.

Falls Dir Deine Bücher mal zu schmal werden, guckst Du vielleicht auch mal dort.

 

vor 2 Stunden schrieb Dr. Manque:

Dies ist ein Posting-Test. Bitte nicht darauf reagieren!

Albert



 

nach 3mal "Bearbeiten" und "Speichern": Es geht offenbar wieder!!!

 

 

Leider scheinen die Forenmacher es noch nicht geschafft zu haben, die Migrationsprobleme einzudämmen.

Eine Antwort, auf meinen ausführlichen Bugreport an @Paroli habe ich auch noch nicht erhalten.

Ich gehe von intensiven Arbeiten auf dieser Ebene aus.

 

 

Gruss vom Ego

Link zu diesem Kommentar
Auf anderen Seiten teilen

Meine Wut über den verlorenen Artikel hat sich etwas gelegt, zumal ich auch an der Pythonfront mit hartnäckigen Problemen zu kämpfen hatte.

 

Die Notwendigkeit einer graphischen Benutzeroberfläche(GUI) wird immer dringender, denn ohne sie kann man kein vernünftiges Programm bauen.

Meine Suche nach einer erfolgversprechenden Lösung führte mich zu Qt, bzw zu PyQt und dem Tool "designer.exe"

 

Leider ist die Verbindung der GUI mit einem Pythonprogramm noch vergleichsweise knochig, aber der Designer ist schon klasse.

Weniger klasse ist aber, dass man ohne Klassendefinitionen in Python nicht weit kommt.

 

 

Gruss vom Ego

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 16 Stunden schrieb Egoist:

Die Notwendigkeit einer graphischen Benutzeroberfläche(GUI) wird immer dringender, denn ohne sie kann man kein vernünftiges Programm bauen.

Meine Suche nach einer erfolgversprechenden Lösung führte mich zu Qt, bzw zu PyQt und dem Tool "designer.exe"

 

Moin Ego,

 

Qt ist zwar schon alt, somit gut dokumentiert und getestet, doch hast du schon einen Blick auf Kivy geworfen, ist möglichereweise für unsere Bedürfnisse (wenigstens für meine) geeigneter?

 

Bin leider noch nicht so weit, ärgerte mich letztens noch mit dem Konstruktor herum.

 

Servus

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 8 Stunden schrieb wiensschlechtester:

Blick auf Kivy geworfen, ist möglichereweise für unsere Bedürfnisse (wenigstens für meine) geeigneter?

 

Hallo Wiener,

 

natürlich habe ich auch Kivy schon in der engeren Wahl.

Was mich an QT so angemacht hatte, war der Designer.

Ob es sowas auch schon für Kivy gibt, weiss ich leider nicht.

 

Falls Du das noch nicht gesehen hast, ist es vielleicht eine Blick wert:

https://www.youtube.com/watch?v=F7UKmK9eQLY&list=PLdNh1e1kmiPP4YApJm8ENK2yMlwF1_edq

Wenn es gefällt, kannst Du das in Deinen Thread überragen.

 

Kivy hat den Vorteil Touchscreens einzubinden und hat den Anspruch auf grösste Plattformunabhängigkeit.

Klar, dass Dich das als Smartphonejunkie besonders anmacht...

 

Bei der ersten Ansicht hatte ich mitgenommen, man müsse auch noch Kivyfiles schreiben,

jetzt sehe ich mir das nochmal an.

 

 

Gruss vom Ego

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 17.7.2018 um 16:55 schrieb wiensschlechtester:

hast du schon einen Blick auf Kivy geworfen, ist möglichereweise für unsere Bedürfnisse (wenigstens für meine) geeigneter?

 

Moin nach Wien,

 

vorhin habe ich begonnen ein Tutorialfile einzuhacken (das s_cript aus den o.a.Crashkurs #9) ende aber bei PyCharm auf der Schnauze.

Es fehlt eine Anbindung an sdl2 DLL oder so, daher habe ich nach kivy.org mein Systempython beackert und diesen als Interpreter bei PyCharm gewählt.

 

Das brachte keine Besserung.

Vorläufig stehe ich mit dem kivy-Paket auf dem Schlauch...

 

 

Wäre für Hinweise dankbar,

Ego

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 14 Stunden schrieb Egoist:

vorhin habe ich begonnen ein Tutorialfile einzuhacken (das s_cript aus den o.a.Crashkurs #9) ende aber bei PyCharm auf der Schnauze.

Es fehlt eine Anbindung an sdl2 DLL oder so, daher habe ich nach kivy.org mein Systempython beackert und diesen als Interpreter bei PyCharm gewählt.

 

Das brachte keine Besserung.

Vorläufig stehe ich mit dem kivy-Paket auf dem Schlauch...

 

 

Hi Ego,

 

bezweifle zwar dass ich Dinge hinbekomme welche du nicht schaffst, werde es mir aber am Wochenende anschauen.

 

Servus

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 10.7.2018 um 23:46 schrieb Egoist:

Hier mal mein Entwurf für die erste Version unseres Roulettemoduls "roulib00.py"

 

 

Hallo Ego,

 

da ich nicht nur abschreiben will, sondern auch meine eigene Übungsversion schreibe, hilft mir mehr beim Verständnis.

 

Anfangs war ich z.B. durch das " if __name__ == '__main__':" verwirrt, googeln hilft zum Glück öfters.

 

Deine Bibiliothek werde ich verwenden, trotzdem stelle ich mal eine kleine Übung von mir rein, um vielleicht die Schüchternheit anderer etwas abzuschwächen.

 

Ein kleine Verständnisfrage. Im nachfolgendem Code kann man den Konstruktor ja getrost weglassen - soll man das?

 

class Chancen: 
    def __init__(self):
        self.kesselzahl = 0
        self.rn = 0
        self.pi = 0
        self.mp = 0
        self.se = 0
        self.du = 0
        self.co = 0
        self.tr = 0
        self.tp = 0
  
    kess = (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)
    paip = (0,"P","I","I","P","I","P","I","I","P","P","I","I","P","I","P","P","I","P","I","P","P","I","I","P","P","I","I","P","P","I","I","P","P","I","I","P")
    mapa = (0,"G","K","G","K","G","K","G","K","G","K","G","K","G","K","G","K","G","K","K","G","K","G","K","G","K","G","K","G","K","G","K","G","K","G","K","G")
    sekt = ("Z","Z","Z","G","G","G","G","G","O","O","O","K","K","K","K","K","K","K","K","K","K","K","K","O","O","O","O","O","G","G","G","G","G","G","G","G","G") 
    rono = (0,"R","N","R","N","R","N","R","N","R","N","R","N","R","N","R","N","R","N","R","N","R","N","R","N","R","N","R","N","R","N","R","N","R","N","R","N")
    dou = (0, 3, 2, 2, 1, 2, 1, 3, 2, 3, 1, 3, 2, 3, 1, 3, 1, 2, 1, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 3, 1, 3, 1, 3)
    col = (0, 2, 3, 1, 1, 3, 2, 1, 2, 1, 3, 3, 1, 3, 2, 3, 2, 2, 1, 2, 3, 1, 3, 1, 2, 2, 1, 3, 1, 3, 2, 1, 1, 3, 2, 3, 2)
    trs = (0, 31, 13, 19, 1, 19, 1, 25, 13, 31, 1, 25, 13, 31, 7, 25, 7, 19, 7, 1, 19, 13, 31, 1, 19, 13, 31, 7, 19, 13, 25, 7, 25, 7, 31, 1, 25)
    trp = (0, 31, 13, 19, 4, 19, 1, 25, 16, 34, 4, 25, 13, 34, 10, 28, 7, 22, 10, 4, 22, 16, 31, 1, 19, 13, 31, 7, 22, 16, 28, 7, 28, 10, 34, 1, 25)

    def bestimmen(self,zahl):
        self.kesselzahl = self.kess.index(zahl)
        self.rn = self.rono[self.kesselzahl]
        self.pi = self.paip[self.kesselzahl]
        self.mp = self.mapa[self.kesselzahl]
        self.se = self.sekt[self.kesselzahl]
        self.du = self.dou[self.kesselzahl]
        self.co = self.dou[self.kesselzahl]
        self.tr = self.trs[self.kesselzahl]
        self.tp = self.trp[self.kesselzahl]
    
chance = Chancen()
chance.bestimmen(int(input("Zahl eingeben:")))
print("EC:",chance.rn,chance.pi,chance.mp)

Servus

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 9 Stunden schrieb wiensschlechtester:

bezweifle zwar dass ich Dinge hinbekomme welche du nicht schaffst, werde es mir aber am Wochenende anschauen.

 

Moin Wiener,

 

es hat mich einen Batzen Versuche gekostet, bis es so halbwegs hingehauen hat.

Bestimmt habe ich mir schon im Vorfeld die Hürden selbst tüchtig hoch gesetzt.

 

Kivy 1.10.1 braucht eine Tonne voll anderer Module, die alle zueinander passen müssen.

Unangenehmerweise dürfen viele davon nicht die aktuellsten sein.

Vermutlich bin ich daher mit dem Pip- Installer so herzhaft gestrandet.

 

In meiner Not habe ich schliesslich Anaconda installiert, was allerdings dauerte.

Nach einem Fehlstart, weil ich noch massig Programme auf dem Schirm offen hatte,
konnte ich auf der frisch gebooteten Maschine in der Eingabeaufforderung mit einem Einzeiler:

conda install kivy -c conda-forge

das Problem teilweise lösen.

 

Teilweise nur deshalb, weil sich danach weder der Anaconda Navigator noch Spyder mehr starten liessen.

Wer das verhindern will, muss kivy unbedingt in eine virtuelle Umgebung  installieren,

denn es werden dabei z.T. neuere Libraries durch ältere ersetzt.

Das dürfte der Grund dafür sein, dass bei mir der Navigator und Spyder futsch sind.

 

Mit PyCharm konnte ich aber den zurückgelassenen Systeminterpreter mit den kivy-Modulen

problemlos einbinden und endlich das kleine s_cript aus o.a. Tut#9 laufen lasen...

 

Du siehst, man bekommt nicht alles geschenkt.

 

 

Viel Erfolg und zähe Nerven

wünscht Euch Ego

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 9 Stunden schrieb wiensschlechtester:

Deine Bibiliothek werde ich verwenden, trotzdem stelle ich mal eine kleine Übung von mir rein, um vielleicht die Schüchternheit anderer etwas abzuschwächen.

 

Hallo nochmal,

 

ich freue mich über jede praktische Übung hier sehr.

Ohne es jetzt schon in PyCharm überführt zu haben, sieht alles ganz ordentlich und lauffähig aus!

 

Zur Übung kann man das so machen und wenn es fehlerfrei ist, kommen die beiden def-Blöcke bitte in Deine Klasse

"RouldefWien" in der Datei roulib00.py. Danach kannst Du die Datei unter roulib01rc01.py abspeichern.

 

Deine Übung ginge dann etwa so weiter:

import RouldefWien from roulib01rc01 as RdW   #RdW ist die hier jetzt gültige Abkürzung (frei wählbar)


chance = RdW()  # greift auf das eingebundene Modul zurück, der Rest ist dann wie gehabt

chance.bestimmen(int(input("Zahl eingeben:")))
print("EC:",chance.rn,chance.pi,chance.mp)

Hoffentlich habe ich keine Fehler eingehackt, denn das war nicht aus getestetm Code kopiert.

 

 

Die Methode "bestimmen()" gehört dann ab sofort zu den neuen Fähigkeiten Deiner Wiener Klasse.

Zu meiner numerischen Klasse passt Deine Definition allerdings nicht und ist ihr (noch) unbekannt.

 

Ich gebe aber noch zu bedenken, dass Deine Methode unpassende Parameter mit einem Bauchklatscher quittieren wird.

 

 

Viel Spass mit Python

wünscht Euch Ego

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 12 Stunden schrieb Egoist:

conda install kivy -c conda-forge

 

Teilweise nur deshalb, weil sich danach weder der Anaconda Navigator noch Spyder mehr starten liessen.

Wer das verhindern will, muss kivy unbedingt in eine virtuelle Umgebung  installieren,

denn es werden dabei z.T. neuere Libraries durch ältere ersetzt.

Das dürfte der Grund dafür sein, dass bei mir der Navigator und Spyder futsch sind.

 

Mit PyCharm konnte ich aber den zurückgelassenen Systeminterpreter mit den kivy-Modulen

problemlos einbinden und endlich das kleine s_cript aus o.a. Tut#9 laufen lasen...

.

Viel Erfolg und zähe Nerven

wünscht Euch Ego

Da es wahrscheinlich für Dich  Guten Morgen heißt:

 

Guten Morgen Ego,

 

da hast Du mir mal einigen Ärger erspart, also geht die Suche nach einer einfachen Möglichkeit weiter.

 

Werde noch ein wenig das www nach Kivy, und falls es nicht einfach genug erscheint nach anderen Möglichkeiten durchforsten.

Die GUI-Liste, länger als gedacht, für Python hast Du sicherlich auch schon gesehen, es gibt somit einige Auswahlmöglichkeiten.

 

Die einfachste Möglichkeit Betriebssystem unabhängig zu agieren ist natürlich über ein Web-App, doch wollen wir ja möglichst viel mit Python alleine machen.

 

Wir brauchen für Roulette eigentlich nicht viel! Nur die Möglichkeit ein paar Sprite zu "malen", etwaige Standarddesigns können uns egal sein.

 

@Dr. Manque: Wo sind die Grenzen für das Standard GUI?

 

Lange Rede kurzer Sinn, begebe mich auf die Suche....

bearbeitet von wiensschlechtester
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 10 Stunden schrieb Egoist:

Zur Übung kann man das so machen und wenn es fehlerfrei ist, kommen die beiden def-Blöcke bitte in Deine Klasse

"RouldefWien" in der Datei roulib00.py. Danach kannst Du die Datei unter roulib01rc01.py abspeichern.

 

Deine Übung ginge dann etwa so weiter:

 

Mercy

 

vor 10 Stunden schrieb Egoist:

Ich gebe aber noch zu bedenken, dass Deine Methode unpassende Parameter mit einem Bauchklatscher quittieren wird.

 

Sehe ich nicht so. Diese Problem muß doch über das Einlesen der Daten bereinigt werden.

Einlesen von einer Datei ohne Zeichenüberprüfung geht sowieso nicht, und manuell über ein Tableau bei dem nur jeweils eine Zahl anklickbar ist (als Vorschlag, wenn wir das GUI-Problem im Griff haben, testet drei Möglichkeiten praktisch, und diese Eingabeart war am schnellsten).

 

Servus

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 12 Stunden schrieb Egoist:

Kivy 1.10.1 braucht eine Tonne voll anderer Module, die alle zueinander passen müssen.

Unangenehmerweise dürfen viele davon nicht die aktuellsten sein.

Vermutlich bin ich daher mit dem Pip- Installer so herzhaft gestrandet.

 

Probleme bei der installation scheinen öfters aufzutreten, da Kivy nicht über den Standardweg installiert werden soll, es gibt dafür eine ausfühliche Installationsanweisung. Suche gerade für die Allgemeinheit eine einfache deutsche Anleitung.

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 5 Stunden schrieb Dr. Manque:

Sorry, ich muss mich von Python verabschieden.

Das Leben ist zu kurz für diese Sch...

 

Albert

 

Bitte, bitte Albert!

 

Bitte nicht den Sand in den Kopf stecken!!!

 

vor 5 Stunden schrieb Dr. Manque:

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

 

Als ich das gelesen habe, war ich noch zuversichtlich, es mit ein paar Zeilen Code hinzukriegen, denn ich dachte man könne den Namen einer Liste übergeben und gut ist.

Leider wird nicht der Name in values referenziert, sondern der aktuelle Inhalt der Liste wird übernommen.

Solche Verständigungsprobleme wird es zu Beginn immer wieder geben.

Bitte quäle Dich dann nicht so lange im stillen Kämmerlein, bis zur totalen Aufgabe.

Poste lieber Dein Problem hier, oder in einem Pythonforum (für bessere Antworten).

 

Obwohl ich nicht verstehe, was eine Combobox mit 3000+ Zeilen für den Anwender bringen kann,

habe ich mich sofort um Dein Problem gekümmert.

 

Dabei habe ich auf ein anderes Tutorial zurückgegriffen, aus dem das Gerüst des folgenden *.py besteht.

https://www.youtube.com/watch?v=ahtKa4MiJgs&list=PLAy9pyHEMnr0oBS3b4TeEAg49RhnvQQVK

Angefangen habe ich in #44 wo es um die Combobox ging.

 

Daher ist noch der "zettel"-Code aus den vorhergehenden Folgen drin.

Meinen modifizierten Code spalte ich ab, wegen den Forenproblemen.

 

 

Viel Spass mit Python,

wünscht Ego

 

 

bearbeitet von Egoist
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier nun mein modifizierter Code, bitte dafür die Tutorials von Frederik Weitz ansehen (zwinker).

 

from tkinter import *
from tkinter.scrolledtext import *
from tkinter.ttk import Combobox

# Vorbelegung einer Liste mit allerhand einzelnen Strings, die schliesslich in der Combobox landen werden.

comboliste = ["Hallo ", "Albert!\n\n", "Das ", "ist ", "mein ", "erster ", "Text.\n", "Der ", "ist ", "noch ", "kurz."]
comboliste += ["\n\nDas gelbe Feld ist ein Eingabefeld."]
comboliste += ["\nEingaben dort mit <Return> beenden."]
comboliste += ["\nBitte die Combobox (rechts) vorher"]
comboliste += ["\nund nachher genau durchsehen..."]

# hier wird nur ein langer String (Zeichenkette) daraus gemacht.
volltext = " ".join(comboliste)

def set_in(event):          # Diese Funktion wird bei Eingabe von <Return> im Entryfeld (gelb) aufgerufen.
    global comboliste       # Das ist nicht sehr sauber, die Liste wird aus dem globalen Kontext abgesaugt.
    global cb               # ebenso die Combobox, das geht sicher alles besser.

    zettel.insert(END, "\n" + e.get())  # Pipifax es wird der Inhalt des Entryfeldes (e) angehängt.
    comboliste = (zettel.get("1.0", END)).split()  # interessanter, alle Worte im Textfeld werden in eine Liste überführt.
    print(comboliste)       # die kann man auf der Console nun begutachten.

    # Jetzt kommt die Wurzel des Übels, welche Albert gequält hat, wie ein fauler Zahn.
    # Wir haben zwar etwas unschönes gemacht, um in der Definition an die Combobox zu gelangen,
    # aber es demonstriert die grundsätzliche Vorgehensweise.

    cb['values'] = comboliste   # Die Combobox hat eine für mich auch noch seltsame Eigenschaft,
                                # da das wie ein Listenindex aussieht, dürfte 'values" intern
                                # auch einem Integer entsprechen.
    # Immerhin kann man mit dem String "values" als Index auf das Objekt ComboBox schreibend zugreifen.
    # Das scheint es gewesen zu sein...

    return

root = Tk() # Falls es zu dem folgenden noch Fragen gibt, Tutorial gucken und dann hier fragen...

frame1 = Frame(root)
frame1.pack(fill=X)

e = Entry(frame1, width=20, bg="yellow")
e.bind("<Return>", set_in)
e.pack(side=LEFT)

cb = Combobox(frame1, height=5, width=15, values=comboliste)
cb.pack(side=LEFT)

zettel = ScrolledText(root, bg="white", width=50, height=20, font="Arial 10")
zettel.pack()
zettel.insert("1.0", volltext)
zettel.tag_config("fett", font=("Georgia", "10", "bold"))

root.mainloop()

 

Viel Spass mit Python

wünscht Ego

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 12 Stunden schrieb wiensschlechtester:

Sehe ich nicht so. Diese Problem muß doch über das Einlesen der Daten bereinigt werden.

 

Hallo Wiener,

 

sicherlich ist es ok, Gültigkeitsabfragen out zu sourcen (grässliches Deutsch), dann gibt es intern keinen Overhead.

 

vor 12 Stunden schrieb wiensschlechtester:

da hast Du mir mal einigen Ärger erspart, also geht die Suche nach einer einfachen Möglichkeit weiter.

 

Halt, Stopp!

 

Ich hatte doch schon mit grosser Mühe herausgefunden, dass "conda" die "kivy 1.10.1" lauffähig sortiert kriegt.

Weil ich das aber im Systemumfeld gestartet hatte , gab es Rückschritte beim Navigator und bei Spider.

Das muss man nicht so machen, die Installation gehört in ein virtuelles Umfeld.

 

Hätte ich mich nicht heute um Alberts tkinter-Problem gekümmert, wäre ich dort evtl schon weiter.

 

 

Gruss vom Ego

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Startfenster.gif.6b30b66562a9cf7350a9bcb96b01b222.gif

 

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 7 Stunden schrieb Dr. Manque:

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.

 

Hallo Albert,

 

das funktioniert hier auch, allerdings gibt es vorher in Zeile 83 ein Problem.

dirtext = ttk.Entry(win, width=40, textvariable=name) 

"name" ist bei Dir nicht initialisiert.

Ich hatte es ersetzt mit "D:\\", aber das verhindert nur den Fehler, hat aber sonst keine Auswirkung.

Ich vermute das Entry-Widget ignoriert diesen Parameter.

 

Interessanterweise kann ich in das Eingabefeld sowohl "D:\\Text" eingeben, als auch "d:\text" oder "d:\\\\\\\\\Text",

es wird immer das Text-Verzeichnis auf der D:\ Partition richtig gelesen.

 

Einfacher Backslash genügt also, jede Mehrzahl entfernt die aufgerufenene Methode kommentarlos.

 

vor 7 Stunden schrieb Dr. Manque:

Dann "Fill Combo" klicken. Da geht bei mir nichts.

 

Füge mal in die noch leere Zeile 58 print(str(txtfiles)) ein, ohne eine neue Zeile zu erzeugen.

Merkst Du was? Wie kann denn sowas wohl passiert sein???

 

Auf jeden Fall ist es höchst problematisch, mit Variablen ausserhalb ihres Geltungsbereichs zu hantieren.

Für Testzwecke mag es mal angehen, aber wenn Du so ein Feature öfter brauchst,

sollten wir eine eigene Combobox definieren, die sowas kann.

 

Bis dahin gibt es ein einfaches Workarround:

 

def click_FillPermFiles():
    dirname = dirtext.get()
    print('Dir=' + dirname)
    filesnames = []        # txtfiles war hier von Dir lokal erneut erzeugt worden, umbenannt...
    for filename in os.listdir(dirname):
        filenames.append(filename)
        print(filename)
    return(filenames)

# Nun gibt die Funktion eine Liste zurück und müsste nicht mehr click_XXX heissen.
# Der Aufruf über einen Button würde evtl sogar schief gehen.

# Stattdessen ruft die nächste Funktion click_FillPermFiles() gleich selbst auf:

def click_FillCombo():
    #global txtfiles       # Das kann jetzt entfallen
    global combo_1         # das leider noch nicht, das geht aber alles besser.

    combo_1['values'] = click_FillPermFiles()  # Die Combobox holt sich selbst die aktuellen Files aus dem Verzeichnis
 
# das habe ich alles noch nicht eingehackt, sondern nur hier ins Codefenster geschrieben.
# es kann also noch Überraschungen geben.

 

vor 7 Stunden schrieb Dr. Manque:

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.

 

Sicherlich, aber das obige ist erstmal wichtiger und ich habe Angst das Posting zu lang zu machen.

 

 

Gruss vom Ego

(nicht Egon)

 

bearbeitet von Egoist
Link zu diesem Kommentar
Auf anderen Seiten teilen

Nachdem Teil 1 dankenswerterweise von der Forensoft angenommen wurde, gehts jetzt weiter.

 

In meinem letzten Codebeispiel hatte ich folgende Passage:

e = Entry(frame1, width=20, bg="yellow")
e.bind("<Return>", set_in)
e.pack(side=LEFT)

e ist das Eingabe-Widget vom Typ "Entry"

frame1 das übrgeordnete Layoutelement

da das kein Gridlayout war, kam e.pack Methode zum Einsatz, um es in Erscheinung zu bringen.

 

e.bind ruft jedesmal wenn die Return-Taste dort gedrückt wird, die Funktion "set_in" auf (Achtung hier immer ohne Klammern!).

 

Schreiben wir nun eine neue, einfache Version der Funktion "set_in":

 

def set_in(event):
    print(e.get())

Falls gewünscht, kann man e.get() in einem String zwischenspeichern und den dann an eine Liste anhängen usw...

Die Angabe von "event" als Parameter soll nötig zu sein, auch wenn wir den nicht auswerten (Hörensagen).

 

 

Viel Spass mit Python

wünscht Euch Ego

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nachmal @Dr. Manque

 

In dieser Passage taucht der gleiche Fehler auf, den ich im ersten Posting angesprochen hatte:


# Eingabefeld für Permzahlen
PZahl = tk.StringVar()
ZahlEingabe = ttk.Entry(win, width=4, textvariable=PZahl)
ZahlEingabe.grid(column=1, row=2)

Da "textvariable=" weggeworfen wird, gibt es auch keinen Bezug zu Deinem Entry-Widget

 

Hier greifst Du in einer Funktion darauf zurück und wunderst Dich über den Output:

# Button Click Event Function
def click_me1():
    print(PZahl)
    # nur zum Test, funktioniert nicht!
    if label1.configure(foreground='red'):
        label1.configure(foreground='blue')
    elif label1.configure(foreground='blue'):
        label1.configure(foreground='red')  # label1.configure(text=name)
    pass

Scheinbar wird von tkinter durch Deine vorherige Deklaration eine Stringvariable geführt, die man auch im Namespace von Funktionen findet.

Wäre das nicht so, wäre sie hier undefiniert.

 

Ich bin auch noch selbst überrascht, dass man GUI-Widgets so einfach im Namensraum einer eigenen Funktion vorfindet.

Die scheinen allesamt zwangsglobalisiert zu sein ...

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 27.6.2018 um 02:34 schrieb Egoist:

Hallo Forscher!

 

Soweit ich bisher den Stand der Technik richtig erfasst habe, programmieren hier alle unter Excel, wenn sie schon eine Weile dabei sind.

Es hat sich in der Welt da draussen aber inzwischen eine Menge getan!

 

Alle Leute, die heute etwas auf sich zählen, kennen zumindest Python, oder nutzen bereits die eleganten Möglichkeiten dieser Sprache.

Ich will da nicht länger tatenlos zusehen und arbeite mich jetzt in das Fachgebiet ein.

 

Hat hier sonst noch jemand das Gefühl abgekoppelt zu sein?

Lasst es uns angehen...

 

 

Gruss vom Ego

 

da stellt sich mir die frage, braucht es python, um roulette mathematisch zu schlagen???

 

oder anders gesagt: wenn man mit excel im roulette auf kein plus kommt, soll es deshalb python richten??

 

oder wie??

 

Lexis

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Minute schrieb MarkP.:

da stellt sich mir die frage, braucht es python, um roulette mathematisch zu schlagen???

 

Moin Lexis,

 

natürlich braucht man weder Python noch Excel, um Roulette mathematisch in Bedrängnis zu bringen.

Ich brauche dazu nicht einmal Papier und Bleistift, obwohl solche Hilfsmittel noch erlaubt sind.

 

Die Vokabel "schlagen" würde ich in dem Zusammenhang nicht gern benutzen, denn es ist nur eine Optimierung der eigenen Möglichkeiten.

 

vor 1 Minute schrieb MarkP.:

oder anders gesagt: wenn man mit excel im roulette auf kein plus kommt, soll es deshalb python richten??

 

Das Konzept von Excel ist zwar bestechend (und ist von Miniweich damals geklaut worden), ist aber stark limitiert.

Sofern man auf das angeflanschte VBA ausweicht, wie z.B. @Dr. Manque, hat man zwar erweiterte Möglichkeiten,

diese sind aber trotzdem extrem begrenzt.

 

vor 1 Minute schrieb MarkP.:

oder wie??

 

Mit Python liegt einem sozusagen die aktuelle Welt zu Füssen, denn es gibt enorm viele Erweiterungen/Module für jeden Zweck.

Ich wage nicht einmal anzufangen zu umreissen, welchen Umfang das hat.

 

Aber ein paar Beispiele trotzdem:

 

  • Es gibt die öffentlich verfügbare OCV-Library, mit der man im Fluge Videodaten auswerten kann,
    Gesichtserkennung wäre da nur ein Stichwort.
    Damit ist es zB kein Problem eine Roulettekugel zu verfolgen nebst Rotor, um einen KG Algorithmus zu basteln.
  • Es gibt hochoptimierte Matrizenberechnungen, die Milliarden Coups zerknuspern können, als wären es Kartoffelchips.
    Excel macht schon bei einer Millionenperm mächtig die Backen dick.
  • Heutige KI-Anwendungen sind für Python ein Klacks, weil es auch dafür Module gibt.
    All das kann man sich oft mit wenigen Codezeilen zu Nutze machen.


Wer also halbwegs uptodate sein will, sollte Python können. Nicht mehr und nicht weniger, wollte ich mit diesem Thread transportieren.

 

Und falls es ein physikalisches OC geben sollte, bei dem man noch mindestens 5sec nach Abwurf setzen kann,

wäre ich für eine Info dankbar. Leider wäre das dann dort nicht mehr lange möglich...

 

 

Gruss vom Ego

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 10 Stunden schrieb Egoist:

 

Moin Lexis,

 

natürlich braucht man weder Python noch Excel, um Roulette mathematisch in Bedrängnis zu bringen.

Ich brauche dazu nicht einmal Papier und Bleistift, obwohl solche Hilfsmittel noch erlaubt sind.

 

Die Vokabel "schlagen" würde ich in dem Zusammenhang nicht gern benutzen, denn es ist nur eine Optimierung der eigenen Möglichkeiten.

 

 

Das Konzept von Excel ist zwar bestechend (und ist von Miniweich damals geklaut worden), ist aber stark limitiert.

Sofern man auf das angeflanschte VBA ausweicht, wie z.B. @Dr. Manque, hat man zwar erweiterte Möglichkeiten,

diese sind aber trotzdem extrem begrenzt.

 

 

Mit Python liegt einem sozusagen die aktuelle Welt zu Füssen, denn es gibt enorm viele Erweiterungen/Module für jeden Zweck.

Ich wage nicht einmal anzufangen zu umreissen, welchen Umfang das hat.

 

Aber ein paar Beispiele trotzdem:

 

  • Es gibt die öffentlich verfügbare OCV-Library, mit der man im Fluge Videodaten auswerten kann,
    Gesichtserkennung wäre da nur ein Stichwort.
    Damit ist es zB kein Problem eine Roulettekugel zu verfolgen nebst Rotor, um einen KG Algorithmus zu basteln.
  • Es gibt hochoptimierte Matrizenberechnungen, die Milliarden Coups zerknuspern können, als wären es Kartoffelchips.
    Excel macht schon bei einer Millionenperm mächtig die Backen dick.
  • Heutige KI-Anwendungen sind für Python ein Klacks, weil es auch dafür Module gibt.
    All das kann man sich oft mit wenigen Codezeilen zu Nutze machen.


Wer also halbwegs uptodate sein will, sollte Python können. Nicht mehr und nicht weniger, wollte ich mit diesem Thread transportieren.

 

Und falls es ein physikalisches OC geben sollte, bei dem man noch mindestens 5sec nach Abwurf setzen kann,

wäre ich für eine Info dankbar. Leider wäre das dann dort nicht mehr lange möglich...

 

 

Gruss vom Ego

 

OK, danke fr

 

 

:ooh6::angry:

 

Zwei mal AW geschrieben, zweimal konnte ich es nicht veröffentlichen, speichern ..... Kotz

 

Lexis

bearbeitet von MarkP.
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...