tkinter возвращает имена динамических флажков - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь написать свой первый скрипт на python & tkinter.

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

Флажки являются динамическими из текстовых файлов.Пример файла:

item1
item2
...
item100

Экран графического интерфейса:

screenshot showing checkbuttons and validate button

Вот мой код:(В # код это то, что я пытался без успеха.)

from tkinter import *
from tkinter.ttk import Frame, Label, Entry
import glob

class Example(Frame):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        self.master.title("My Menu")

        menubar = Menu(self.master)
        self.master.config(menu=menubar)

        fileMenu = Menu(menubar)

        submenu = Menu(fileMenu)
        submenu.add_command(label="lst1", command=self.onDisplay)
        submenu.add_command(label="lst2")
        submenu.add_command(label="lst3")
        fileMenu.add_cascade(label='Listing', menu=submenu, underline=0)

        fileMenu.add_separator()

        fileMenu.add_command(label="Exit", underline=0, command=self.onExit)
        menubar.add_cascade(label="File", underline=0, menu=fileMenu)

    ## Here the function which display checkboxes
    def onDisplay(self):
        self.pack(fill=BOTH, expand=True)
        frame1 = Frame(self)
        frame1.pack(fill=BOTH)
        lbl1 = Label(frame1, text="Choice", width=6)
        path = '/root/liste/*.txt'
        files=glob.glob(path)
        count = 0
        #var = dict()
        for file in files:
            with open(file, 'r') as lst_file:
                for item in lst_file:
                    #var[item]=IntVar()
                    #cb = Checkbutton(frame1, text=item.rstrip(), variable=var[item], command=self.cb)
                    ##Here all checkboxes generated dynamically
                    cb = Checkbutton(frame1, text=item.rstrip())
                    cb.grid(row=count//10, column=count%10)
                    #cb.pack()
                    count += 1
        #btn1 = Button(self, text='Validate', font=("Arial", 12), command=self.cb)
        btn1 = Button(self, text='Validate', font=("Arial", 12))
        btn1.pack(side=RIGHT, padx=5)

    def cb(self):
        print("variable is", self.var.get())

    def onExit(self):

        self.quit()

def main():

    root = Tk()
    root.geometry("800x550+300+300")
    app = Example()
    root.mainloop()


if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 16 ноября 2018

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

Большинство важных изменений были в методе onDisplay() - хотя я также изменил имя метода def cb(self):, которое вам нужно было def validate(self):, чтобы соответствовать имени Button (потому что я нашел его вызывающим cb сбивает с толку, поскольку это также имя локальной переменной в onDisplay()).

from tkinter import *
from tkinter.ttk import Frame, Label, Entry
import glob

class Example(Frame):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):

        self.master.title("My Menu")

        menubar = Menu(self.master)
        self.master.config(menu=menubar)

        fileMenu = Menu(menubar)

        submenu = Menu(fileMenu)
        submenu.add_command(label="lst1", command=self.onDisplay)
        submenu.add_command(label="lst2")
        submenu.add_command(label="lst3")
        fileMenu.add_cascade(label='Listing', menu=submenu, underline=0)

        fileMenu.add_separator()

        fileMenu.add_command(label="Exit", underline=0, command=self.onExit)
        menubar.add_cascade(label="File", underline=0, menu=fileMenu)

    ## Here is the function which displays checkboxes
    def onDisplay(self):
        self.pack(fill=BOTH, expand=True)
        frame1 = Frame(self)
        frame1.pack(fill=BOTH)
        lbl1 = Label(frame1, text="Choice", width=6)
#        path = '/root/liste/*.txt'
        path = './root_liste1.txt'  # changed for my testing.
        files=glob.glob(path)

        self.var = dict()
        count = 0
        for file in files:
            with open(file, 'r') as lst_file:
                for item in lst_file:
                    item = item.rstrip()
                    status = BooleanVar()
                    self.var[item] = status
                    cb = Checkbutton(frame1, text=item, variable=status)
                    cb.grid(row=count//10, column=count%10)
                    count += 1

        btn1 = Button(self, text='Validate', font=("Arial", 12),
                      command=self.validate)
        btn1.pack(side=RIGHT, padx=5)

    def validate(self):  # btn1 callback
        print('checked items:')
        for item, status in self.var.items():
            if status.get():  # Checked?
                print('  ', item)

    def onExit(self):
        self.quit()

def main():
    root = Tk()
    root.geometry("800x550+300+300")
    app = Example()
    root.mainloop()


if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...