Как получить и сохранить имена флажков в список с помощью tkinter, python 3.6.5

Я хотел бы использовать tkinter и флажки, чтобы выбрать файлы в каталоге и сохранить имена этих файлов в списке, когда я нажимаю кнопку:

import speech_recognition as sr
import playsound
import os
import glob
import unidecode
import pickle
import random
import tkinter
from tkinter.constants import *

ldv = os.listdir("D:/FFOutput/")
i = 0
ldv1 = []
while i < len(ldv):
    ldv1.append(unidecode.unidecode(ldv[i]))
    i += 1
print(ldv1)

root = tkinter.Tk()
frame = tkinter.Frame(root, relief=RIDGE, borderwidth=10)
frame.pack(fill=BOTH, expand=1)
label = tkinter.Label(frame, text="choose file(s)")
label.pack(fill=X, expand=1)


a = 0
while a < len(ldv1):
    bouton = tkinter.Checkbutton(root, text=ldv1[a], command=print(ldv1[a]))
    a += 1
    bouton.pack()

button = tkinter.Button(frame, text="Exit", command=root.destroy)
button.pack(side=BOTTOM)

lr = []

buttonregister = tkinter.Button(root, text="Register checked files names in list lr and close tk")
buttonregister.pack(side=BOTTOM)

print(lr)

root.mainloop()

Когда я нажимаю кнопку регистрации, я хотел бы добавить имена файлов в список lr и закрыть рамку. Пример

В этом примере я хочу напечатать (lr) "['alors soyez pret.mp3','c'est bien.mp3']" в оболочке, когда я нажимаю кнопку.


person Rémi Descamps    schedule 23.05.2018    source источник


Ответы (1)


Чтобы контрольная кнопка содержала значение, необходимо использовать BoolVar (или любую другую переменную) из tkinter. Обычно это довольно утомительно, так как вам придется создавать переменную для каждой кнопки Checkbutton. Этого можно избежать, создав подкласс Checkbutton и добавив хранилище для переменной. Поскольку вам также нужен текст, мы также можем использовать класс для хранения текстового значения.

Замена Checkbuttons классом ниже сделает это.

class CheckBox(tkinter.Checkbutton):
    boxes = []  # Storage for all buttons

    def __init__(self, master=None, **options):
        tkinter.Checkbutton.__init__(self, master, options)  # Subclass checkbutton to keep other methods
        self.boxes.append(self)
        self.var = tkinter.BooleanVar()  # var used to store checkbox state (on/off)
        self.text = self.cget('text')  # store the text for later
        self.configure(variable=self.var)  # set the checkbox to use our var

Затем мы использовали бы класс для создания кнопок следующим образом:

a=0
while a<len(ldv1):
   bouton=CheckBox(tk, text=ldv1[a], command=print(ldv1[a]))  # Replace Checkbutton
   a=a+1
   bouton.pack()

И, наконец, чтобы получить значения, когда окно закрыто, вы можете перебрать CheckBox.buttons для значения каждой кнопки. Вам нужно будет добавить это после основного цикла или добавить его в функцию.

for box in CheckBox.boxes:
    if box.var.get():  # Checks if the button is ticked
        lr.append(box.text)

print(lr)
person Zekii    schedule 23.05.2018
comment
Это работает отлично, спасибо Zekii. Chekbutton должен быть по умолчанию похож на ваш CheckBox. - person Rémi Descamps; 23.05.2018