Python Forum
Tkinter:Unable to bind and unbind function with a button - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/Forum-Python-Coding)
+--- Forum: GUI (https://python-forum.io/Forum-GUI)
+--- Thread: Tkinter:Unable to bind and unbind function with a button (/Thread-Tkinter-Unable-to-bind-and-unbind-function-with-a-button)



Tkinter:Unable to bind and unbind function with a button - shallanq - Mar-27-2020

I'm having trouble binding and unbinding a function(using 2 buttons) to display a keyboard.

I basically want keyboard()to be hidden first, but when the
morn_med_button is clicked, it will appear and it will disappear when confirm_button1 is clicked.

When i run the code, it says:
return self.func(*args)
TypeError:keyboard() takes 0 positional arguments but 1 was given

This is my code below.

from tkinter import *
import RPi.GPIO as GPIO
from tkinter import ttk
from tkinter import font as tkfont
import time


root = Tk()
root.geometry("2000x1900")
root.config(bg="light blue")
root.frame = Frame(root)

morn_med_Text=Text(root,width=20,height=13)
morn_med_label=Label(root,bg="light blue", font=("Arial",15 ))
morn_med_button = Button(root, text="Add Medication", command=add_medication1, font=("Arial", 12))  
morn_med_button.place(relx=0.2, rely = 0.76, anchor = CENTER)
confirm_button1=Button(root, text="Confirm", command=confirm1, font=("Arial", 12)) 


def confirm1():
    global morn_med_label
    morn_med=morn_med_Text.get("1.0",END)
    morn_med_label.place(relx=0.179, rely =0.82, anchor = CENTER)
    morn_med_Text.place_forget()
    confirm_button1.place_forget()
    morn_med_button.place(relx=0.2, rely = 0.76, anchor = CENTER)
    morn_med_label.config(text=morn_med)
    [u]confirm_button1.bind("<Button-1>",keyboard)[/u]


def keyboard():
    morn_med_button.unbind("<Button-1>")
    def select(value):
        if value == "Clear":
            morn_med_Text.delete(1.0,END)
        elif value == "Enter":
             morn_med_Text.insert(INSERT,'\n')
        elif value=="Backspace":
            text=morn_med_Text.get(1.0,END)
            morn_med_Text.insert(text[:-1],END)
        else:
            morn_med_Text.insert(END, value)
    buttons=[
    'q','w','e','r','t','y','u','i','o','p','Backspace','7','8','9','-',
    'a','s','d','f','g','h','j','k','l','(',')','4','5','6','+',
    'z','x','c','v','b','n','m',',','.','Clear','Enter','1','2','3','/',
    ' ',
]

    label1=Label(root,text='')
    label2=Label(root,text='')
    label2.grid(row=7,columnspan=15)
    label3=Label(root,text='')
    label3.grid(row=8,columnspan=15)
    varRow=9
    varColumn=0

    for button in buttons:
        command=lambda x=button: select(x)
        if button!=" ":
            Button(root,text=button,width=7,bg="#000000",fg="#ffffff",
                       activebackground="#ffffff",activeforeground="#000000",relief='raised',padx=9,
                       pady=9,bd=7,command=command,font=("Arial",17 )).grid(row=varRow,column=varColumn)
        if button==" ":
            Button(root,text=button,width=80,bg="#000000",fg="#ffffff",
                       activebackground="#ffffff",activeforeground="#000000",relief='raised',padx=4,
                       pady=4,bd=7,command=command,font=("Arial",20 )).grid(row=13,columnspan=20)
        varColumn+=1
        if varColumn>14 and varRow==9:
            varColumn=0
            varRow+=1
        if varColumn>14 and varRow==10:
            varColumn=0
            varRow+=1

root.mainloop()



RE: Tkinter:Unable to bind and unbind function with a button - deanhystad - Mar-27-2020

When binding events in tkinter, the fuction you bind needs an event argument. The function you are binding has no arguments.


RE: Tkinter:Unable to bind and unbind function with a button - joe_momma - Mar-28-2020

declare your functions before you create the buttons unless you create a class
python reads your script from top to bottom:
def add_medication1():
    keyboard()
 
def confirm1():
    global morn_med_label,confirm_button1
    morn_med=morn_med_Text.get("1.0",END)
    morn_med_label.place(relx=0.179, rely =0.82, anchor = CENTER)
    morn_med_Text.place_forget()
    confirm_button1.place_forget()
    morn_med_button.place(relx=0.2, rely = 0.76, anchor = CENTER)
    morn_med_label.config(text=morn_med)
    confirm_button1.bind("<Button-1>",keyboard) 
morn_med_Text=Text(root,width=20,height=13)
morn_med_Text.place(x=300,y=300)
morn_med_label=Label(root,bg="light blue", font=("Arial",15 ))
morn_med_button = Button(root, text="Add Medication", command=add_medication1, font=("Arial", 12))  
morn_med_button.place(relx=0.2, rely = 0.76, anchor = CENTER)
confirm_button1=Button(root, text="Confirm", command=confirm1, font=("Arial", 12))
confirm_button1.place(x=5,y=400)
if you bind a mouse event to a function it requires an argument
def keyboard(event):
    morn_med_button.unbind("<Button-1>")
    def select(value):
        ....# more       
I used event but it could be anything you want- then you can get information from the event like x= event.x to give you the x,y position of the mouse click