VRage
VRage

Reputation: 1498

How to change on_press "animation" of Tkinter button in python

i have a taskbar-like Frame, which contains custom Buttons with images. But everytime i click on this button, Tkinter displaced the button 1px to the right/buttom.

Button clicked

Is it possible to override this behaviour? Or do i have to derived from Tkinter.Label instead of Tkinter.Button ?

edit: Adding some code: import Tkinter import logging

logger = logging.getLogger(__name__)
class DesktopBtn(Tkinter.Button):
    '''
    Represents a Button which can switch to other Desktops
    '''

    _FONTCOLOR="#FFFFFF"

    def getRelativePath(self,folder,name):
        import os
        dir_path = os.path.dirname(os.path.abspath(__file__))
        return os.path.abspath(os.path.join(dir_path, '..', folder, name))

    def __init__(self, parent,desktopManager,buttonName, **options):
        '''
        :param buttonName: Name of the button

        '''
        Tkinter.Button.__init__(self, parent, **options)
        logger.info("init desktop button")
        self._imagePath=self.getRelativePath('res','button.gif')
        self._BtnPresspath = self.getRelativePath('res','buttonP.gif')
        self._BtnPressImage = Tkinter.PhotoImage(file=self._BtnPresspath)
        self._image = Tkinter.PhotoImage(file=self._imagePath)
        self.bind('<ButtonPress-1>',self._on_pressed)
        self.bind('<ButtonRelease-1>',self._on_release)
        self._parent = parent
        self._btnName = buttonName
        self._desktopManager = desktopManager
        self.config(width=70, height=65,borderwidth=0,compound=Tkinter.CENTER,font=("Arial", 9,"bold"),foreground=self._FONTCOLOR, text=buttonName,wraplength=64,image=self._image, command=self._onClickSwitch)

    def _on_pressed(self,event):
        self.config(relief="flat")
        self.config(image=self._BtnPressImage)

    def _on_release(self,event):
        self.config(image=self._image)

    def _onClickSwitch(self):
        self.config(relief="flat")
        logger.info("Buttonclickmethod onClickSwitch")
        self._desktopManager.switchDesktop(self._btnName)

    def getButtonName(self):
        return self._btnName

Upvotes: 2

Views: 7744

Answers (3)

Fabian Drăgușanu
Fabian Drăgușanu

Reputation: 1

I think I found some kind of a solution using relief and border:

closebut = Button(title, text="X", relief=SUNKEN, bd=0, command=close)
closebut.pack(side=RIGHT)

You can observe that I used relief = SUNKEN and then bd = 0 to get a nice FLAT effect on my button!

Upvotes: 0

Mandera
Mandera

Reputation: 2992

You can disable the animation of a button by returning "break" in the widget's bind, which stops the propagation of bound functions.

So you can either alter the function you normally have bound to the button to return "break".

Or you can add another bind, this does however prevent any binds that are made after this one:

tkButton.bind("<Button-1>", lambda _: "break", add=True)

Upvotes: 3

tobias_k
tobias_k

Reputation: 82889

Not sure whether this works with your specialized button, but how the button moves when it's clicked seems to depend on it's relief style. With relief=SUNKEN, the button seems not to move at all when clicked, and with borderwidth=0 it appears to be indistinguishable from a FLAT button.

Minimal example:

root = Tk()
image = PhotoImage(file="icon.gif")
for _ in range(5):
    Button(root, image=image, borderwidth=0, relief=SUNKEN).pack()
root.mainloop()

Note that you set and re-set the relief to FLAT multiple times in your code, so you might have to change them all for this to take effect.

Upvotes: 1

Related Questions