kein Handle für widgets

Fragen zu Tkinter.
Antworten
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Mittwoch 8. September 2010, 16:29

Hallo Leute,

ich steh grad völlig auf dem Schlauch. Ich habe schon einige TK-Programme geschrieben aber folgendes macht mir Probleme:

Code: Alles auswählen

from Tkinter import *
import hashlib

class Control:
    def __init__(self, mf):
        self.mf = mf
        self.__createGui()

    def __createGui(self):
        print self.mf 
        self.lblDate = Label(self.mf, text="Date:", width=15, anchor=E).grid(row=0, column=0)
        self.etyDate = Entry(self.mf, width=40).grid(row=0, column=1)     
        print self.etyDate
        
        self.lblProjectNbr = Label(self.mf, text="Projectnumber", width=15, anchor=E).grid(row=1, column=0)
        self.etyProjectNbr = Entry(self.mf, width=40).grid(row=1, column=1)
        
        self.btnCreatePassword = Button(self.mf, text = "Create password", command=self._CreatePassword).grid(row=2, column=0)
        
        self.lblPassword = Label(self.mf, text = "Password:", width=15, anchor=E).grid(row=3, column=0)
        self.etyPassword = Entry(self.mf, width=40).grid(row=3, column=1)
        

    def _CreatePassword(self):
        print("password")
        m = hashlib.md5()
       
        m.update(str(self.etyDate.get()))
        m.update(str(self.etyProjectNbr.get()))
        self.etyPassword = m.hexdigest()
        
        
        
if __name__ == '__main__':
    mf = Tk()
    #feld=Toplevel(root)
    c = Control(mf)
    #d = Control(mf, "a", "b")
    mf.mainloop() 


und zwar bekomme ich kein Objekt für

Code: Alles auswählen

print self.etyDate
das ist doch eigentlich garnicht möglich. Bitte helft mir.. ich such schon 3 Stunden.

Danke und Gruß
alpha
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Mittwoch 8. September 2010, 16:57

...ich hab 5 Sekunden gebraucht.

"grid()" gibt "None" zurück!
Schreibe mal

Code: Alles auswählen

self.etyDate = Entry(self.mf, width=40)
self.etyDate.grid(row=0, column=1)    
Ebenso bei den anderen Aufrufen.

:wink:
yipyip
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mittwoch 8. September 2010, 16:58

alpha hat geschrieben:Ich habe schon einige TK-Programme geschrieben
Wie die ausgesehen haben, möchte ich lieber nicht wissen ...

Zum einen ist dein Code außerordentlich ungewöhnlich aufgebaut, um es einmal milde auszudrücken.
Wenn du mal die einschlägige Doku zu Tkinter anguckst, wirst du zahlreiche Beispiele dafür finden, wie der Grundaufbau aussehen könnte.

Zu deinem konkreten Problem: Ein Aufruf von Entry().grid() liefert keine Instanz von Entry, sondern der Rückgabewert der grid()-Methode. Der ist None. Das bekommst du zurück.
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Mittwoch 8. September 2010, 17:51

Danke YipYip,

so ist es wenn man mal was anderes ausprobiert :-)
Normalerweise mach ich es auch so.. dachte ich spar ne Zeile.. da sieht man was man davon hat.

@Numerix
Danke für die Beleidigung. Ich habe mir schon etliche Tkinterprogramme angeschaut, und ne einheitliche Linie gibts da schon mal gar nicht.

über

Code: Alles auswählen

from Tkinter import *
kann man sich freilich streiten.
Habe auch schon eine Klasse erstellt, die von Tkinter erbt.. aber schöner ist das auch nicht.

Code: Alles auswählen

self.__createGui()
könnte ich mir schenken.. auch klar.. ich war nur mit der zeit so verzweifelt allen möglichen mist zu probieren.
Ging Dir nach einem 10h tag bestimmt noch nie so :(

nerft wirklich wenn man mit 20 Zeilen code hier bewertet wird.

Gruß
alpha
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mittwoch 8. September 2010, 18:10

alpha hat geschrieben:@Numerix
Danke für die Beleidigung.
Na, du bist aber sehr dünnhäutig. Von "Beleidigung" war das noch weit entfernt.
alpha hat geschrieben:Ich habe mir schon etliche Tkinterprogramme angeschaut, und ne einheitliche Linie gibts da schon mal gar nicht.
Das habe ich auch nicht behauptet, aber der Aufbau deines Codes ist schon sehr besonders.
alpha hat geschrieben:nerft wirklich wenn man mit 20 Zeilen code hier bewertet wird.
Wenn man seinen Code hier postet, muss man das schon aushalten können. Geht mir auch nicht anders ...
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Mittwoch 8. September 2010, 22:01

@numerix

Sorry, war ein langer Tag. Das das Progrämmchen nicht der Weisheit letzter Schluss ist, ist mir auch klar.
Ich wäre nur dankbar für konkrete Verbesserungsvorschläge.

So siehts jetzt aus.. ist auch jetzt nur ein Demo für meinen Chef aber das Design ist schöner :-D

Code: Alles auswählen

import Tkinter as tk
import hashlib

class CryptGui:
    def __init__(self):
        self.mf = tk.Tk()
        self.mf.title("crypt")
        self.mf.resizable(False, False)
        
        self.lblDate = tk.Label(self.mf, text="Date:", width=15, anchor=tk.E)
        self.lblDate.grid(row=0, column=0)
        self.etyDate = tk.Entry(self.mf, width=40)
        self.etyDate.grid(row=0, column=1)    
       
        self.lblProjectNbr = tk.Label(self.mf, text="Projectnumber", width=15, anchor=tk.E)
        self.lblProjectNbr.grid(row=1, column=0)
        self.etyProjectNbr = tk.Entry(self.mf, width=40)
        self.etyProjectNbr.grid(row=1, column=1)

        self.btnCreatePassword = tk.Button(self.mf, text = "Create password", command=self._CreatePassword)
        self.btnCreatePassword.grid(row=2, column=0)

        self.lblPassword = tk.Label(self.mf, text = "Password:", width=15, anchor=tk.E)
        self.lblPassword.grid(row=3, column=0)
        self.etyPassword = tk.Entry(self.mf, width=40)
        self.etyPassword.grid(row=3, column=1)

        self.mf.mainloop()


    def _CreatePassword(self):
        m = hashlib.md5(
        m.update(str(self.etyDate.get()))
        m.update(str(self.etyProjectNbr.get()))
        self.etyPassword.delete(0, tk.END)
        self.etyPassword.insert(0, m.hexdigest())
       

if __name__ == '__main__':
    c = CryptGui()

Jetzt kannst loslegen ;-)

Grüße
alpha
Antworten