hi leonidas,
Das liegt, so wie ich das sehe daran, dass bei dir self.root nicht definiert ist. Aber da kann self.root sonstwo stehen, ob in Konstruktor oder nicht, man kann auf self.root nicht zugreifen.
das ist mir klar, self.root muss entweder im konstruktor oder auch im klassenglobalen raum definiert werden.
(ich finde es sinnvoll anzuführen, wenn etwas schon klar ist, da ich glaube, dass der dialog effizienter wird)
zuerst mal vielen dank für die beispiele, da ist wieder viel cooles pythonzeug drin, das ich so nicht kannte, dazu aber später mehr, wenn du dann noch lust hast, grins
du kennst vielleicht diesen thread hier:
http://python.sandtner.org/viewtopic.php?t=3005
es stellte sich schlussendlich heraus: will ich diese lösung haben, dass das suchfenster als eigene klasse existiert, muss self.root auf jeden fall übergeben werden beim aufruf.
und das mit dem übergeben klappt offensichtlich nur, wenn self.root=Tk() erst im konstruktor von HauptFenster aufgerufen wird, der ersten nicht abstrakten klasse
früher stand self.root=Tk() auch im konstruktor von Fenster. der konstruktor von Fenster wurde immer zuerst ausgeführt, dann der Konstruktor der betreffenden klasse.
auch wenn es viel ist, doch mal den code, keine sorge, er ist eh gekürzt
Code: Alles auswählen
class Fenster:
#Abstand der Elemente
a_x=5 #Abstand horizontal
a_y=5 #Abstand vertikal
#Die Buttons bekommen alle dieselbe Breite
b=20
#Farbe wird auch von la verwendet
f="#00ff00"
lt=""
def __init__(self):
self.root.wm_geometry('+20+20')
self.root.resizable(0,0)
self.root.protocol("WM_DELETE_WINDOW",self.mainexit)
self.la=Label(self.root,bg=self.f,text="///GARO_GUI")
self.la.grid(row=0,column=0,
columnspan=2,
padx=self.a_x,pady=self.a_y)
self.la_1=Label(self.root,bg=self.f,text=self.lt)
self.la_1.grid(row=1,column=0,
columnspan=2,
padx=self.a_x,pady=self.a_y)
self.button=Button(self.root,
text="Prog. Beenden",
width=10,command=self.ende)
self.button.grid(row=15,column=0,
columnspan=2,
padx=10,pady=10)
def ende(self):
antwort=tkMessageBox.askyesno\
("Warnung","Sicher beenden?")
if antwort==1:
sys.exit(0)
def mainexit(self):
self.root.withdraw()
class HauptFenster(Fenster):
lt="Ausgabe"
def __init__(self,host,user,db,db_table,passwd=''):
self.root=Tk()
#bin nich darufgekommen, wie ich hier schon self.root=Toplevel(root) verwenden könnte
Fenster.__init__(self)
#jetzt kann auf self.root auch im konstruktor von Fenster aufgerufen werden
self.root.title("Hauptfenster")
self.database=DataBase(host,user,db,db_table,passwd)
self.db_table=db_table
self.choice=StringVar()
self.cols_names=[]
self.scb=Scrollbar(self.root, orient="vertical")
self.li_1=Listbox(self.root,
width=50,height=8,
yscrollcommand=self.scb.set)
self.scb["command"]=self.li_1.yview
self.li_1.grid(row=2,column=0,
columnspan=2,
padx=self.a_x,pady=self.a_y)
self.scb.grid(row=2,column=2,padx=self.a_x,pady=self.a_y)
self.b_1=Button(self.root,width=self.b,text="Alle Daten",
command=lambda:
self.list_data
(result=self.database.get_data
("select * from %s "%self.db_table)))
self.b_1.grid(row=3,column=0,padx=self.a_x,pady=self.a_y)
self.b_2=Button(self.root,width=self.b,
text="Loeschen",command=self.ask)
self.b_2.grid(row=3,column=1,padx=self.a_x,pady=self.a_y)
self.b_3=Button(self.root,width=self.b,text="Sortieren",
command=lambda:
self.list_data
(result=self.database.get_data
("select * from %s order by %s"%(self.db_table,self.choice.get()))))
self.b_3.grid(row=4,column=0,padx=self.a_x,pady=self.a_y)
self.b_4=Button(self.root,width=self.b,text="Eingabe")#gekürzt
self.b_4.grid(row=4,column=1,padx=self.a_x,pady=self.a_y)
self.b_5=Button(self.root,width=self.b,text="Suchen",
command=lambda:SuchFenster(self,self.root,self.database,self.db_table))
#hier wird also self.root übergeben. und dann klappt es auch, dass im suchfenster
#die werte der radiobuttons zurückgegeben werden
self.b_5.grid(row=5,column=0,padx=self.a_x,pady=self.a_y)
self.b_6=Button(self.root,width=self.b,text="Bearbeiten")
self.b_6.grid(row=5,column=1,padx=self.a_x,pady=self.a_y)
for elements in self.database.db_table_cols:
self.cols_names.append(elements[0])
for i in range(len(self.cols_names)):
self.rb=Radiobutton(self.root,text=self.cols_names[i],
value=self.cols_names[i],
variable=self.choice)
self.rb.grid(row=i+6,column=1,padx=self.a_x,pady=self.a_y)
self.list_data(result=self.database.get_data("select * from %s"%self.db_table))
def list_data(self,result):
self.li_1.delete(0,END)
for elements in result:
self.li_1.insert("end",elements)
def get_selected(self,action):
choice=self.li_1.get("active")
choice=str(choice[0])
action=action%choice
return action
def ask(self):
answer=tkMessageBox.askyesno("Warnung",
"Wollen Sie den gewaehlten Datensatz sicher loeschen ?")
if answer==1:
self.database.set_data(action=self.get_selected("delete from %s where %s = %s"%(self.db_table,
self.database.db_table_cols[0][0],
"%s")))
else:
pass
class SuchFenster(Fenster):
lt="Suche"
def __init__(self,hf,root,database,db_table):
self.root=Toplevel(root)
self.root.title("Suchfenster")
Fenster.__init__(self)
self.choice=StringVar()
self.database=database
self.db_table=db_table
self.cols_names=[]
for elements in self.database.db_table_cols:
self.cols_names.append(elements[0])
self.entry=Entry(self.root)
self.entry.grid(row=3,column=0)
for i in range(len(self.cols_names)):
self.rb=Radiobutton(self.root,text=self.cols_names[i],
value=self.cols_names[i],
variable=self.choice)
self.rb.grid(row=i+2,column=1,padx=self.a_x,pady=self.a_y)
self.b_1=Button(self.root,text="Suche",
command=lambda:
hf.list_data
(result=self.database.get_data
("select * from %s where %s = '%s'"%(self.db_table,self.choice.get(),self.entry.get()))))
self.b_1.grid(row=9,column=0)
if __name__ == "__main__":
hf=HauptFenster("localhost","rolgal","crossover","user","mag.art.")
mainloop()
so funktioniert alles, nur eben hat jetzt Fenster einen konstruktor der eigentlich keiner ist, die frage ist, ob das wurscht ist oder ob man das auf jeden fall beheben sollte.
wenn man es behebt, sehe ich 2 möglichkeiten:
entweder kann ich bereitss in HauptFenster self.root=Toplevel(root) verwenden, ohne, dass komische dinge passieren oder self.root=irgendwas kann in irgendeiner form in Fenster geschrieben werden ohne, dass es mir probleme bereitet.
so, ich hoffe ich konnte das einigermaßen verständlich darlegen, wenn nicht, dann bitte nein posten, ich werde dann über edit versuchen solange den beitrag zu bearbeiten bis er verständlich ist.
mfg
rolgal