Использование tkinter в функции для возврата подсписка из списка ввода - PullRequest
0 голосов
/ 11 июля 2019

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

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

items = ['screw driver', 'belt', 'nut','hammer','tape','ducked tape','drill']
def choose_items(item_list):
import tkinter as tk

class App(object):
    def __init__(self):

        def click(event):
            button.config(bg='green')

        root = tk.Tk()
        root.title('Choose items')
        text = tk.Text(root, cursor='arrow')
        vsb = tk.Scrollbar(root, command=text.yview)
        button = tk.Button(root, text='Add items', command=addtolist)
        button2 = tk.Button(root, text='Quit', command=root.destroy)
        text.configure(yscrollcommand=vsb.set)

        button.pack(side='top')
        button2.pack(side='bottom')
        button.bind('<Button-1>',click)
        vsb.pack(side='right',fill='y')
        text.pack(side='left', fill='both', expand=True)

        global varList
        varList = []

        for i in range(len(items)):
            var = tk.StringVar()
            cb = tk.Checkbutton(text, text=item_list[i], variable=var,
                                onvalue=item_list[i], offvalue='')
            varList.append(var)
            text.window_create('end', window=cb)
            text.insert('end','\n')
        text.configure(state='disabled')
        root.mainloop()

def addtolist():
    global lst
    lst = []
    for i in varList:
        if i.get() != ' ':
            lst.append(i.get())

if __name__=='__main__':
    App()

return lst

choose_items(items)

Я ожидаю, что на выходе будут элементы, которые проверял пользователь, но получаю следующее сообщение об ошибке: NameError: имя 'lst' не определено

1 Ответ

0 голосов
/ 11 июля 2019

Вы должны использовать return в вашей функции addtolist. Кроме того, addtolist должен быть методом класса, а не отдельной функцией, поскольку вы циклически перебираете элементы в varList, что также следует сделать атрибутом класса вместо объявления global.

class App(object):
    def __init__(self):
        ...

        self.varList = []

        for i in range(5):
            var = tk.StringVar()
            cb = tk.Checkbutton(text, text=f"Item {i}", variable=var,
                                onvalue=i, offvalue='')
            self.varList.append(var)
            text.window_create('end', window=cb)
            text.insert('end', '\n')
        ...

    def addtolist(self):
        lst = []
        for i in self.varList:
            if i.get() != ' ':
                lst.append(i.get())
        return lst
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...