Sunken-Raised-Buttons

Fragen zu Tkinter.
Antworten
uruk-kai

Samstag 17. Dezember 2005, 13:27

Hallo!

Ich möchte mit Tkinter ein paar Buttons erstellen, die sich bei Mauskontakt senken.
Hier mein Code:

Code: Alles auswählen

def sunken1(a):
    button1.configure(relief="sunken")

def sunken2(a):
    button2.configure(relief="sunken")

def sunken3(a):
    button3.configure(relief="sunken")

def raised1(a):
    button1.configure(relief="raised")

def raised2(a):
    button2.configure(relief="raised")

def raised3(a):
    button3.configure(relief="raised")

button1=Button(root,text="a",width=35,height=2,command=a)
button2=Button(root,text="b",width=35,height=2,command=b)
button3=Button(root,text="c",width=35,height=2,command=c)


button1.bind("<Enter>",sunken1)
button2.bind("<Enter>",sunken2)
button3.bind("<Enter>",sunken3)

button1.bind("<Leave>",raised1)
button2.bind("<Leave>",raised2)
button3.bind("<Leave>",raised3)

button1.pack()
button2.pack()
button3.pack()

Das funktioniert zwar ist aber bei einer größeren Anzahl von Buttons sehr aufwendig.
Geht das auch einfacher?

uruk-kai

Edit (Leonidas): Code in Python-Tags gesetzt.
BlackJack

Samstag 17. Dezember 2005, 22:56

Du könntest Dir für die `raised*()` und `sunken*()` Funktionen eine Factory-Funktion basteln und eine Funktion die diese dann an Buttons bindet (ungetestet):

Code: Alles auswählen

def make_set_relief(button, state):
    def func(dummy):
        button.configure(relief=state)
    return func


def relief_bind(button, event, state):
    button.bind(event, make_set_relief(button, state))

button1=Button(root,text="a",width=35,height=2,command=a)

relief_bind(button1, '<Enter>', 'sunken')
relief_bind(button1, '<Leave>', 'raised')
Besser wäre vielleicht eine eigene Klasse von `Button` abzuleiten, die sich wie gewünscht verhält.
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Sonntag 18. Dezember 2005, 08:51

Hallo,

hier noch ein kleines Beispiel:

Code: Alles auswählen

from Tkinter import *

root = Tk()
anzahl_button = 10
namen = ['a','b','c','d','e','f','g','h','i','j','k','l','m',
         'n','o','p','q','r','s','t','u','v','w','x','y','z']

def sunken(event,button):
    button.configure(relief="sunken")

def raised(event,button):
    button.configure(relief="raised")    

def createButton():
    for b in range(anzahl_button):
        button = Button(root,text=namen[b],width=35,height=2)
        button.bind("<Enter>",lambda ev,button=button:sunken(ev,button))
        button.bind("<Leave>",lambda ev,button=button:raised(ev,button))
        button.pack()
            
createButton()
root.mainloop()
Stephan
BlackJack

Sonntag 18. Dezember 2005, 22:15

Oder man könnte auch einfach den Parameter `overrelief` vom `Button` benutzen. Manchmal kann es sooo einfach sein :-)

Code: Alles auswählen

button = Button(root, text='Test', command=button_command, overrelief=SUNKEN)
uruk-kai

Montag 19. Dezember 2005, 17:47

Jetzt möchte ich noch das auch ein Ton abgespielt wird.
Geht das auch?
BlackJack

Dienstag 20. Dezember 2005, 00:36

Das gehört dann nicht mehr direkt zu `Tkinter`. Dafür würde ich eine Unterklasse vom Button schreiben, die das erledigt. Wie man Töne abspielt ist aber von Betriebssystem zu Betriebssystem unterschiedlich.

edit:

Code: Alles auswählen

from Tkinter import Tk, Button, SUNKEN


class SoundButton(Button):
    def __init__(self, master, enter_sound=None, leave_sound=None, **kwargs):
        Button.__init__(self, **kwargs)
        if enter_sound:
            self.bind('<Enter>', self._make_sound_func(enter_sound))
        if leave_sound:
            self.bind('<Leave>', self._make_sound_func(leave_sound))
    
    def _make_sound_func(self, sound):
        def func(dummy):
            print 'Sound:', sound
        return func


root = Tk()
button = SoundButton(root, 'enter.wav', 'leave.wav', text='Muuusic',
                     overrelief=SUNKEN)
button.pack()
root.mainloop()
Anstelle des ``print`` Befehls muss natürlich die Tonausgabe stehen.
Antworten