OOP Frage zu Klassen und Toplevel

Code-Stücke können hier veröffentlicht werden.
Antworten
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

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!
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Und ich hätte die *-Importe sein lassen. Siehe [wiki]Import[/wiki] und die vielen Threads zu diesem Thema im Forum hier.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Sorry wenn es jetzt mal gemeckere aufgefast wird, so ist es aber nicht gemeint :)

Warum benutzt ihr Sternimporte?

Code: Alles auswählen

from Tkinter import * 
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...

Code: Alles auswählen

import Tkinter as tk


...dann könnt ihr tk.Frame schreiben. die 3 Zeichen bringen ja keinen um.

lg
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

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!
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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.
Zuletzt geändert von sape am Mittwoch 31. Januar 2007, 21:03, insgesamt 1-mal geändert.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

@ sape
du solltest lieber drüber nach denken was du so schreibst. Wird langsam echt lolig mit Dir
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

@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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Das hängt aber von der Reihenfolge ab.

Überschreibt Image von Tkinter:

Code: Alles auswählen

from Tkinter import *
form PIL import Image
Überschreibt Image von PIL:

Code: Alles auswählen

form PIL import Image
from Tkinter import *
Aber ob nun PIL Image von Tkinter überschriebt oder umgekehrt ist ja eigentlich auch egal. Führt beides zu Problemen.

lg
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Zu erst mal Danke.

Von der *-Problematik habe ich auch schon gelesen, nur noch nicht viele Gegenargumente gesehen. Aber das mit PIL :shock:

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Andy hat geschrieben:Woher stammt Frame?
Willkommen in der *-Problematik. Ein tk.Frame wuerde sofort zeigen, das Frame eine Tkinter-Klasse ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

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?
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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.
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

@all

Ok, Danke. Damit werde ich mich noch ein wenig befassen müssen.

Gruss Andy
Antworten