Class...

Fragen zu Tkinter.
Antworten
Vos
User
Beiträge: 40
Registriert: Freitag 24. März 2006, 13:37

Morgen!
Ich hab ein problem mit einer klasse! Bin seit 3 Tagen damit dran aber ich bekomst nich hin... alles ausprobiert!

Mein problem:
Ich hab 2 .py! (Control.py/test.py)
Control.py is das "Hauptprogramm" Dort hab ich Buttons ect drin stehen.
Jetzt wollte ich die def auslagern. Und mit klassen arbeiten!
Also schreib ich in:

Control.py

Code: Alles auswählen

import test
test.exit()
test.py

Code: Alles auswählen

from Tkinter import *
class test:
	def exit():
		import sys
		sys.exit()
Aber es will nich! Wenn ich auf denn Button klicke passiert nichts. Ich hab auch schon mit print "..." getestet obs am button liegt! Aber das funktioniert!

Ich weiß das man für diese funktion besser sofort import sys ect benutzten kann! Aber das ist nur ein test und ich möchte drauf aufbauen!
Danke schonmal für antworten
<edit>
ich war heut morgen wohl noch nich wach... und die letzten tage auch nicht!! Das ärgert mich... es muss ja auch
Control.py

Code: Alles auswählen

import test
test.test()
heißen da ich ja nich die def angeben draf!
Mal schauen ob es klappt...
aber es will nich :(
</edit>
grüße
Zuletzt geändert von Vos am Sonntag 16. April 2006, 09:10, insgesamt 1-mal geändert.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Poste bitte die echte Fehlermeldung; der Code ist zu kurz "abstrahiert" und enthält in seiner momentanen Form zu viele Fehler als dass man sagen könnte was genau falsch ist.
--- Heiko.
Vos
User
Beiträge: 40
Registriert: Freitag 24. März 2006, 13:37

okay ihr mal das ganze program... es ist eigendlich komplet nur zur übung! Wusste nicht was ich schreiben sollte is mir sowas eingefallen!

Ich würd mich freuen wenn ihr auch andere fehler berichtigt!

Code: Alles auswählen

from Tkinter import *
def evAntwort():
	import sys, os, time
	user = eHello.get()
	control = file(r"D:\Control\control.txt", "a+")
	if  user == "Christian":
		import test
		test.exit()
	elif user	== "Heinz":
		zeit=time.strftime("%X")
		control.write( user + "		" + zeit +"\n" )
		control.flush()
		control.close()
		#Bis hier wird Name und Zeit in control.txt abgespeichert!
		Werner.delete("1.0",END)
		Werner.insert("1.0","Hi Heinz. Willst du ins Internet oder zur Musik?")
		#Werner Sag ...
		fButtons = Frame(F, border=1)
		bInternet = Button(fButtons, text="Internet",width=8, height=1, command=evInternet)
		bInternet.pack(side="top", padx=6, pady=6)
		fButtons.pack(side="top", expand="true")
		#Internet Button
		fButtons = Frame(F, border=1)
		bMusik = Button(fButtons, text="Musik",width=8, height=1, command=evMusik)
		bMusik.pack(side="top", padx=6, pady=6)
		fButtons.pack(side="top", expand="true")
		#Musik Button
		fButtons = Frame(F, border=1)
		bEnde = Button(fButtons, text="Ende",width=8, height=1, command=evEnde)
		bEnde.pack(side="top", padx=6, pady=6)
		fButtons.pack(side="top", expand="true")
		#Ende Button
	elif user == "Silke":
		zeit=time.strftime("%X")
		control.write( user + "		" + zeit +"\n" )
		control.flush()
		control.close()
		#Bis hier wird Name und Zeit in control.txt abgespeichert!
		Werner.delete("1.0",END)
		Werner.insert("1.0","Hi Silke du hast keine Erlaubnis oder haste Christian gefragt?")
	else:
		zeit=time.strftime("%X")
		control.write(user + "		" + zeit +"\n")
		control.flush()
		control.close()
		#Bis hier wird Name und Zeit in control.txt abgespeichert!
		Werner.delete("1.0",END)
		Werner.insert("1.0","Hallo %s!Was machst du den an meinem PC? Hast du mich auch gefragt?" % (user))
def evInternet():
	import os,sys
	os.system("D:\Control\Batch\Internet.bat")
	sys.exit()
def evMusik():
	import os,sys
	os.system("D:\Control\Batch\Musik.bat")
	sys.exit()
def evEnde():
	import sys
	sys.exit()


top = Tk()
top.wm_geometry("1000x650")
top.title("Werner")

F = Frame(top)
F.pack(expand="true")

Werner = Text(F, border=1, height=3,width=30)
Werner.pack(side="top", expand="true")
Werner.insert("2.end", "Hi ich bin Werner sag mir nochmal bitte schnell deinen Namen!")

fEntry = Frame(F, border="1", width=30)
eHello = Entry(fEntry)
fEntry.pack(side="right", padx=6, pady=3, expand="true")
eHello.pack(side="left", expand="true")

fButtons = Frame(F, border=1)
bSagen = Button(fButtons, text="Sagen",width=8, height=1, command=evAntwort)
bSagen.pack(side="left", padx=6, pady=6)
fButtons.pack(side="top", expand="true")
#Internet Button
fButtons = Frame(F, border=1)
bInternet = Button(fButtons, text="Internet",width=8, height=1, command=evInternet)
bInternet.pack(side="top", padx=6, pady=6)
fButtons.pack(side="top", expand="true")
#Musik Button
fButtons = Frame(F, border=1)
bMusik = Button(fButtons, text="Musik",width=8, height=1, command=evMusik)
bMusik.pack(side="top", padx=6, pady=6)
fButtons.pack(side="top", expand="true")
#Ende Button
fButtons = Frame(F, border=1)
bEnde = Button(fButtons, text="Ende",width=8, height=1, command=evEnde)
bEnde.pack(side="top", padx=6, pady=6)
fButtons.pack(side="top", expand="true")


F.mainloop()
und

Code: Alles auswählen

from Tkinter import *
class exit:
	def test():
		import sys
		sys.exit()
Danke für alle antworten die ich bekomme :)

