Alfons Mittelmeyer's Wundersame Welt

Fragen zu Tkinter.
BlackJack

@Alfons Mittelmeyer: Das ist keine weisse Magie sondern der vorgesehene Weg während Dein Vorgehen ein Irrweg ist. Das sagt Dir nicht *ein* Grossinquisitor sondern mehrere erfahrene Python-Programmierer. Auf einem mittelalterlichen Kreuzzug scheinst eher Du Dich zu befinden.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@BlackJack Ich zwinge keinen Menschen, irgend etwas zu benutzen, was er nicht will. Hier dagegen scheint man gerne andere zu irgendwelchem Blödsinn zwingen zu wollen, wie etwa, dass man statt filexec zu verwenden, importieren muss, Mein Grundsatz ist der Gleichbehandlungsgrundsatz, also dass wenn jemand etwas für eine Funktion a fordert dasselbe auch für eine Funktion b gelten muss. Und wenn bei 'fileexec' importiert werden muss, dann muss dasselbe auch für 'readline' gelten. Also beim Lesen von Zeilen aus einem ASCII File sollten da die Zeilen als Module implementiert werden. Da sollte man eben mal darüber nachdenken, ob man eine Special Edition 'Python for Trolls' herausgeben sollte.
BlackJack

@Alfons Mittelmeyer: Man muss importieren wenn importieren der offensichtliche Weg ist und das ist er nun mal auch wenn Du das nicht wahrhaben willst. Der ”Gleichbehandlungsgrundsatz” verfängt nicht, weil es wenn es mehrere Wege gibt „pythonisch“ ist zu fragen welches denn der offensichtliche ist, und dann nur den zu verwenden. Das ist nicht immer eindeutig welcher Weg offensichtlich ist, aber bei ``import`` versus `compile()` und `exec` ist es das.
Also beim Lesen von Zeilen aus einem ASCII File sollten da die Zeilen als Module implementiert werden.
Äh, was? Entweder bist Du auf Drogen oder Du hast mal wieder Begriffe verquer umdefiniert ohne jemandem was davon zu verraten.

Wir brauchen kein Python für Trolle, sondern weniger Trolle — also Dich nicht wirklich.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@BlackJack Mir ist die Lösung für das Problem eingefallen. Statt diesen Ausdruck mit read,compile und exec zu verwenden, mache ich eine Funktion daraus. Diese Funktion kommt in eine Modul für Funktionen zum Anpassen und wem es dann nicht gefällt, dass fileexec auf compile und exec Basis arbeitet, kann dann seine Version auf import Basis hineinschreiben.

Die andere Möglichkeit ist aber auch, dass jemand die Optionen, wie splitten der GUI in kleinere Teile und Verlinkung mittels LinkButton sowie LinkLabel nicht benutzt. Damit hat man dann nur ein Script, das man in sein Main Script kopieren kann oder auch importieren kann.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@BlackJack also im Prinzip würde das schon funktionieren:

Code: Alles auswählen

import imp

def file_exec(filename,globals=None,locals=None,module_counter = [0]):

    counter = module_counter[0]
    module_counter[0] += 1
    return imp.load_source('module_'+str(counter),filename)

file_exec("print_test.py")
file_exec("print_test.py")
file_exec("print_test.py")
Überlegen muss man sich aber noch, wie man dabei die Namespaces übergeben kann.

Also ungeklärte Frage: Wie kann man dabei den Namespace übergeben?
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Und so etwas ist auch noch zu bedenken:

Bild

So etwas hat 77 Frames mit je zwei Labels drin und einem Icon. Hinzu kommen noch zwei Callbackfunktion und zwar dreimal je für den Frame und je für die zwei Labels. Ungeschickt implementiert, könnte das dann über 500 mal Scriptladen sein. Das Fenster 20 mal herbeigeklickt ergäbe dann Zehntausend Module.

Und so etwas will man hier unbedingt haben?
BlackJack

@Alfons Mittelmeyer: Ich verstehe das Problem nicht und was „500 mal Skriptladen“ überhaupt bedeuten soll. Das ist exotisch und ja, anscheinend ungeschickt implementiert. Wenn man das auf normalem Weg löst, dann ist das einfach ein wenig Code in einem Modul das einmal importiert wird und jedes mal wenn der Benutzer das Fenster ”herbeiklickt” wird der Code darin ausgeführt um das Fenster anzuzeigen. Das ist der offensichtliche Weg das zu lösen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@Natürlich wäre 500 mal laden, nämlich für jeden Frame darin für jeden Label darin für jedes Icon usw sehr ungeschickt und bei mir ist das alles auch nur ein Script. Aber wenn man auch http:// links im Sinn hat, dann sollte man aus Erfahrung wissen, dass da bei manchen Seiten viel nachgeladen wird, und solche Fälle durchaus vorkommen könnten und zehntausend Module auch ganz schnell verbraten sein könnten und wofür? Nur für global definierten Garbage. Denn eine Seite verlassen bedeutet schlichtweg nur mehr Garbage.
BlackJack

