Posts: 2
Threads: 1
Joined: May 2019
I have checkboxes in a secondary tkinter window (not root) that only return an IntVar of 0 even when selected. This is not a problem in the main window.
I have the code working in the main root window and when selected, the checkboxes return 1 and not 0, however when using the exact same code in a separate tkinter window it returns only 0's. I have added window2.mainloop() at the end which did nothing.
button_list = [] #create list to hold checkbox values
def done_press(): #what to do when done button pressed
for x in range(len(data)):
print(button_list[x].get())
play = Tk() #second window called play
row=[1,2,3,4,5,6,7,8,9]
Label(play, text='Whats on').grid(row=0, column=0, padx=30, pady=20, columnspan=3)
for box in range(len(data)): #create checkboxes
button_list.append(IntVar()) #append checkbox list for each selected
button = Checkbutton(play, text=data[box], variable=button_list,)
button.grid(column=0,row=row[box], pady=5, padx=30)
done = Button(play, text='Done', command=done_press)
done.grid(column=0,row=11, columnspan=2)
play.mainloop() any help would be appreciated, thanks.
Posts: 2,168
Threads: 35
Joined: Sep 2016
May-26-2019, 09:46 AM
(This post was last modified: May-26-2019, 09:46 AM by Yoriz.)
The code shown does not run, there is no tkinter import and data has not been defined.
Unable to compare if you are using the exact same code in main root window as secondary window as only one windows code is shown.
In the code shown when the Checkbutton's are created instead of each individual IntVar being passed as an argument to parameter variable, the whole button_list is being passed.
Posts: 2
Threads: 1
Joined: May 2019
(May-26-2019, 09:37 AM)Yoriz Wrote: The code shown does not run, there is no tkinter import and data has not been defined.
Unable to compare if you are using the exact same code in main root window as secondary window as only one windows code is shown.
In the code shown when the Checkbutton's are created instead of each individual IntVar being passed as an argument to parameter variable, the whole data list is being passed.
Sorry, i tried to keep the snippet of code as short as possible so it was easier to understand, here is code that could be copy and pasted into IDLE:
from tkinter import *
data = ['a','b','c','d','e','f','g','h','i']
button_list = [] #create list to hold checkbox values
def done_press(): #what to do when done button pressed
for x in range(len(data)):
print(button_list[x].get())
play = Tk() #second window called play
row=[1,2,3,4,5,6,7,8,9]
Label(play, text='Whats on').grid(row=0, column=0, padx=30, pady=20, columnspan=3)
for box in range(len(data)): #create checkboxes
button_list.append(IntVar()) #append checkbox list for each selected
button = Checkbutton(play, text=data[box], variable=button_list,)
button.grid(column=0,row=row[box], pady=5, padx=30)
done = Button(play, text='Done', command=done_press)
done.grid(column=0,row=11, columnspan=2)
play.mainloop() I now see that this doesnt even work when the window is the main window... do you know how i would make it so that each individual IntVar is passed as an argument to parameter variable?
Posts: 2,168
Threads: 35
Joined: Sep 2016
Please see the following thread
https://python-forum.io/Thread-Namespace...th-imports
Consider learning classes for GUI code
https://python-forum.io/Thread-Classes-Class-Basics
The code below has comments on how to fix and improve the code.
# from tkinter import * # don't flood the namespace with * imports
import tkinter as tk # add tk. infront of following tkinter objects
checkbox_texts = [
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
] # give variables a more descriptive name
checkbox_variables = []
def done_press():
# for x in range(len(data)): # don't use the index to iterate the items
# print(button_list[x].get())
for checkbox in checkbox_variables: # iterating the items directly
print(checkbox.get())
play = tk.Tk()
# row=[1,2,3,4,5,6,7,8,9] # not required can use enumerate on list items
tk.Label(play, text="Whats on").grid(row=0, column=0, padx=30, pady=20, columnspan=3)
# for box in range(len(data)): # don't use the index to iterate the items
for row, text in enumerate(
checkbox_texts, 1
): # iterate actual item and use enumerate to get row value
checkbox_variable = tk.IntVar() # create the varibale
button = tk.Checkbutton(
play, text=text, variable=checkbox_variable
) # use text & checkbox_variable directly
checkbox_variables.append(checkbox_variable) # append checkbox_variable
button.grid(column=0, row=row, pady=5, padx=30) # row from enumerate
btn_done = tk.Button(play, text="Done", command=done_press)
btn_done.grid(column=0, row=11, columnspan=2)
play.mainloop()
|