Grüße
Benutzeravatar
Kolazomai
User
Beiträge: 33
Registriert: Donnerstag 16. Februar 2006, 15:05
Kontaktdaten:

Hi,

vielleicht sys.exit(<nummer>) ? Wenn du es mit einer IDE , z.B. IDLE-Python ausführst, beendet er bei sys.exit(<int>) meistens nicht, sondern gibt einen Fehler aus. Der Integer in den Klammern steht dafür, mit welchem "Status" dein Programm beendet wird. Man kann den Status des beendeten Programms meistens via "echo $?" abrufen und weiss, ob es einen Fehler gab. Unter Linux bedeutet 0 erfolgreich und alles andere , dass es einen Fehler gab.

Ausserdem sollten die Pfade nicht funktionieren:
Du müsstest "D:\\Control\\Batch\\Internet.bat" schreiben oder ( wies mir lieber ist ) linux-like D:/Control/Batch/Internet.bat. Am besten auch nicht os.system("D:\\Control\\Batch\\Internet.bat") sondern os.startfile("D:\\Control\\Batch\\Internet.bat").

Mfg,

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

Vos hat geschrieben:Ich hab ein problem mit einer klasse! Bin seit 3 Tagen damit dran
Hi Vos!

Ein paar Kleinigkeiten:

1. Überschreibe keine Schlüsselwörter oder Funktionsnamen, wenn du es nicht explizit bezweckst.

Damit meine ich solche Wörter wie zum Beispiel "exit". Weiters solltest du auch keine Wörter wie "test" verwenden, da es sein kann, dass diese schon anderweitig belegt sind. Bei Zope zum Beispiel.

2. Klassenmethoden müssen mindestens einen Parameter akzeptieren. Diesen nennt man im Normalfall "self" und enthält die Referenz zur Klasseninstanz.

3. Man sollte an die Funktion "sys.exit()" 1 oder 0 als Argument übergeben. Z.B. "sys.exit(0)", um dem aufrufenden Programm den Erfolg des Aufrufes mitzuteilen.

Hier ein Beispiel, das so funktionieren sollte. Allerdings sollte man kein GUI-Programm (z.B. Tkinter) mit sys.exit(0) abbrechen müssen. Es sollte genügen, alle Fenster zu schließen.

a.py:

Code: Alles auswählen

class Testklasse:
    def beenden(self):
        import sys
        sys.exit(0)
b.py:

Code: Alles auswählen

from a import Testklasse
Testklasse.beenden()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

gerold hat geschrieben:Ein paar Kleinigkeiten:
Einen Punkt hätte ich fast vergessen:
4. Wenn du gerade erst anfängst, mit Tkinter zu programmieren, dann ist es jetzt noch gerade rechzeitig -->

Verwende **nicht**

Code: Alles auswählen

from Tkinter import *
Egal was in manchen Büchern steht. Tu es nicht.
Verwende stattdessen

Code: Alles auswählen

import Tkinter as tk
um dir den Namensraum nicht zuzumüllen und um dich davor zu bewahren, Tkinter-Schlüsselwörter/-Funktionen unabsichtlich zu überschreiben.

Du musst dann natürlich vor jedes Tkinter-Schlüsselwort "tk." setzen. Das ist es aber auf jeden Fall Wert.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Vos hat geschrieben:

Code: Alles auswählen

from Tkinter import *
class exit:
	def test():
		import sys
		sys.exit()
Warum brauchst Du hier überhaupt eine Klasse? Definier Dir einfach eine Funktion, die das gewünschte tut.
Vos
User
Beiträge: 40
Registriert: Freitag 24. März 2006, 13:37

Sorry das ich nochmal störe...
ich habs damals aufgegeben hab mich aber nochmal drangestetzt.

Datei "Klassen.py"

Code: Alles auswählen

class anlegen:
	def fenster(self):
		print "ok"
Datei "Start.py"

Code: Alles auswählen

from Tkinter import*
from ScrolledText import*
from Klassen import anlegen
top = Tk()
top.wm_geometry("650x350")
top.title("Werner")

F = Frame(top)
F.pack(expand="true")

textfenster = ScrolledText(F,width=90)
textfenster.pack(side="right", expand="true")
def dxdsa():
	anlegen.fenster()
fButtons = Frame(F, border=1)
bAnlegen = Button(fButtons, text="Anlegen",width=8, height=1, command=dxdsa)
bAnlegen.pack(side="top", padx=6, pady=6)

bEnde = Button(fButtons, text="Ende",width=8, height=1, command=F.quit)
bEnde.pack(side="top", padx=6, pady=6)
fButtons.pack(side="top", expand="true")

F.mainloop()
Fehlermeldung nach den drücken auf Anlegen:
anlegen.fenster()
Type Error: unbound methode fenster() must be called with anlegen instance as first argument (got nothing instead)
Ich sag nochmal danke...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du musst erst eine Instanz der Klasse anlegen machen, also anlegen(). Achja, und Klassennamen bitte mit Großbuchstaben anfangen, also: Anlegen, statt anlegen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Vos
User
Beiträge: 40
Registriert: Freitag 24. März 2006, 13:37

Jo super jetzt hab ichs gerallt

verstanden = Anlegen()
verstanden.fenster()

... :lol:
Antworten