Seite 1 von 1

Usereingaben

Verfasst: Donnerstag 8. September 2005, 15:33
von patrickk
Hallo, bin in GUI Anfaenger. Habe eine Doku zu Tkinter, aber...

Code: Alles auswählen

class func:
   def __init__(self):
	self.root = Tk()
	self.fr01 = Frame(self.root)
	self.fr01.pack()
	self.label =Label(self.fr01, text = "Parsing file")
	self.label.pack(side=TOP) #klappt
	self.bu01 = Button(self.fr01,text='Testbutton',command=self.entertext) 
#problem	
   def entertext(self):
        top =Toplevel()
#wollte ein neues fenster erzeugen, besser waere es aber wenn es im selben fenster angezeigt wird
#top.e1 ist schwachsinn... am liebsten wuerde ich unter die buttons ein feld legen, indem der user die eingabe taetigen soll. Aber wie macht man das. mit self.e1=Entry... passiert nichts
        top.e1=Entry(self.fr01)
        top.e2=Entry(self.fr01)
        top.e1.grid(row=0,column=1)
        top.e2.grid(row=1,column=1) 

func()
Hier ist sicher einiges falsch, aber ich weiss leider nicht, was verkehr ist. Falls jmd. weiss wo man sich Demos zu der Gestaltung einer applikation ansehen kann, so waere ich dankbar. Muss das einmal im grossen sehen.

Verfasst: Donnerstag 8. September 2005, 15:42
von mawe
Hi!

1. Du hast vergessen den Button zu packen.
2. top.e1 ist ... Schwachsinn :) Toplevel ist genauso ein Widget wie jedes andere (naja, fast). Du schreibst ja auch nicht fr01.x1 = ....
Wenn Du also was ins Toplevel packen willst, dann so

Code: Alles auswählen

e1 = Entry(top)
e1.pack()
Gruß, mawe

Verfasst: Freitag 9. September 2005, 09:04
von patrickk
Hi,
na gut. die Zeile habe ich vergessen :? War aber im Code. Ich glaube ich habe es jetzt fast verstanden. Habe versucht grid und pack in einem Frame zu verwenden. Das sollte man wohl nicht. Also immer fuer jedes "Unterfenster" oder so ein neues Frame anlegen,als bsp.? Und dann dort einstellen, wie was angezeigt werden soll...
Eine Frage aber noch zu dem Import von strings und die weiterbearbeitung:

Code: Alles auswählen


class func:
   def __init__(self):
	...
	first = self.body(self.fr03)

   def body(self,master):
       Label(master,text="starttag:").grid(row =0, sticky=W)
       Label(master,text="endtag:").grid(row =1, sticky=W)
       self.e1=Entry(master)
       self.e2=Entry(master)
       self.e1.grid(row=0,column=1)
       self.e2.grid(row=1,column=1)
       self.check= Button(master, text = "OK", command= self.execute(master)).grid(row =2, sticky=W)
		return self.e1
def execute(self,master):
        
       Label(master,text="starttag: "+str(self.e1)+"endtag: "+str(self.e2)).grid(row =3, sticky=W) 

Fragen:
1. brauche ich bei den Klassen so wie hier das return im body. Nein, oder, da ich ja self.e1 zurueckgebe. Wenn ich in die Klasse am anfang self.e1 = '' schreibe braucht man kein return, oder? Oder sollte man das besser lassen, wegen Speicherverschwendung, oder so
2. Die ausgabe klappt nicht wie ich es mir vorstelle. Sie wird direkt angezeigt, bevor man Text eingibt. Ich dachte, durch den Button mit command sollte dies erst geschehen, wenn man auf den Buttom klickt. Was ist hier falsch?
erge = string.atoi(self.e1.get())
print erg geht aber nicht?


Danke Patrick

Verfasst: Freitag 9. September 2005, 09:49
von Leonidas
patrickk hat geschrieben:1. brauche ich bei den Klassen so wie hier das return im body. Nein, oder, da ich ja self.e1 zurueckgebe.
Bei dir ist das return self.e1 nicht in der def body.
patrikk hat geschrieben:Wenn ich in die Klasse am anfang self.e1 = '' schreibe braucht man kein return, oder? Oder sollte man das besser lassen, wegen Speicherverschwendung, oder so
Du brauchst weder ein return noch einen Startwert für die Variable. Wenn du sie als self.e1 anlegst, kann jede Funktion deiner Klasse drauf zugreifen.

Verfasst: Freitag 9. September 2005, 11:27
von patrickk
Hallo,
ich weiss aber noch nicht, warum das mit execute nicht klappt? Ich will in self.e1 Usereingaben schreiben und wenn ok gedrueckt wird moechte ich execute starten. Dort soll es dann ausgegeben werden. Aber man sieht die ausgabe bereits bei der Eingabe der Zeichen. Eigentlich dachte ich sollte diese erst erscheinen, wenn man ok drueckt??

Code: Alles auswählen

class func2:
   def __init__(self):
      self.root = Tk()
      self.e1=''
      self.e2=''
      self.fr01 = Frame(self.root) 
      self.fr01.pack()
      self.fr02 = Frame(self.root)
      self.fr02.pack()
      self.label =Label(self.fr01, text = "Parsing file").grid(row=0,column=0)
      self.body(self.fr02)

      self.root.mainloop()
      
      
   def body(self,master):
       Label(master,text="starttag:").grid(row =0, sticky=W)
       Label(master,text="endtag:").grid(row =1, sticky=W)
       self.e1=Entry(master)
       self.e2=Entry(master)
       self.e1.grid(row=0,column=1)
       self.e2.grid(row=1,column=1)
       self.check= Button(master, text = "OK", command= self.execute(master)).grid(row =2, sticky=W)
                          
   def execute(self,master):
       Label(master,text="starttag: "+str(self.e1.get())+"endtag: "+str(self.e2.get())).grid(row =3, sticky=W)
#habe auch versucht textvariable statt text zu verwenden, aber das macht keinen Unterschied??
       master.update()

Verfasst: Freitag 9. September 2005, 14:54
von mawe
Hi!

Code: Alles auswählen

self.check= Button(master, text = "OK", command= self.execute(master)).grid(row =2, sticky=W) 
Schon wieder :) self.execute(master) wird gleich beim Start ausgeführt. Du kannst entweder

Code: Alles auswählen

self.check= Button(master, text = "OK", command= self.execute).grid(row =2, sticky=W) 
schreiben, oder wenn master unbedingt mit muss, das

Code: Alles auswählen

self.check= Button(master, text = "OK", command= lambda: self.execute(master)).grid(row =2, sticky=W) 
Gruß, mawe