Python Tkinter - Использование функции команды - PullRequest
0 голосов
/ 09 марта 2020

Я играю с tkinter, и я хотел применить это к проблеме, которую пытаюсь решить. базовый код основан на учебном пособии, найденном в разделе «Простая программа Hello World», найденном по адресу https://docs.python.org/3/library/tkinter.html. Я перехожу в каталог, создаю список этого каталога и создаю флажки на основе найденных там файлов. Когда я проверяю или убираю галочку с одной из кнопок в настоящий момент, она печатает "Привет всем!" на консоль.

Предположим, что os.listdir () возвращает: my_list = [file1, file2, file3, file4, file5]

в конечном счете, я хочу получить словарь с именем файла и состоянием флажка, например это:

my_dict {файл1: 1, файл2: 0, файл3: 0, файл4: 1, файл5: 1}.

Мне также нужно обновить это в режиме реального времени, пока программа не закончится.

Я мог бы сделать это, если бы вручную создавал каждую кнопку-флажок по отдельности, но время от времени менялось число файлов, и мне не пришлось бы возвращаться и менять свой сценарий каждый раз, когда файл добавляется или удаляется. ,

Как получить переменную каждой сгенерированной кнопки-флажка и обновлять это значение в словаре каждый раз, когда он отмечен / не отмечен?

import tkinter as tk
import os

os.chdir('c:\\some\\path\\here')
my_list = os.listdir()
class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()

    def create_widgets(self):
    for filename in my_list:
        var = tk.IntVar()
        self.filename = tk.Checkbutton(self, text=filename, variable=var, command=self.check_state)
        self.items[filename] = var #this is where i'm getting the 'application has no member' error
        self.filename.pack(side="top")

    self.quit = tk.Button(self, text="Cancel",
                          command=self.master.destroy)
    self.quit.pack(side="bottom")

def check_state(self):
    my_dict = {filename:self.items[filename].get() for filename in self.items} #getting the same 'application has no member' error here as well
    print(my_dict)


root = tk.Tk()
app = Application(master=root)
app.mainloop()

1 Ответ

0 голосов
/ 09 марта 2020

Вы можете использовать dict с именем файла в качестве ключа и IntVar в качестве значения, а затем сгенерировать необходимое dict в check_state():

def create_widgets(self):
    self.items = {}   # holds filename:IntVar
    for filename in my_list:
        var = tk.IntVar()
        cb = tk.Checkbutton(self, text=filename, variable=var, command=self.check_state)
        cb.pack(side="top")
        self.items[filename] = var

    self.quit = tk.Button(self, text="Cancel", command=self.master.destroy)
    self.quit.pack(side="bottom")

def check_state(self):
    print("hi there, everyone!")
    my_dict = {filename:self.items[filename].get() for filename in self.items}
    print(my_dict)
    # or use self.my_dict if it is used by other instance functions
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...