【问题标题】:How to create multiple checkbox in loop using tkinter如何使用 tkinter 在循环中创建多个复选框
【发布时间】:2019-05-30 00:42:44
【问题描述】:

我是使用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()

点击按钮设置路径后,我想使用浏览功能将目录的所有文件显示为复选框

【问题讨论】:

  • 您将所有复选框放在一个位置c.place(x=0,y=100),这样您就看不到它们了。最好使用pack()grid() - 它们更有弹性。

标签: python-3.x checkbox tkinter


【解决方案1】:

我看到三个问题

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

  2. 每个Checkbutton 都需要自己的IntVar,您可以将其保存在列表或字典中。

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

示例展示了如何使用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()

【讨论】:

  • 谢谢。我有文件,但它正在进入屏幕。如何添加滚动条?
  • 很容易将滚动条添加到Listbox,但不能添加到小部件组。唯一的解决方案是将Checkbuttons 放入FrameFrame 放入Canvas,然后您可以滚动Canvas。你可以找到一些例子。昨天是关于 SO 的事件问题
  • 我在 GitHub scrolled-frame.py 上放了滚动框架的例子@
猜你喜欢
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2021-11-22
  • 2020-11-22
  • 2020-05-31
相关资源
最近更新 更多