Python Forum

Full Version: How to disable custom button
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hello,
In my project I use custom widgets.
When I try to disable a button
self.myCustomButton.config(state='disabled')
error occurs:
Error:
unknown option "-state"
Any ideas ?
Thanks
what GUI framework?
(Dec-04-2020, 09:15 AM)buran Wrote: [ -> ]what GUI framework?
tkinter
can you post minimal reproducible example and the full traceback you get?
(Dec-04-2020, 09:33 AM)buran Wrote: [ -> ]can you post minimal reproducible example and the full traceback you get?
Here is custom Button:
from tkinter import *
from tkinter.font import Font
import Utils.Constant as Constant
from time import *
from View.Widget.Widget import Widget

class ButtonWidget(Widget):
    """description of class"""

    def __init__(self, parent, buttonText, buttonWidth, buttonHeight):
        Widget.__init__(self, parent)
    
        self.text = StringVar()
        self.text.set(buttonText)
        self.enabled = True
        self.clicked = False

        self.buttonFont = Font(family=Constant.FontFamily, size=Constant.FontSmallSize)
        self.pixelVirtual = PhotoImage(width=1, height=1)

        self.border = Frame(self, highlightbackground=Constant.LightBlue, highlightcolor=Constant.LightBlue, highlightthickness=1)
        self.button = Button(self.border, relief=FLAT, textvariable=self.text, width=buttonWidth, height=buttonHeight, cursor="hand2",
                        background=Constant.White, foreground=Constant.LightBlue, font=self.buttonFont, image=self.pixelVirtual, compound="c")
        
        self.button.bind("<ButtonPress>", self.onPress)
        self.button.bind("<ButtonRelease>", self.onRelease)

        self.button.pack(expand=True, fill='both')
        self.border.pack()

    def getTkWidget(self):
        return self.button

    def setText(self, buttonText):
        self.text.set(buttonText)

    def onPress(self, event):
        if self.enabled:
            self.border.config(highlightbackground=Constant.LightBlue)

    def onRelease(self, event):
        if self.enabled:
            self.border.config(highlightbackground=Constant.LightBlue)
            self.button.config(foreground=Constant.LightBlue)

    def enable(self):
        self.enabled = True
        self.button.configure(state=NORMAL)
        self.border.configure(highlightbackground=Constant.LightBlue, highlightcolor=Constant.LightBlue)

    def disable(self):
        self.enabled = False
        self.button.configure(state=DISABLED)
        self.border.configure(highlightbackground=Constant.Disabled, highlightcolor=Constant.Disabled)

    def setClicked(self, isClicked):
        self.clicked = isClicked
Here is how I define button and try to disable it:
        MyButton = ButtonWidget(self, "Apply", buttonWidth=40, buttonHeight=15)
        MyButton.config(state='disabled')
And here is output:
Error:
Traceback (most recent call last): File "D:\DATA_PYE\python_source_SpectraMon\Main.py", line 20, in <module> mainWindow = MainWindowView(root) File "D:\DATA_PYE\python_source_SpectraMon\View\MainWindowView.py", line 44, in __init__ self.createView(parent) File "D:\DATA_PYE\python_source_SpectraMon\View\MainWindowView.py", line 66, in createView self.createPages() File "D:\DATA_PYE\python_source_SpectraMon\View\MainWindowView.py", line 152, in createPages self.monitorPage = MonitorView(self.contentFrame) File "D:\DATA_PYE\python_source_SpectraMon\View\MonitorView.py", line 43, in __init__ self.createView() File "D:\DATA_PYE\python_source_SpectraMon\View\MonitorView.py", line 110, in createView self.createMonitorFrame() File "D:\DATA_PYE\python_source_SpectraMon\View\MonitorView.py", line 130, in createMonitorFrame self.createLoopsStatesFrame() File "D:\DATA_PYE\python_source_SpectraMon\View\MonitorView.py", line 382, in createLoopsStatesFrame MyButton.config(state='disabled') File "C:\Users\user1\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1639, in configure return self._configure('configure', cnf, kw) File "C:\Users\user1\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1629, in _configure self.tk.call(_flatten((self._w, cmd)) + self._options(cnf)) _tkinter.TclError: unknown option "-state"
Your ButtonWidget inherits from generic Widget. Widget, unlike Button has no attribute state, so you cannot configure it via Widget.config() method

You have defined ButtonWidget.disable() method. Why not call it directly - MyButton.disable() instead of using MyButton.config()?
Or why not inherit from Button instead of Widget?
Thanks. I didn't notice this disable()
(Dec-04-2020, 01:45 PM)Sancho_Pansa Wrote: [ -> ]I didn't notice this disable()
I thought you wrote it in the first place :-)