GUI – 38 Eingabefelder und 38 Beschriftungen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
__deets__
User
Beiträge: 3341
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 3. Dezember 2017, 16:10

Konstruktor. Nicht konstruktiv. Doofes iPad.
Strawk
User
Beiträge: 59
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: RegBez Köln
Kontaktdaten:

Montag 4. Dezember 2017, 09:25

Hallo!

Mit der bekannten GUI möchte ich derzeit nur erreichen, dass in einem Anzeige-Label ausgegeben wird, was ins Feld "nummer" eingetragen wurde. Jedoch erhalte ich ständig:
AttributeError: 'NoneType' object has no attribute 'get'
Bei einem Vergleichsprogramm funktioniert das tadellos und ich habe keinerlei Idee, wo der Unterschied sein soll.

Erbitte Hilfe!
Grüße
Strawk
Sirius3
User
Beiträge: 8291
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 4. Dezember 2017, 09:43

@Strawk: die Glaskugel sagt nur Schneegestöber und der Kaffeesatz ist schon in der Bio-Tonne.

Ach ja, Nachtrag:

Code: Alles auswählen

class Main(tk.Tk):
    def __init__(self):
        super(Main, self).__init__()
        self.entries = generate_form(self, LABELS)
narpfel
User
Beiträge: 226
Registriert: Freitag 20. Oktober 2017, 16:10

Montag 4. Dezember 2017, 10:08

`super` ist in Python 3 noch superer geworden:

Code: Alles auswählen

class Main(tk.Tk):
    def __init__(self):
        super().__init__()
        self.entries = generate_form(self, LABELS)
Die beiden Argumente sind optional.
Strawk
User
Beiträge: 59
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: RegBez Köln
Kontaktdaten:

Montag 4. Dezember 2017, 12:49

Hallo!

Ich konnte das Unter-Problem identifizieren.

Code: Alles auswählen

e_nummer = tkinter.Entry(master).grid(row=0, column=0)
funktioniert nicht und macht:
AttributeError: 'NoneType' object has no attribute 'get'
Aber

Code: Alles auswählen

e_nummer = tkinter.Entry(master)
e_nummer.grid(row=0, column=0)
funktioniert.

Grüße
Strawk
:D
Strawk
User
Beiträge: 59
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: RegBez Köln
Kontaktdaten:

Samstag 9. Dezember 2017, 13:41

Code: Alles auswählen

import tkinter

# Funktion zu den Schaltflächen
def ende():
    master.destroy()

def anzeigen():
    eingabe = e_nummer.get()
    l_anzeige["text"] = eingabe

master = tkinter.Tk()
master.geometry("800x600+30+30") 

# nummer, codierung
e_nummer = tkinter.Entry(master)
e_nummer.grid(row=0, column=0)
e_codierung = tkinter.Entry(master).grid(row=1, column=0)
tkinter.Label(master, text="nummer").grid(row=0, column=1)
tkinter.Label(master, text="codierung").grid(row=1, column=1)

# name_oder_firmenname, geburtsname, vorname_bezeichnung
tkinter.Entry(master).grid(row=0, column=2)
tkinter.Entry(master).grid(row=2, column=2)
tkinter.Entry(master).grid(row=4, column=2)
tkinter.Label(master, text="name_oder_firmenname").grid(row=1, column=2)
tkinter.Label(master, text="geburtsname").grid(row=3, column=2)
tkinter.Label(master, text="vorname_bezeichnung").grid(row=5, column=2)

# strasse_hausnummer, plz, ort_stadt
tkinter.Entry(master).grid(row=0, column=3)
tkinter.Entry(master).grid(row=2, column=3)
tkinter.Entry(master).grid(row=4, column=3)
tkinter.Label(master, text="strasse_hausnummer").grid(row=1, column=3)
tkinter.Label(master, text="plz").grid(row=3, column=3)
tkinter.Label(master, text="ort_stadt").grid(row=5, column=3)

# ortsteil, bundesland_provinz_kanton, land_nation
tkinter.Entry(master).grid(row=0, column=4)
tkinter.Entry(master).grid(row=2, column=4)
tkinter.Entry(master).grid(row=4, column=4)
tkinter.Label(master, text="ortsteil").grid(row=1, column=4)
tkinter.Label(master, text="bundesland_provinz_kanton").grid(row=3, column=4)
tkinter.Label(master, text="land_nation").grid(row=5, column=4)

# fahrzeugfabrikat, fahrzeugtyp, kfz_kennzeichen_historie
tkinter.Entry(master).grid(row=6, column=2)
tkinter.Entry(master).grid(row=8, column=2)
tkinter.Entry(master).grid(row=10, column=2)
tkinter.Label(master, text="fahrzeugfabrikat").grid(row=7, column=2)
tkinter.Label(master, text="fahrzeugtyp").grid(row=9, column=2)
tkinter.Label(master, text="kfz_kennzeichen_historie").grid(row=11, column=2)

