使用tkinter in函数从列表输入中返回子列表

时间:2019-07-11 14:35:46

标签: python tkinter

我试图定义一个可调用函数,该函数应将大量项目作为输入,并通过与用户交互返回已检出项目的子列表。

我对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 :(得分:0)

您应该在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