tkinter.TclError

Fragen zu Tkinter.
Antworten
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,
habe von hier http://www.python-kurs.eu/tkinter_entry_widgets.php mir diesen Code kopiert:

Code: Alles auswählen

#!/usr/bin/python3

from tkinter import *
fields = 'Last Name', 'First Name', 'Job', 'Country'

def fetch(entries):
   for entry in entries:
      field = entry[0]
      text  = entry[1].get()
      print('%s: "%s"' % (field, text)) 

def makeform(root, fields):
   entries = []
   for field in fields:
      row = Frame(root)
      lab = Label(row, width=15, text=field, anchor='w')
      ent = Entry(row)
      row.pack(side=TOP, fill=X, padx=5, pady=5)
      lab.pack(side=LEFT)
      ent.pack(side=RIGHT, expand=YES, fill=X)
      entries.append((field, ent))
   return entries

if __name__ == '__main__':
   root = Tk()
   ents = makeform(root, fields)
   root.bind('', (lambda event, e=ents: fetch(e)))   
   b1 = Button(root, text='Show',
          command=(lambda e=ents: fetch(e)))
   b1.pack(side=LEFT, padx=5, pady=5)
   b2 = Button(root, text='Quit', command=root.quit)
   b2.pack(side=LEFT, padx=5, pady=5)
   root.mainloop()
Beim Aufruf in der Konsole, erhalte ich aber leider folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "a.py", line 30, in <module>
    root.bind('', (lambda event, e=ents: fetch(e)))   
  File "/usr/lib/python3.2/tkinter/__init__.py", line 980, in bind
    return self._bind(('bind', self._w), sequence, func, add)
  File "/usr/lib/python3.2/tkinter/__init__.py", line 935, in _bind
    self.tk.call(what + (sequence, cmd))
_tkinter.TclError: no events specified in binding
Ich stehe da ein bisschen auf dem Schlauch und hoffe Ihr könnt mir dabei helfen!

Grüße Nobuddy
BlackJack

@Nobuddy: Lass am besten die Finger von dem Kurs. Der ist nicht gut und ich hoffe auch nicht ernst gemeint. Der Betreiber hat einen ganzen Zoo von Webseiten zu verschiedenen Themen die alle untereinander verlinkt sind und ist ein SEO-Mensch.

Edit: Die Kursseiten haben nichts mit SEO zu tun, sondern sind ein Informationangebot das sich an menschliche Leser richtet und nicht an Suchmaschinen.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

@BlackJack, Danke für die Info, dann lasse ich da meine Finger davon!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Nobuddy

Das Skript darfst du trotzdem zum laufen bringen. Die Fehlermeldung besagt das die Anweisung in Zeile 30 keinen gültigen Event-Typen aufweist. Betrifft ziemlich sicher die folgende Anweisung:

Code: Alles auswählen

root.bind('', (lambda event, e=ents: fetch(e)))
Abgeändert auf:

Code: Alles auswählen

root.bind('<Control-Shift-KeyPress-S>', (lambda event, e=ents: fetch(e)))
sollte das Skript laufen. Die Anweisung bewirkt beim drücken der Tasten Cntr->Shift und s das gleiche wie die Schaltfläche 'Show'

Gruß wuf :wink:
Take it easy Mates!
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hallo wuf,
Danke für Deine Bemühung, das war der richtige Tipp! :wink:

Habe noch eine Zeile zusätzlich für den Fensternamen spendiert:

Code: Alles auswählen

#!/usr/bin/python3

from tkinter import *
fields = 'Last Name', 'First Name', 'Job', 'Country'

def fetch(entries):
   for entry in entries:
      field = entry[0]
      text  = entry[1].get()
      print('%s: "%s"' % (field, text))

def makeform(root, fields):
   entries = []
   for field in fields:
      row = Frame(root)
      lab = Label(row, width=15, text=field, anchor='w')
      ent = Entry(row)
      row.pack(side=TOP, fill=X, padx=5, pady=5)
      lab.pack(side=LEFT)
      ent.pack(side=RIGHT, expand=YES, fill=X)
      entries.append((field, ent))
   return entries

if __name__ == '__main__':
   root = Tk(className=" Fensternamen")
   ents = makeform(root, fields)
   root.bind('<Control-Shift-KeyPress-S>', (lambda event, e=ents: fetch(e)))  
   b1 = Button(root, text='Show',
          command=(lambda e=ents: fetch(e)))
   b1.pack(side=LEFT, padx=5, pady=5)
   b2 = Button(root, text='Quit', command=root.quit)
   b2.pack(side=LEFT, padx=5, pady=5)
   root.mainloop()
Antworten