Tkinter: default button

Fragen zu Tkinter.
Antworten
david
User
Beiträge: 30
Registriert: Montag 12. Januar 2004, 14:40

Hi!
Ich stell mich gerade mal wieder ein bisschen blöd an:
Ziel ist es, einen Button auf default zu setzen, so, dass durch drücken der Return-Taste eine Funktion ausgeführt wird.
Mein Code:

Code: Alles auswählen

#!/usr/bin/env python

import Tkinter

root=Tkinter.Tk()

def die():
    sys.exit()


button2a=Tkinter.Button(root,text="Ende",default="active")
button2a.bind("<Return>", die)
button2a.pack(side=Tkinter.LEFT, fill = Tkinter.BOTH, expand = 1)

button1a=Tkinter.Button(root,text="Test")
button1a.pack(side=Tkinter.LEFT, fill = Tkinter.BOTH, expand = 1)


root.mainloop()
Leider funktioniert dies nicht.
Irgendwie hab ich das Gefühl, dass es echt nur eine Kleinigkeit ist...


Grüße, david
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Lass mich raten... es kommt ein Argumenterror? Wenn ja, schau dir mal das hier an: selber Fehler.

hth, Milan
david
User
Beiträge: 30
Registriert: Montag 12. Januar 2004, 14:40

Hi!
Leider bringt das auch keine Veränderung. Argumenterror? Ne, es passiert einfach gar nichts.
Nicht einmal der Button wird durch Return gedrückt.

Oben fehlt übrigens das Modul sys....aber das hat nix mit dem Fehler zu tun, war ein Schreibfehler.

Grüße, David
MacEvil
User
Beiträge: 52
Registriert: Mittwoch 21. Januar 2004, 21:40

Wie soll denn das gehen ? Wenn man auf den Button klickt und Enter drückt oder was ?

Der richtige Code für die Funktion ist dann so :

Code: Alles auswählen

def die(event): 
    sys.exit(event) 
Oder meinst du vielleicht x = Button(root, text='bla', command=befehl)
Möge die Python-Community gedeihen
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Wenn gar nichts passiert ist, war der Button nicht aktiv, also hatte keinen Focus. Den muss er allerdings besitzen, damit eine Aktion ausgeführt wird. Bekommen kann er den durch einen Klick auf den Button oder durch einen internen Programmaufruf. Wenn du eine Aktion also ausführen lassen willst, die bei Return-druck passieren soll, solltest du sie also nicht an den button, sondern an das ganze Fenster binden, denn das hat ja immer den Focus.

Milan
david
User
Beiträge: 30
Registriert: Montag 12. Januar 2004, 14:40

Wie soll denn das gehen ?
Ich hab mich vielleicht nicht ganz klar ausgedrückt. Gemeint ist, das ein button vorausgewählt ist, der dann durch Betätigen von Return gedrückt wird.
Hi. Wenn gar nichts passiert ist, war der Button nicht aktiv, also hatte keinen Focus.
Ich dachte, den Fokus bekommt der Button durch

Code: Alles auswählen

default="active"
Wenn du eine Aktion also ausführen lassen willst, die bei Return-druck passieren soll, solltest du sie also nicht an den button, sondern an das ganze Fenster binden, denn das hat ja immer den Focus.
Wenn ich es so zuordne, dass automatisch zB bei Return eine Funktion ausgeführt wird, dann brauch ich ja den Button nicht mehr....

Grüße, david
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo David

Hier hast Du etwas zum ausprobieren:

Code: Alles auswählen

from Tkinter import*

root=Tk()

def die(event=None):
	if button2a['default']=='active':
		sys.exit()
		return
	sys.exit()


button2a=Button(root,text="Ende",default="active",command=die)
button2a.pack(side=LEFT, fill = BOTH, expand = 1)
root.bind("<Return>", die)

button1a=Button(root,text="Test")
button1a.pack(side=LEFT, fill = BOTH, expand = 1)


root.mainloop()
Gruss wuf :wink:
Take it easy Mates!
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi David,

den Focus kannst Du dem Widget mit der Methode focus() verpassen:

Code: Alles auswählen

import sys, Tkinter

root=Tkinter.Tk()


button2a=Tkinter.Button(root,text="Ende")
button2a.focus()
button2a.bind("<Return>", lambda event: sys.exit())
button2a.pack(side=Tkinter.LEFT, fill = Tkinter.BOTH, expand = 1)

button1a=Tkinter.Button(root,text="Test")
button1a.pack(side=Tkinter.LEFT, fill = Tkinter.BOTH, expand = 1)


root.mainloop()

Gruß

Dookie
david
User
Beiträge: 30
Registriert: Montag 12. Januar 2004, 14:40

Ertsmal Danke für Eure Antworten!

Ich hab jetzt ein wenig rumgespielt. Aber leider ist das alles noch nicht so ganz das richtige...:
Hi David,

den Focus kannst Du dem Widget mit der Methode focus() verpassen:
Code:
import sys, Tkinter

root=Tkinter.Tk()