# landesvorwahl, festnetzvorwahl, festnetznummer
tkinter.Entry(master).grid(row=6, column=3)
tkinter.Entry(master).grid(row=8, column=3)
tkinter.Entry(master).grid(row=10, column=3)
tkinter.Label(master, text="landesvorwahl").grid(row=7, column=3)
tkinter.Label(master, text="festnetzvorwahl").grid(row=9, column=3)
tkinter.Label(master, text="festnetznummer").grid(row=11, column=3)

# aktiv, mobile_vorwahl, mobiler_anschluss
tkinter.Entry(master).grid(row=6, column=4)
tkinter.Entry(master).grid(row=8, column=4)
tkinter.Entry(master).grid(row=10, column=4)
tkinter.Label(master, text="aktiv").grid(row=7, column=4)
tkinter.Label(master, text="mobile_vorwahl").grid(row=9, column=4)
tkinter.Label(master, text="mobiler_anschluss").grid(row=11, column=4)

# e_mail_1, e_mail_2, url
tkinter.Entry(master).grid(row=12, column=2)
tkinter.Entry(master).grid(row=14, column=2)
tkinter.Entry(master).grid(row=16, column=2)
tkinter.Label(master, text="e_mail_1").grid(row=13, column=2)
tkinter.Label(master, text="e_mail_2").grid(row=15, column=2)
tkinter.Label(master, text="url").grid(row=17, column=2)

# geschlecht, anzahl_kinder, verstorben_am_um
tkinter.Entry(master).grid(row=12, column=3)
tkinter.Entry(master).grid(row=14, column=3)
tkinter.Entry(master).grid(row=16, column=3)
tkinter.Label(master, text="geschlecht").grid(row=13, column=3)
tkinter.Label(master, text="anzahl_kinder").grid(row=15, column=3)
tkinter.Label(master, text="verstorben_am_um").grid(row=17, column=3)

# geburtstag, anzahl_ereignisse, memos
tkinter.Entry(master).grid(row=12, column=4)
tkinter.Entry(master).grid(row=14, column=4)
tkinter.Entry(master).grid(row=16, column=4)
tkinter.Label(master, text="geburtstag").grid(row=13, column=4)
tkinter.Label(master, text="anzahl_ereignisse").grid(row=15, column=4)
tkinter.Label(master, text="memos").grid(row=17, column=4)

# fax, titel, beruf
tkinter.Entry(master).grid(row=18, column=2)
tkinter.Entry(master).grid(row=20, column=2)
tkinter.Entry(master).grid(row=22, column=2)
tkinter.Label(master, text="fax").grid(row=19, column=2)
tkinter.Label(master, text="titel").grid(row=21, column=2)
tkinter.Label(master, text="beruf").grid(row=23, column=2)

# ausbildung, taetigkeit, taetig_in_firma
tkinter.Entry(master).grid(row=18, column=3)
tkinter.Entry(master).grid(row=20, column=3)
tkinter.Entry(master).grid(row=22, column=3)
tkinter.Label(master, text="ausbildung").grid(row=19, column=3)
tkinter.Label(master, text="taetigkeit").grid(row=21, column=3)
tkinter.Label(master, text="taetig_in_firma").grid(row=23, column=3)

# hobbys, herkunftsland, bekanntschaft_seit
tkinter.Entry(master).grid(row=18, column=4)
tkinter.Entry(master).grid(row=20, column=4)
tkinter.Entry(master).grid(row=22, column=4)
tkinter.Label(master, text="hobbys").grid(row=19, column=4)
tkinter.Label(master, text="herkunftsland").grid(row=21, column=4)
tkinter.Label(master, text="bekanntschaft_seit").grid(row=23, column=4)

b_anzeige = tkinter.Button(master, text="Anzeigen",
                           command = anzeigen).grid(row=31, column=2)

l_anzeige = tkinter.Label(master)
l_anzeige.grid(row=36, column=2)

bende = tkinter.Button(master, text="Ende", command = ende)
bende.grid(row=31, column=3)

master.mainloop()
Der Code funktioniert nicht mehr. Seit dem letzten Rechner-Einschalten habe ich aber nichts geändert. Fehlermeldung:
ImportError: No module named tkinter
Grüße
Strawk
Sirius3
User
Beiträge: 8291
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 9. Dezember 2017, 13:54

@Strawk: Du hast wohl verschiedene Python-Versionen installiert. Nimm einfach die richtige. Mit Deinem jetzigen Vorgehen, alles linear runterzuprogrammieren, wirst Du nicht glücklich werden. Nimm Dir die Zeit, und lerne die Grundlagen von Python.
Strawk
User
Beiträge: 59
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: RegBez Köln
Kontaktdaten:

Sonntag 10. Dezember 2017, 14:43

Hallo Nutzer! :D

Für meine Datenbank-GUI möchte ich zwei große Frames nebeneinander. Im linken die Eingabemaske aus 38 Entry- und Label-Feldern, im rechten eine großes Ausgabetextfenster mit vertikaler Scrollbar. Aktuelles Problem: die Widgets wollen nicht in den Frame wandern; ich erhalte die Meldung:
TypeError: Tkinter objects don't support 'in' tests.
Der entsprechende Code-Schnipsel:

