Seite 1 von 1
OOP Frage zu Klassen und Toplevel
Verfasst: Mittwoch 31. Januar 2007, 19:55
von Andy
Hallo Leute,
hab´s endlich geschaft mein Toplevel in eine eigene Klasse zu schreiben.
Meine Frage jedoch, ist dies so korrekt? (pythonisch usw.)
Oder sollte ich noch irgendwas abändern?
Code: Alles auswählen
from Tkinter import *
class Hauptfenster:
def __init__(self):
# Fenster 1 erstellen
self.fenster1= Tk()
self.Button_open = Button(self.fenster1, text='Ok', bg='green',
border="1",relief=RIDGE,
command=self.opentop2)
self.Button_open.pack(expand=TRUE, anchor=N)
self.fenster1.mainloop()
def opentop2(self):
# Oeffnet Fenster 2
oeffnen = Fenster2(self.fenster1)
class Fenster2:
def __init__(self,fenster1):
# Ein Toplevel 2 erstellen
self.fenster2= Toplevel(fenster1)
self.Label=Label(self.fenster2, text='ich bin ein Text',
width=10, height=2)
self.Label.pack(expand=TRUE, fill=BOTH, anchor=N)
pass
hauptfenster=Hauptfenster()
Danke schon mal!
Verfasst: Mittwoch 31. Januar 2007, 20:45
von pyStyler
Hi Andy,
ich finde es ist Dir doch schon gut gelungen.
Ich hätte es jedoch so gemacht.
Code: Alles auswählen
from Tkinter import *
class Hauptfenster(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.pack(expand=YES, fill=BOTH)
self.Button_open = Button(self,
text='Ok', bg='green',
border="1",relief=RIDGE,
command=self.opentop2)
self.Button_open.pack(expand=TRUE, anchor=N)
#self.fenster1.mainloop()
def opentop2(self):
# Oeffnet Fenster 2
oeffnen = Fenster2(self)
class Fenster2(Toplevel):
def __init__(self, master):
# Ein Toplevel 2 erstellen
Toplevel.__init__(self, master)
self.Label=Label(self ,text='ich bin ein Text',
width=10, height=2)
self.Label.pack(expand=TRUE, fill=BOTH, anchor=N)
self.grab_set()
self.focus_set()
self.wait_window()
def _main():
root = Tk()
app = Hauptfenster(root)
root.mainloop()
if __name__=='__main__':
_main()
nur noch eins, wenn Du etwas mit Toplevel programmierst,
würde ich wie du oben sehen, kannst von Toplevel ableiten
Gruss
pyStyler
Verfasst: Mittwoch 31. Januar 2007, 20:56
von Leonidas
Und ich hätte die *-Importe sein lassen. Siehe [wiki]Import[/wiki] und die vielen Threads zu diesem Thema im Forum hier.
Verfasst: Mittwoch 31. Januar 2007, 20:57
von sape
Sorry wenn es jetzt mal gemeckere aufgefast wird, so ist es aber nicht gemeint
Warum benutzt ihr Sternimporte?
Das ist schlechter Stil und beist sich z.B. wenn ihr PIL importiert (from PIL import *), weil PIL dann ``Image`` von Tkinter überschreibt.
Aus dem ``Tkinter``-Module. Ab Zeile 3203.
Code: Alles auswählen
class Image:
"""Base class for images."""
_last_id = 0
def __init__(self, imgtype, name=None, cnf={}, master=None, **kw):
self.name = None
[...]
Nutzt doch stattdessen...
...dann könnt ihr tk.Frame schreiben. die 3 Zeichen bringen ja keinen um.
lg
Verfasst: Mittwoch 31. Januar 2007, 21:00
von pyStyler
Leonidas hat geschrieben:Und ich hätte die *-Importe sein lassen. Siehe [wiki]Import[/wiki] und die vielen Threads zu diesem Thema im Forum hier.
Guter versuch, jedoch nicht mit mir!
Verfasst: Mittwoch 31. Januar 2007, 21:02
von sape
pyStyler hat geschrieben:Leonidas hat geschrieben:Und ich hätte die *-Importe sein lassen. Siehe [wiki]Import[/wiki] und die vielen Threads zu diesem Thema im Forum hier.
Guter versuch, jedoch nicht mit mir!
Hallo? Hast du den Link zum Wiki gelesen und meinen Post? Da stehen doch genug Information die gegen *-Importe Sprechen.
Verfasst: Mittwoch 31. Januar 2007, 21:03
von pyStyler
@ sape
du solltest lieber drüber nach denken was du so schreibst. Wird langsam echt lolig mit Dir
Verfasst: Mittwoch 31. Januar 2007, 21:06
von sape
pyStyler hat geschrieben:@ sape
du solltest lieber drüber nach denken was du so schreibst. Wird langsam echt lolig mit Dir
In wiefern? Was stimmt den an dem Post nicht?
Verfasst: Mittwoch 31. Januar 2007, 21:11
von Leonidas
pyStyler hat geschrieben:Leonidas hat geschrieben:Und ich hätte die *-Importe sein lassen. Siehe [wiki]Import[/wiki] und die vielen Threads zu diesem Thema im Forum hier.
Guter versuch, jedoch nicht mit mir!
Warum nicht? Ich bitte um Argumente, die für das unnötige Füllen des Namensraumes sprechen.
Verfasst: Mittwoch 31. Januar 2007, 21:12
von sape
@pyStyler: Also um das mal klar zu stellen: Wenn dich dieser Post
http://www.python-forum.de/post-57285.html#57285 in irgendeiner Form beleidigt hat dann tut es mir leid.
Falls du mit Kritik und gut gemeinten Ratschlägen nicht umgehen kannst, dann bist du hier fehl am Platz.
Außerdem bitte ich um eine Antwort auf die Frage von mir.
Verfasst: Mittwoch 31. Januar 2007, 21:19
von Leonidas
sape hat geschrieben:beist sich z.B. wenn ihr PIL importiert (from PIL import *), weil PIL dann ``Image`` von Tkinter überschreibt.
Hmm, wenn ich mich recht erinnere war das Problem meist eher, das PIL mit ``import Image`` geladen wird und dann Tkinter per *-Import reingezogen wurde. Dabei überschreibt es das Image von PIL und fertig ist die Verwirrung.
Verfasst: Mittwoch 31. Januar 2007, 21:24
von sape
Das hängt aber von der Reihenfolge ab.
Überschreibt Image von Tkinter:
Überschreibt Image von PIL:
Aber ob nun PIL Image von Tkinter überschriebt oder umgekehrt ist ja eigentlich auch egal. Führt beides zu Problemen.
lg
Verfasst: Mittwoch 31. Januar 2007, 21:26
von gerold
Hi!
Ich möchte hiermit den Rücken von sape stärken. Sternimporte verschlechtern die Lesbarkeit eines Programmes enorm. -- Woher will ich später mal wissen, von welchem Modul was gekommen ist? --
Noch schwieriger wird es für Anfänger, die sowiso noch nicht wissen, welche Funktionen in Python eingebaut sind und welche von irgendeinem mit * importierten Modul kommen.
Es gibt natürlich Außnahmen, in denen ein Sternimport sinnvoll sein kann. Bei TkInter ist das aber sicher nicht der Falll.
Das Schlimmste ist, dass in vielen Tutorials und sogar Büchern mit Sternimporten viel zu locker umgegangen wird. Das Nachsehen haben dann die Programmierer, die den Code später lesen sollen und (einfach so) wissen sollen, was an jeder Stelle im Code passiert. Bei Sternimporten wird das ein Hin- und Herschalten zwischen den einzelnen Python-Modulen und viel suchen.
mfg
Gerold

Verfasst: Mittwoch 31. Januar 2007, 21:28
von Leonidas
sape hat geschrieben:Aber ob nun PIL Image von Tkinter überschriebt oder umgekehrt ist ja eigentlich auch egal. Führt beides zu Problemen.
Natürlich - aber in diesem Forum gab es mal eine Zeit, wo eben dervon mir beschriebene Fall an der Tagesordnung war. So wird PILs Image häufiger gebraucht als Tkinter.Image und daher auch die Verwirrung, warum die PIL-Dokumentation nicht mit dem vorliegenden ``Image`` übereinstimmte.
Verfasst: Mittwoch 31. Januar 2007, 21:40
von Andy
Zu erst mal Danke.
Von der *-Problematik habe ich auch schon gelesen, nur noch nicht viele Gegenargumente gesehen. Aber das mit PIL
Gut, ein paar Fragen hätte ich da doch noch...
class Hauptfenster(Frame):
def __init__(self, master):
Frame.__init__(self, master)
Was in Klammern groß geschrieben ist, ist eine vererbte Klasse.
Woher stammt Frame? Und was macht es?
self.pack(expand=YES, fill=BOTH)
Was wird hier gepackt ? Frame!?
def _main():
root = Tk()
app = Hauptfenster(root)
root.mainloop()
if __name__=='__main__':
_main()
Mit app wird wohl festgelegt, welches die Oberklasse ist, oder?
Ich hatte ja schon richtig mainloop() nur ein einziges Mal verwendet.
Warum ist es denn eigentlich nicht ratsam es öfters anzuwenden?
Gruss Andy
Verfasst: Mittwoch 31. Januar 2007, 21:52
von Leonidas
Andy hat geschrieben:Woher stammt Frame?
Willkommen in der *-Problematik. Ein tk.Frame wuerde sofort zeigen, das Frame eine Tkinter-Klasse ist.
Verfasst: Mittwoch 31. Januar 2007, 22:08
von Andy
Willkommen in der *-Problematik. Ein tk.Frame wuerde sofort zeigen, das Frame eine Tkinter-Klasse ist.
Naja, das Frame ein widget oder ein Rahmen ist, ist mir klar. Danke.
Bloß was macht es in dem Skript? Kann ich wirklich aus dem Tkinter-Modul, Frame vererben?
Verfasst: Mittwoch 31. Januar 2007, 22:08
von sape
Und wenn man sich ein wenig Tipparbeit ersparen möchte (oder wegen anderen Gründen) kann man das ``form MODUL import NAME`` statment nutzen wie es z.B: häufig bei Pocoo genutzt wird
http://trac.pocoo.org/browser/pocoo/tru ... order=name
Code: Alles auswählen
from pocoo import Component
from pocoo.http import Request, Response, DirectResponse, \
PageNotFound, PageMoved
from pocoo.utils.debug import dtk
Da weißt man dann auch woher was kommt

Finde die Methode gut und verwende es auch häufiger.
lg
Verfasst: Mittwoch 31. Januar 2007, 22:10
von sape
Andy hat geschrieben:Kann ich wirklich aus dem Tkinter-Modul, Frame vererben?
Ja. Alle Namen die mit einen großen Buchstaben beginnen sind immer Klassen. OK, es gibt auch schlechte Beispiel die sich hinwegsetzen und auch Funktionen, etc mit Großen Buchstabe beginnen lassen. (Z.B. wxPython). (EDIT: Nur damit kein Missverständnis aufkommt: Alle Namen die nur aus großen Buchstaben bestehe sind "Konstanten"!)
EDIT:
Aber die Dokumentation bietet immer Information welcher Name den nun was ist.
Verfasst: Mittwoch 31. Januar 2007, 22:15
von Andy
@all
Ok, Danke. Damit werde ich mich noch ein wenig befassen müssen.
Gruss Andy