@Alfons Mittelmeyer: Jetzt erfindest Du schon wieder Probleme die niemand hat. Zehntausend Module? Zeig mal!
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@BlackJack Natürlich hat man nicht schnell Zehntausend Module, die man benutzt aber ohne eine Modulgarbage Collector hat man die schnell, wenn man nämlich einfach für jeden Ladevorgang den Namenszähler für Module erhöht und alles jeweils immer wieder in ein neues Modul spielt.

Aber mir ist da schon eine Idee gekommen, nämlich ein Garbage Modul Collector. Immer wenn man entsprechende Widgets löscht wird dann auch das entsprechende Modul als Garbage markiert und zum neu Überschreiben freigegeben.

Damit könnte man das Problem lösen. Das mit dem Namespace geht auch. Man importiert nämlich nicht gleich, sondern schreibt zuerst einen Header mit dem Namespace, liest dann den Sript Inhalt dazu, schreibt das in eine temporäre Datei und die importiert man dann und löscht sie gleich wieder. Ist aufwändiger als gleich mit compile und exec aber durchaus machbar.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mind == "Blown"

BTW, der IMG-Tag scheint nicht zu funktionieren, oder ich raff's nicht.


Bild
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Alfons Mittelmeyer hat geschrieben:@Natürlich wäre 500 mal laden, nämlich für jeden Frame darin für jeden Label darin für jedes Icon usw sehr ungeschickt und bei mir ist das alles auch nur ein Script.
Das wäre nur dann 500 mal "laden", wenn man es dermaßen miserabel löst, wie Du es offenbar tust! BlackJack hat in seinem Post zuvor bereits grob geschildert, wie man das sinnvoller Weise (und eigentlich auch sehr offensichtlich) machen würde.

Wie wir schon so oft gesagt haben: Du suchst Lösungen für Probleme, die es eigentlich gar nicht gäbe, wenn Dein Ansatz nicht schon vergurkt wäre... und diese Lösungen befassen sich dann mit gruseligen Dingen, die ich gerne auch weiterhin als schwarze Magie anprangere! :twisted:

("Großinquisitor" wäre doch auch mal ein genialer Titel im Forum... wenn gebührte dieser aber BlackJack 8) )
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@Hyperion Was da vergurkt oder verkorkst ist, sind nur Deine verkorksten Ansichten. Kein vernünftiger Mensch kommt bei einem Webbrowser auf die hirnverbrannte Idee, dass dieser die Seiten, die man besucht, mit aller Gewalt als Module importieren müsste. Dein Gehirm ist so gegen compile und exec voreingenommen, dass Du meinst, das darf keineswegs sein und alles was mit compile und exec ausführfar ist, muss als Modul importiert werden.

Dagegen ist ein File, welcher Daten enthält, mit der entsprechend dafür vorgesehenen Ladefunktion zu laden. Und auch wenn zur Zeit meine Files noch nichts nichts anderes enthalten als etwas das auch importiert werden kann, ist keinesfalls zu erwarten, dass das in naher Zukunft so bleiben wird. Also werden meine Files auch Daten anderer Natur enthalten. Wenn sie sowohl andere Daten als auch Teile enthalten, die in Python ausführbar sind willst Du dass man sie dann nach ausführbaren Teilen durchsucht, die herausklaubt und damit irgendeinen import macht, der ohne den Rest nicht funktioniert, nur dass ja kein compile und exec erfolgt?

Was hast Du dagegen? Soll ich mein eigenes compile und exec programmieren, weil das von Python für Dich 'finstere Magie' ist? Irgendwie interpretieren muss ich ja meine Daten. Am Einfachsten ist doch, wenn Python das für mich tut.
BlackJack

@Alfons Mittelmeyer: Was hat denn jetzt schon wieder ein Webbrowser damit zu tun? Webseiten sind etwas anderes als Python-Module. Du denkst Dir schon wieder/immer noch ”Lösungen” für Probleme aus die keiner hat, insbesondere hat die niemand ausser Dir (und real nicht einmal Du selbsz) und trotzdem versuchst Du Deinen Unsinn in fremde Themen zu drücken. Mach für Dich was Du willst, aber hör auf den Schwachsinn anderen als sinnvollen und besseren Weg als den vorgesehenen andrehen zu wollen.

Deine Ansichten sind verkorkst, denn die werden hier offensichtlich von niemandem geteilt. Und auch kritisch betrachtet findet die keiner sinnvoll, nur falls Du jetzt wieder den Märtyrer rauskehren willst weil wir angeblich zu borniert sind uns mit Deinem Wundercode auseinanderzusetzen. Du nervst und trollst bloss. Dein Geblubber hat keinen praktischen Nutzen. Das frisst nur Zeit und führt potentiell Leute auf Irrwege.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

BlackJack hat geschrieben:@Alfons Mittelmeyer: Was hat denn jetzt schon wieder ein Webbrowser damit zu tun? Webseiten sind etwas anderes als Python-Module
Wie kommst Du jetzt auf Python Module. GUI Scripte sind keine Python Module, sie enthalten nur Daten zum Aufbau einer tkinter GUI genauso wie eine HTML Datei die Daten zum Aufbau einer HTML Seite enthält. Dass mir als Datenformat das von Python Sourcecode gefällt, weil es in Python einfach zu interpretrieren ist, ändert dabei nichts an der Sache.