Code: Alles auswählen

master = tk.Tk()
master.geometry("1500x600+30+30") 

fr1 = Frame(master, width=600, height=550, relief="sunken", bd=1)
fr1.grid(row=1, column=1)

# nummer, codierung
e_nummer = Entry(master, fr1)
e_nummer.grid(row=0, column=0)
e_codierung = Entry(master, fr1)
e_codierung.grid(row=1, column=0)
Wie lautet die korrekte Syntax, um die Widgets in den Frame zu bekommen?
Liebe Grüße
Strawk :)

P.S.: An Sirius3 - Ich habe ein ganzes Python-Buch minutiös durchgeackert. Meinst du nicht auch, irgendwann muss man mal das freie Programmieren anfangen? :)
Sirius3
User
Beiträge: 8291
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 10. Dezember 2017, 15:01

@Strawk: wie's richtig geht, hab ich ja schon letzten Sonntag gezeigt.
__deets__
User
Beiträge: 3341
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 10. Dezember 2017, 15:10

Strawk hat geschrieben:Hallo Nutzer! :D

Für meine Datenbank-GUI möchte ich zwei große Frames nebeneinander. Im linken die Eingabemaske aus 38 Entry- und Label-Feldern, im rechten eine großes Ausgabetextfenster mit vertikaler Scrollbar. Aktuelles Problem: die Widgets wollen nicht in den Frame wandern; ich erhalte die Meldung:
TypeError: Tkinter objects don't support 'in' tests.
Der entsprechende Code-Schnipsel:

...
Da in den gesamten Code-Schnipsel *kein* "in" vorkommt, passt der nicht zur Fehlermeldung.

Und bezueglich der Grundlagen: die scheinen immer noch zu fehlen, Buch durchgearbeitet hin oder her. Wir kommentieren hier was wir sehen.
Strawk
User
Beiträge: 59
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: RegBez Köln
Kontaktdaten:

Sonntag 10. Dezember 2017, 15:17

Hallo Sirius3, __deets__! :D

Sirius3, dein Beispiel funktioniert bei mir nicht. Auch nicht mit deinem Nachtrag und dem von narpfel. Ich arbeite mit Python 2.7 und der Shell "Anaconda Navigator / Spyder".

__deets__, im gesamten Skript ist kein "in". Die Bedeutung der Fehlermeldung muss wohl eine andere sein.

Ich möchte bitte für meinen Code nur die Syntax, wie ich die Widgets in den Frame bekommen. Danke!

Grüße
Strawk
:)
__deets__
User
Beiträge: 3341
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 10. Dezember 2017, 15:28

@Strawk: widgets in ein anderes widget bekommt man, indem man das Objekt als parent-Objekt uebergibt. So, wie das in deinem von dir selbst geposteten Beispiel passiert. Wo also liegt die Unklarheit?

Und du packst eine Fehlermeldung dazu, die mit dem problem halt nichts zu tun hat. Was anderes kann man dazu nicht sagen :K
Sirius3
User
Beiträge: 8291
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 10. Dezember 2017, 15:32

@__deets__: das `in` steht ja auch in den Funktionen, die aufgerufen werden. Natürlich wäre da der gesamte Traceback hilfreich gewesen.

@Strawk: welche Python-Version Du im Moment benutzt, kann niemand erraten, weil Du die ständig wechselst. Ich schreibe hier keinen Code, der sofort benutzbar ist, sondern die Konzepte zeigen soll, die Du, wenn Du Dir die Mühe gemacht hast, zu verstehen, wie das Programm arbeitet, leicht auf Dein Problem übertragen kannst. Daher: mein Code zeigt wie man Widgets in Frames packt.
narpfel
User
Beiträge: 226
Registriert: Freitag 20. Oktober 2017, 16:10

Sonntag 10. Dezember 2017, 15:35

@Strawk: Unter Python 2.7 heißt das Modul `Tkinter`. Von daher sieht das eher nach Python 3 aus. Was sagt `sys.version` (in der selben Umgebung wie das Programm ausgeführt)?

Zu der Fehlermeldung: Guck’ dir nochmal an, was für eine Signatur `tk.Entry` hat und was du übergibst. Ansonsten: Bitte poste den gesamten Traceback, nicht nur die letzte Zeile. Dann kann man schneller und einfacher den Fehler erkennen, ohne dabei raten zu müssen.

Zu dem Beispiel von Sirius3: Auch hier ist es im Sinne der Problemlösung hilfreich, wenn du den gesamten Traceback (und eventuell auch den Code, wenn du ihn verändert hast), zeigst.
__deets__
User
Beiträge: 3341
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 10. Dezember 2017, 16:07

Sirius3 hat geschrieben:@__deets__: das `in` steht ja auch in den Funktionen, die aufgerufen werden. Natürlich wäre da der gesamte Traceback hilfreich gewesen.
Ahhh. Jetzt erst sehe ich das.

@Strawk: du uebergibst Entry zwei Widgets. Willst offensichtlich, das das zweite davon der Parent ist. Warum also das erste ueberhaupt angeben?
Antworten