Usereingaben

Fragen zu Tkinter.
Antworten
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

Donnerstag 8. September 2005, 15:33

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.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Donnerstag 8. September 2005, 15:42

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
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

Freitag 9. September 2005, 09:04

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
Zuletzt geändert von patrickk am Freitag 9. September 2005, 11:00, insgesamt 1-mal geändert.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 9. September 2005, 09:49

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

Freitag 9. September 2005, 11:27

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()
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Freitag 9. September 2005, 14:54

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
Antworten