我试图定义一个可调用函数,该函数应将大量项目作为输入,并通过与用户交互返回已检出项目的子列表。
我对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”未定义
答案 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