Seite 1 von 1
tkinter - Eltern - Kind - Status
Verfasst: Samstag 20. Juni 2020, 14:08
von Nobuddy
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
Re: tkinter - Eltern - Kind - Status
Verfasst: Samstag 20. Juni 2020, 14:51
von __deets__
Ich habe nicht den Hauch einer Ahnung was du uns sagen willst. Da musst du nochmal etwas weiter ausholen.
Re: tkinter - Eltern - Kind - Status
Verfasst: Samstag 20. Juni 2020, 16:00
von Nobuddy
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?
Re: tkinter - Eltern - Kind - Status
Verfasst: Samstag 20. Juni 2020, 16:02
von __deets__
Nicht wirklich verstaendlicher. Kannst du ein minimales Beispiel bauen, das dein Problem illustriert?
Re: tkinter - Eltern - Kind - Status
Verfasst: Samstag 20. Juni 2020, 16:20
von Nobuddy
Mach ich, muss dies aber auf morgen verschieben ...
Grüße Nobuddy
Re: tkinter - Eltern - Kind - Status
Verfasst: Sonntag 21. Juni 2020, 10:54
von Nobuddy
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
.......
Re: tkinter - Eltern - Kind - Status
Verfasst: Sonntag 21. Juni 2020, 11:12
von Sirius3
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.
Re: tkinter - Eltern - Kind - Status
Verfasst: Sonntag 21. Juni 2020, 12:37
von Nobuddy
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?
Re: tkinter - Eltern - Kind - Status
Verfasst: Sonntag 21. Juni 2020, 12:54
von __deets__
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.
Re: tkinter - Eltern - Kind - Status
Verfasst: Sonntag 21. Juni 2020, 14:44
von Nobuddy
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?
Re: tkinter - Eltern - Kind - Status
Verfasst: Sonntag 21. Juni 2020, 16:19
von __deets__
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'.