如何使用tkinter在循环中创建多个复选框

时间:2017-11-20 06:29:39

标签: python-3.x checkbox tkinter

我是新手使用Tkinter。我想从循环创建多个复选框。我参考Tkinter checkboxes created in loop但我不理解它。 我想将所有文件显示为位于目录中的复选框。

帮帮我并告诉我需要改变什么?

代码:

from tkinter import filedialog,Checkbutton

import tkinter,os

window = tkinter.Tk()

def browse():

    filez = filedialog.askdirectory(parent=window,title='Choose a file')#I choose a directory

    ent1.insert(20,filez)#insert the path of directory to text box
    dirs = os.listdir(filez)#gives all files of direcory
    for file in dirs:
       print(file)#Getting all files
       var = tkinter.IntVar()
       c = tkinter.Checkbutton(window,text=file,variable=var)#Create files to checkox
       c.place(x=0,y=100)



window.title("First Gui")

window.geometry("400x400")
window.wm_iconbitmap("path of icon")

lbl = tkinter.Label(window,text="path")

lbl.place(x=0,y=60)

ent1 = tkinter.Entry(window)

ent1.place(x=80,y=60)

btn1 = tkinter.Button(window,text="Set Path",command=browse)

btn1.place(x=210,y=57)


window.mainloop()

点击按钮设置路径后,我想使用浏览功能

显示目录的所有文件作为复选框

1 个答案:

答案 0 :(得分:1)

我看到三个问题

  1. 您对所有c.place(x=0,y=100)使用Checkbuttons,因此您只能看到最后一个 - 其他隐藏在最后一个后面。

  2. 每个Checkbutton都需要拥有IntVar,您可以将其保留在列表或字典中。

  3. 当您选择新路径时,您必须删除之前的Checkbuttons,因此您必须在列表或字典中记住它们。

  4. 示例显示了如何使用pack()代替place()来轻松放置所有Checkbuttons。它还展示了如何使用字典保留IntVars并检查选择了哪个,以及如何使用列表保留Checkbuttons并稍后从窗口中删除它们。

    import tkinter
    import tkinter.filedialog
    import os
    
    # --- functions ---
    
    def browse():
    
        filez = tkinter.filedialog.askdirectory(parent=window, title='Choose a file')
    
        ent1.insert(20, filez)
    
        dirs = os.listdir(filez)
    
        # remove previous IntVars
        intvar_dict.clear()
    
        # remove previous Checkboxes
        for cb in checkbutton_list:
            cb.destroy()
        checkbutton_list.clear() 
    
        for filename in dirs:
            # create IntVar for filename and keep in dictionary
            intvar_dict[filename] = tkinter.IntVar()
    
            # create Checkbutton for filename and keep on list
            c = tkinter.Checkbutton(window, text=filename, variable=intvar_dict[filename])
            c.pack()
            checkbutton_list.append(c)
    
    def test():
        for key, value in intvar_dict.items():
            if value.get() > 0:
                print('selected:', key)
    
    # --- main ---
    
    # to keep all IntVars for all filenames
    intvar_dict = {}
     # to keep all Checkbuttons for all filenames
    checkbutton_list = []
    
    window = tkinter.Tk()
    
    lbl = tkinter.Label(window, text="Path")
    lbl.pack()
    
    ent1 = tkinter.Entry(window)
    ent1.pack()
    
    btn1 = tkinter.Button(window, text="Select Path", command=browse)
    btn1.pack()
    
    btn1 = tkinter.Button(window, text="Test Checkboxes", command=test)
    btn1.pack()
    
    window.mainloop()