[Tkinter-discuss] Toggle buttons

Mark Summerfield list at qtrac.plus.com
Thu Jul 12 12:38:37 CEST 2012


Hi,

I want to create a toggle button, i.e., a button that when clicked goes
down (if it is up) and goes up (if it is down).

One easy way to achieve this is to set the button's style to
"Toolbutton" (see self.toggle2). But unfortunately, that gets rid of the
button's relief so it looks out of place amongst other non-toggling
buttons.

I solved if for Linux using a custom style (see self.toggle3). But this
doesn't work on Windows and I can't figure out how to solve it.

Can anyone suggest a solution?

Here's the code I've got:

############################################################
import tkinter.ttk

class Window(tkinter.ttk.Frame):

    def __init__(self, master=None):
        super().__init__(master)
        self.toggle1 = tkinter.ttk.Button(text="Off",
                command=lambda *args: self.toggle(self.toggle1))
        self.toggle1.pack(padx=5, pady=5)
        self.toggle2 = tkinter.ttk.Button(text="Off", style="Toolbutton",
                command=lambda *args: self.toggle(self.toggle2))
        self.toggle2.pack(padx=5, pady=5)
        self.toggle3 = tkinter.ttk.Button(text="Off", 
                command=lambda *args: self.toggle(self.toggle3))
        self.toggle3.pack(padx=5, pady=5)
        style = tkinter.ttk.Style()
        style.configure("Toggle.TButton")
        style.map("Toggle.TButton", relief=[("pressed", "sunken"),
            ("selected", "sunken"), ("!selected", "raised")])
        self.toggle3.config(style="Toggle.TButton")
        tkinter.ttk.Button(text="Quit",
                command=self.master.destroy).pack(padx=5, pady=5)
        self.pack()

    def toggle(self, button):
        if button.instate(("!selected",)):
            button.state(("selected",))
            button.config(text="On")
        else:
            button.state(("!selected",))
            button.config(text="Off")


window = Window()
window.master.title("Toggle")
window.master.mainloop()
############################################################

Thanks!

-- 
Mark Summerfield, Qtrac Ltd, www.qtrac.eu
    C++, Python, Qt, PyQt - training and consultancy
        "Programming in Python 3" - ISBN 0321680561
            http://www.qtrac.eu/py3book.html


More information about the Tkinter-discuss mailing list