Python_User
Python_User

Reputation: 37

Both Checkboxes Checked when one clicked

I am making an app for a project called the organizer. It is an organization app. I have an issue that when you check one check box, they all check off.

How do I fix this?

After ran go to: Checklist -> Enter A Value -> Click "Add Assignment" -> Repeat A few times -> try to click one

Also, my .update() works, but still seems to cause an error? Do you know why?

Thanks!

import tkinter as tk
root = tk


AsgnList = []
#Initialization
class TheOrganizer(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)


        container = tk.Frame(self)         
        self.geometry('500x500')        
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for F in (StartPage, AddAsgnPage):        

            frame = F(container, self)    
            self.frames[F] = frame    
            frame.grid(row=0, column=0, sticky="nsew")


        self.show_frame(StartPage)

    def show_frame(self, cont):
        frame = self.frames[cont]               
        frame.tkraise()


def RunApp():
    app = TheOrganizer()    
    app.title('The Organizer')        
    app.mainloop()





#Making New Pages
'''
Make sure for very new page, you add it to the 'for loop'
'''


HeadFont = ("Verdana", 40)

class StartPage(tk.Frame):    

    def __init__(self, parent, controller):

        tk.Frame.__init__(self,parent)

        LabTitle = tk.Label(self, text="The Organizer", font=HeadFont)      
        LabTitle.pack()

        AddAsgnBtn = tk.Button(self, text='Checklist', command=lambda: controller.show_frame(AddAsgnPage))  
        AddAsgnBtn.place(x=100,y=250)

class AddAsgnPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        LabTitle = tk.Label(self, text="Assignments", font=HeadFont)      
        LabTitle.pack()

        #Input Assignment        
        def getEntry():
            entryInput = AsgnEntry.get()
            AsgnList.append(entryInput)
            yVal = 300
            while 1:
                var = tk.IntVar()        
                for z in AsgnList:             
                    tk.Checkbutton(self, text=z, variable=var).place(x=200,y=yVal)                   
                    yVal += 25                      
                TheOrganizer.update()


        AsgnEntry = tk.Entry(self)
        AsgnEntry.place(x=175,y=205)

        SubBtn = tk.Button(self, text='Add Assignment', command=getEntry)
        SubBtn.place(x=25,y=200)

        BackBtn = tk.Button(self, text='Back', command=lambda: controller.show_frame(StartPage))
        BackBtn.place(x=250,y=400)

Upvotes: 1

Views: 183

Answers (1)

nosklo
nosklo

Reputation: 222852

You are using the same variable for both checkboxes. Move the variable creation to inside the loop, to use different variables.

var_list = []
for z in AsgnList:
    var = tk.IntVar()
    tk.Checkbutton(self, text=z, variable=var).place(x=200,y=yVal)
    yVal += 25         
    var_list.append(var)

That said, you probably want to store the variables so you can check which checkboxes are marked later. So I added a var_list list object to store all created vars.

Upvotes: 1

Related Questions