Hi Jane, On Tue, 24 Jul 2012 13:45:38 +0000 (UTC) Jane <jgris...@gmail.com> wrote: > Mark Summerfield <list <at> qtrac.plus.com> writes: > > > > > 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? [snip]
> Hi ... > > Found that setting the ttk.Checkbutton style to 'TButton' forces it to > appear as themed button; then, on selection, changing it to 'Toolbutton' > gives it a 'sunken' appearance. Works ok under Windows 7. > > cb1 = ttk.Checkbutton(f, style='Demo.TButton', > image=(self.noletters, 'selected', > self.letters), command=lambda: self._cb_value_changed(cb1)) > > def _cb_value_changed(self, cb): > # if a checkbutton is selected, use the 'Toolbutton' > # style to make it appear 'sunken' > if 'selected' in cb.state(): > cb['style'] = 'Demo.Toolbutton' > else: > cb['style'] = 'Demo.TButton' I tried your idea on Windows 7 & Linux (& a slightly simplified version which did the same). Yes, it correctly changes the appearance between raised and sunken: but in the sunken state the width of the button shrinks to fit the text -- and there's no width property for styled buttons:-( Here's the code: ############################################################ import tkinter.ttk class Window(tkinter.ttk.Frame): def __init__(self, master=None): super().__init__(master) self.toggle1 = tkinter.ttk.Button(self, text="Off (1)", command=lambda *args: self.toggle(self.toggle1, 1)) self.toggle1.pack(padx=5, pady=5) self.toggle2 = tkinter.ttk.Button(self, text="Off (2)", style="Toolbutton", command=lambda *args: self.toggle(self.toggle2, 2)) self.toggle2.pack(padx=5, pady=5) self.toggle3 = tkinter.ttk.Button(self, text="Off (3)", command=lambda *args: self.toggle(self.toggle3, 3)) 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") self.toggle4 = tkinter.ttk.Checkbutton(self, style="Toggle.TButton", text="Off (4)", command=lambda *args: self.toggle_style(self.toggle4, 4)) self.toggle4.pack(padx=5, pady=5) tkinter.ttk.Button(self, text="Quit", command=self.master.destroy).pack(padx=5, pady=5) self.pack() def toggle_style(self, button, number): if button.instate(("selected",)): button.config(text="Off ({})".format(number)) button.config(style="Toolbutton") else: button.config(text="On ({})".format(number)) button.config(style="Toggle.TButton") def toggle(self, button, number): if button.instate(("!selected",)): button.state(("selected",)) button.config(text="On ({})".format(number)) else: button.state(("!selected",)) button.config(text="Off ({})".format(number)) window = Window() window.master.title("Toggle") window.master.mainloop() ############################################################ -- Mark Summerfield, Qtrac Ltd, www.qtrac.eu C++, Python, Qt, PyQt - training and consultancy "Programming in Go" - ISBN 0321774639 http://www.qtrac.eu/gobook.html _______________________________________________ Tkinter-discuss mailing list Tkinter-discuss@python.org http://mail.python.org/mailman/listinfo/tkinter-discuss