button2a=Tkinter.Button(root,text="Ende")
button2a.focus()
button2a.bind("<Return>", lambda event: sys.exit())
button2a.pack(side=Tkinter.LEFT, fill = Tkinter.BOTH, expand = 1)

button1a=Tkinter.Button(root,text="Test")
button1a.pack(side=Tkinter.LEFT, fill = Tkinter.BOTH, expand = 1)


root.mainloop()



Gruß

Dookie
Ich arbeite mit pmw.notebbook, habe also mehrere "Tabs" offen. Springe ich jetzt von einem Tab zu einem anderen, ist der focus weg, nämlich auf dem tab.
Die buttons selbst sind in den jeweiligen seiten der notebooks.
und ich glaube, nach jedem Tabwechsel erst wieder neu einen button fokussieren ist mir zu aufwendig.
Hallo David

Hier hast Du etwas zum ausprobieren:

Code:

from Tkinter import*

root=Tk()

def die(event=None):
if button2a['default']=='active':
sys.exit()
return
sys.exit()


button2a=Button(root,text="Ende",default="active",command=die)
button2a.pack(side=LEFT, fill = BOTH, expand = 1)
root.bind("<Return>", die)

button1a=Button(root,text="Test")
button1a.pack(side=LEFT, fill = BOTH, expand = 1)


root.mainloop()


Gruss wuf
Damit wird immer ein und derselbe knopf aufgerufen, egal welcher tab offen ist.

Nochmal zur Verdeutlichung: Ich denke schon, das man Eure beiden Vorschläge so modifizieren kann, das es passt. Allerdibgs glaube ich, dass es einfacher geht.

Auf jedem Tab gibts ein paar Knöpfe, und immer soll einer vorab ausgewählt sein, der durch Druck von RETURN bedient wird.
Wofür ist eigentlich dieses "default" bei den optionen für den button? Mittlerweile steig ich schon nicht mehr durch... :shock:

ich hoffe nicht, dass die Verwirrung bei Euch jetzt ebenfalls komplett ist!

:wink:

Grüße, david
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

manchmal muss man euch echt die würmer aus der Nase ziehen ;)
Beschäftige dich mal mit den Möglichkeiten, wenn ein neues tab gewählt wird, kannst Du sicher auch eine Funktion daran binden, diese kann dann den jeweiligen Button fokusieren. Das select stellt nur den Button in anderen Farben, eben selektiert, dar.


Gruß

Dookie
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo David

No Worries Mate!

Hier ist wieder etwas Code zum
herumexperimetieren Hi:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from   Tkinter   import*
import Pmw

def NoteBookSelect(select):

	currenttab = notebook.getcurselection()
	if currenttab == 'David-1':
		print 'Tab David-1 ist selektiert!'
	elif currenttab == 'David-2':
		print 'Tab David-2 ist selektiert!'
	elif currenttab == 'David-3':
		print 'Tab David-3 ist selektiert!'
	else:
		print 'Es ist kein Tab selektiert!',select

if __name__ == "__main__":
	root = Tk()
	root.wm_geometry('400x400+20+20')

	root.wm_title('TestPmwNoteBook')
	root['bg'] = 'steelblue3'

	notebook = Pmw.NoteBook(root,
					tabpos = 'n',
					borderwidth=2,
					hull_width = 850,
					hull_relief='raised',
					hull_borderwidth=3,
					arrownavigation=1,
					)
	notebook.pack(fill = 'both', expand = 1, padx = 10, pady = 10)

	tab1 = notebook.add('David-1')
	notebook.component('David-1-tab').bind('<Return>' , NoteBookSelect)

	tab2 = notebook.add('David-2')
	notebook.component('David-2-tab').bind('<Return>' , NoteBookSelect)

	tab3 = notebook.add('David-3')
	notebook.component('David-3-tab').bind('<Return>' , NoteBookSelect)

	notebook.selectpage('David-1')

	root = mainloop()
Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo David

Betreffs der Option 'default'. Ich persönlich
glaube, dass diese Option nur Einfluss auf das
Aussehen des Button hat. Die Taste '<Return>'
wirkt nur auf den Button, wenn der Button auch
wirklich den Focus hat. Wie das auch schon unsere
Forum-Kollegen erwähnten. Die Focussierung pas-
siert mit folgender Anweisung:

button.focus_set()

Gruss wuf :wink:
david
User
Beiträge: 30
Registriert: Montag 12. Januar 2004, 14:40

danke für Eure Mühe!
manchmal muss man euch echt die würmer aus der Nase ziehen
Das war keine Absicht, ich bin nur zunächst davon ausgegangen, dass das obige Problem darauf keinen Einfluss hat und wollte Euch Unmengen von Code ersparen und das Problem einfach halten. :wink:

@Dookie und wuf:
Danke! Ich werde mal ein wenig rumspielen und mich dann wieder melden. Kann aber ein wenig dauern. Denn eigentlich sollte ich mich auf eine Prüfung vorbereiten und die Finger von Python lassen.... :roll:

Grüße, david
Antworten