Und auch Sourcecode sind nur Daten. Schließlich heißt es auch EDV - Elektronische Datenverarbeitung - alles sind Daten!!!

Und wenn das keiner kapieren will, dann schreibe ich in die Scripts eben XML Format rein. Und wenn etwas für Python Programmierer schön übersichtlich in einer Zeile stand und es dann in XML 20 Zeilen sind, dann ist das mir egal.

Hauptsache, dass man dann endlich kapiert, dass das kein Modul zum importieren ist. Anders geht es wohl nicht in diesem Kindergarten.
Schade, dass man dann das nicht mehr als Beispiele zum tkinter lernen benutzen kann. Denn tkinter will wohl niemand in XML programmieren.
Zuletzt geändert von Alfons Mittelmeyer am Samstag 7. November 2015, 21:50, insgesamt 1-mal geändert.
BlackJack

@Alfons Mittelmeyer: Und nochmal: Skripte sind Module.

Was Du als Datenformat benutzt hat auch wieder herzlich wenig damit zu tun was man normalerweise macht. Wenn Du diesen komischen Weg gehen willst, bitte, aber Du propagierst den ja als normal. Ist er aber nicht.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@BlackJack Werde mit bemühen ein normales Format zu benutzen. Hab heute schon darüber nachgedacht.

Code: Alles auswählen

# statt
a = x + 5

# wohl besser so
<statement>
    <variable>
        <name>a</name>
        <type>integer</type>
        <assignment>
            <name>=</name>
            <expression>
                <binary_operation>
                    <operator>+</operator>
                    <operand>
                        <reference_by_name>
                            <name>x</name>
                        </reference_by_name>
                    </operand>
                    <operand>
                        <integer>
                            <value>5</value>
                        </integer>
                    </operand>
                </binary_operation>
            </expression>
        </assignment>
    </variable>
</statement>
Spricht wohl viel dafür
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Verlässlicher Schutz gegen importieren.

Man kann etwa meinen GuiDesigner, der aus vielen Scrips besteht im GuiDesigner laden und dann als ein großes File mit etwa 3500 Zeilen abspeichern.
Nun könnte man meinen, man kann an den Beginn dieses Files einfach 'from DynTkInter import *' davorschreiben und dann könnte man es importieren.
Doch hat der GuiDesigner einen verlässlichen Importierschutz durch Zeilen wie diese:

Code: Alles auswählen

RefCont = [_Application]
Underscore Definitionen werden nicht aus DynTkInter importiert und damit verhindern solche Zeilen erfolgreich ein Importieren.
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alfons Mittelmeyer: wir haben's solangsam kapiert, dass Du ein Masochist bist und einen möglichst komplizierten, fehleranfälligen Weg suchst, wo es auch einfache Lösungen gäbe. Aber niemand außer Dir will das. Das Problem dabei ist, dass nicht jeder, der sich hier neu im Forum anmeldet, weiß, dass Alfons Mittelmeyer in seiner eigenen Welt lebt und man ihn am besten ignoriert. Vielleicht sollte man das Forum so einstellen, dass die Beiträge nur angezeigt werden, wenn man selbst schon mehr als 1000 eigene Beiträge geschrieben hat.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@Sirius3 Wer ist da masochistisch? Wer vertritt da so skurrile Ansichten, dass alles, was man importieren kann, man auch als Modul importieren muss.

Normalerweise hat man eine Software, die man in Module gliedert. Und nur, was zur Software gehört unf funktionelle Bestandteile sind, gehören sich als solche importiert. Nur weil man anstatt HTML zu verwenden, Seiten mit Hilfe von tkinter erstellt hat, wird hier gefordert, diese als funktionale Bestandteile eines tkinter Seiten Browsers als Module zu implementieren. Oder aber man muss HTML oder andere Programmiersprachen verwenden, aber bitteschön keinesfalls Python. Und wenn man dann HTML nimmt und auch Programmierung braucht, dann wohl Javascript und php und dem Anwender sagen, er muss einen Apache webserver mit php einrichten, damit er die Seiten ansehen kann.

Oder schreiben, dass man für tkinter ein XML Format nehmen soll, denn XML wäre ein normales Format, denn Qt benutzt ja auch ein solches. Der Unterschied ist nur, dass Qt ein solches versteht und daher XML für Qt normal ist, während es für tkinter keineswegs normal ist, weil tkinter es nicht versteht.

Ja, dann sollte man einfach ein solches implementieren, und wenn man es interpretieren oder parsen muss oder gar compilieren und einen eigenen Compiler dafür schreiben muss, aber um Himmelswillen ja den nicht von Python verwenden, denn dieser ist Teufelswerk, das man keinesfalls verwenden darf.

Da scheinen einige nicht alle Tassen im Schrank zu haben.
Antworten