Как получить и сохранить имена флажков в списке с помощью tkinter, python 3.6.5 - PullRequest
0 голосов
/ 23 мая 2018

Я хотел бы использовать 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']" в оболочке при нажатии кнопки.

1 Ответ

0 голосов
/ 23 мая 2018

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

Замена флажков на приведенный ниже класс сделает это.

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)
...