tkinter - Eltern - Kind - Status

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,

arbeite schon einige Jahre mit tkinter.
Das mit:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# For Python3.x

import tkinter as tk

class DataSet(object):
    def __init__(self):
        self.my_win = tk.Tk()
        ....... 
Nach dem tk-Status, erhält jedes danach weiter geöffnete Fenster, den Status top.

Ich frage mich, ob es nicht möglich ist, innerhalb eines laufenden Programms, über ein externes Modul das Master-Modul abzufragen (ich denke da evtl. an parent), ob tkinter im Master-Modul importiert und dadurch evtl. ob ein tkinter-Status vorliegt?

Da ich durch meine schlechten Englischkenntnisse, nicht in den Bereich vorgedrungen bin, mir aber vorstellen könnte, dass es so etwas gibt, würde ich mich über Euren Input freuen!

Grüße Nobuddy
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe nicht den Hauch einer Ahnung was du uns sagen willst. Da musst du nochmal etwas weiter ausholen.
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Beispiel:
Programm (Master-Modul) wird gestartet und ein Fenster (Tk-Status) wird geöffnet.
Ein weiteres Modul, wird durch einen Job des Master-Modul angesprochen, alles wird per parent an das Modul übergeben. Dieses Modul wird als nächstes, ein Fenster öffnen.

Kann ich durch die Übergabe von parent, herausfinden ob tkinter importiert ist und wenn ja, ob sich der tkinter-Status (Tk, Toplevel) anzeigen lässt?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nicht wirklich verstaendlicher. Kannst du ein minimales Beispiel bauen, das dein Problem illustriert?
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Mach ich, muss dies aber auf morgen verschieben ...

Grüße Nobuddy
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Moin,

Beispiel 1 :

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# For Python3.x

import tkinter as tk
from DataSet import DataSet

class Master(object):
    def __init__(self):
        self.my_win = tk.Tk()
        .......
        for row in liste:
            self.dataset = row
            DataSet(self)
        .......

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# For Python3.x

import tkinter as tk

class DataSet(object):
    def __init__(self, parent):
        try:
            # tk state in parent.
            parent.my_win.__class__.__name__
            self.my_win = tk.Toplevel()
        except AttributeError:
            # No tk Attribute.
            self.my_win = tk.Tk()
        .......
        dataset = parent.dataset
        .......
###################################
Beispiel 2:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# For Python3.x

import tkinter as tk
from DataSet import DataSet

class Master(object):
    def __init__(self):
        .......
        for row in liste:
            self.dataset = row
            DataSet(self)
        .......

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# For Python3.x

import tkinter as tk

class DataSet(object):
    def __init__(self, parent):
        try:
            # tkinter in parent imported.
            parent.__if_tkinter_import__    # ???
            self.my_win = tk.Toplevel()
        except AttributeError:
            # No tk Attribute.
            self.my_win = tk.Tk()
        .......
        dataset = parent.dataset
        .......
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Module schreibt man wie Variablennamen komplett klein. Eine Datei pro Klasse macht man nicht, solange es also keinen gute Trennlinie gibt, und die Dateien nicht zu lange werden, schreibt man alles in die selbe Pythondatei.

Das my bei my_win ist unsinnig. In einer Schleife ein Attribut zu belegen, ist unsinnig, da das ja bei jedem Schleifendurchgang wieder überschrieben wird. DataSet wird zwar erzeugt, aber gleich wieder weggeschmissen. Das macht keinen Sinn.
Irgendwelche Magie, um zu entscheiden ob es ein TopLevel oder ein Tk-Instanz sein soll, ist die schlechteste aller Lösungen. DataSet hat ja immer ein parent-Argument, also immer ein übergeordnetes Fenster?
Warum brauchst Du das überhaupt?
Normalerweise ist doch klar, was das Hauptfenster ist und was Unterfenster sind. Für mich fühlt sich das so an, als ob Du noch keine klare Einteilung Deiner GUI hast.
Beschreib doch mal genau, was Du vorhast zu tun. Irgendwelche Codefragmente, die keinen Sinn machen, helfen da nur bedingt.
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Die Beispiele, sollten eigentlich etwas anderes klar machen.
Sie sollen schemastisch eigentlich nur das wesentliche zeigen.

Ich sehe momentan 'self.my_win' nicht als Unsinn, da ich ja über 'parent.my_win' abfragen kann, ob das auftraggebende Modul eine tkinter Instanz hat oder nicht. Schließlich kommt es doch darauf an, das richtige Attribut (Tk, Toplevel) zu übergeben.

Die Übergabe von parent und das weiter arbeiten damit, hat sich bei mir bewährt.

Dieser Schleifendurchgang, soll nichts anderes zeigen als dass Datensätze aus einer Liste, in DataSet ausgegeben werden. Ob nur als visuelle Ausgabe oder ob Datensätze in DataSet bearbeitet werden, spielt hier letzlich keine Rolle.

Wie DataSet, habe ich weitere externe python-Module, die jedem anderen python-Modul zu Verfügung stehen. Ich bin kein Programmierexperte, aber das ist für mich ein modularer Aufbau, oder liege ich da falsch?

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# For Python3.x

import tkinter as tk
from DataSet import DataSet

class Master(object):
    def __init__(self):
        .......
    def mach_was(self):
        for row in liste:
            self.dataset = row
            DataSet(self)
Welche Möglichkeiten habe ich außer 'self.my_win' eine tkinter-Instanz bei DataSet aus parent festzustellen?
Gibt es eine Möglichkeit in DataSet, ob tkinter in Master importiert wurde?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Warum willst du das feststellen? Was ist da der Unterschied, was geht nicht? Und wenn du das willst, warum uebergibst du das nicht einfach von aussen, als extra Parameter? Wofuer auch immer das nun gut sein soll. Ich behaupte mal, es ist nicht gut, denn es bedeutet, das du Code schreibst, der in der DataSet-Klasse zu intime Kenntnisse von Code aussen drumrum hat. Sowas macht man nicht, weil es fragil ist.
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Meinst Du damit eine Sicherheitslücke?

Klar, was auch üblich ist, dass man die notwendigen Infos, an eine Funktion oder Klasse mit gibt, um weitere Schritte folgen lassen zu können.

In Klassen, bewerkstelligt man das ja durch self. Wird tkinter importiert und eine Tk-Instanz eröffnet, ist diese doch mit self verankert.

Auch wenn Du Dich jetzt über Sinn und Zweck der nachfolgenden Frage fragst:
Gibt es eine Möglichkeit, von einem anderen Modul aus zu erkennen, ob bei dem auftraggebenden JobModul tkinter importiert ist, außer durch eine Adressierung über parent?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mit Sicherheit hat das nichts zu tun, es geht darum, das man Dinge aneinander koppelt, die nicht aneinender gekoppelt sein sollten. Und sich damit schnell Fehler einfaengt.

Und auch wenn ich nicht denke, dass du wirklich brauchst oder willst, was du da fragst: nein, die gibt es nicht ueber eine "adressierung ueber parent'.
Antworten