Python 如何确定动态创建时选择的复选按钮?
我正在tkinter中创建一个自定义文件选择器。我正在创建一个由代表目录中文件的复选按钮组成的网格。现在我只想得到一个用户选择的文件名列表。到目前为止,我的代码很好地显示了gui,但当我试图确定用户选中了哪些框时,它不起作用。我不确定我做错了什么。很可能是我为checkbutton设置变量的方式。我知道这对python专业人士来说很容易,但我不是专业人士,所以非常感谢您的帮助。请参阅下面的代码。为大量的代码提前道歉,但我不确定哪里出了问题,所以我把它全部放进去了 标记Python 如何确定动态创建时选择的复选按钮?,python,tkinter,Python,Tkinter,我正在tkinter中创建一个自定义文件选择器。我正在创建一个由代表目录中文件的复选按钮组成的网格。现在我只想得到一个用户选择的文件名列表。到目前为止,我的代码很好地显示了gui,但当我试图确定用户选中了哪些框时,它不起作用。我不确定我做错了什么。很可能是我为checkbutton设置变量的方式。我知道这对python专业人士来说很容易,但我不是专业人士,所以非常感谢您的帮助。请参阅下面的代码。为大量的代码提前道歉,但我不确定哪里出了问题,所以我把它全部放进去了 标记 gui类: 定义初始(自我
gui类:
定义初始(自我,主):
self.selectedFileName=StringVar()
#过滤非视频文件类型
包括=['*.mp4','*.py']
includes=r'|'.join([fnmatch.translate(x)表示includes中的x])
#master.attributes('-zomed',True)
self.frame\u头文件=ttk.frame(主文件)
self.frame_header.pack()
ttk.Label(self.frame_header,text=“TerrorForm ScareBox”).grid(行=0,列=0,行span=2)
self.frame_files=ttk.frame(主文件)
self.frame_files.pack()
self.frame\u footer=ttk.frame(主)
self.frame_footer.pack()
#从文件系统中提取文件名
对于os.walk(“./movies”)中的root、dirs和self.files:
self.files=[os.path.join(root,f)表示self.files中的f]
self.files=[f表示self.files中的f,如果重新匹配(包括,f)]
#确定网格中的行数
numfiles=len(self.files)
dividesBy=False
numRows=IntVar()
numColumns=4
while(dividesBy==False):
如果(numfiles%numColumns==0):
numRows=int(numfiles/numColumns)
dividesBy=True
其他:
numfiles+=1
#在网格布局中打印复选框
filmIcon=PhotoImage(file='tf\u film\u icon.gif')
i=0
self.checkedFiles=[None]*len(self.files)
对于范围内的r(numRows):
对于范围(4)内的c:
if(I)“不工作”是什么意思?在我解决缩进问题后,它似乎对我有效。您只打印了一个值,但它似乎将self.chosenFiles
设置为正确的文件数。您如何告诉它打印文件?当我调用getChosenFiles()时它说对象没有属性。当我告诉它打印chosenFiles[0]时,我得到了PY_var2;,我可以确认-它对我也有效。但我有不同的“问题”-我选择了包含子文件夹和数百个文件的文件夹,而您的类工作时间太长-我必须终止进程。请确保代码的格式与您的文件中的格式完全相同。因为它根本不会运行。我关于如何修复它的假设可能与您的能力不匹配。如果看不到实际代码,我们将无能为力。我可以确认我的格式设置是错误的。这解决了我的问题。谢谢。“不工作”是什么意思?在我解决缩进问题后,它似乎对我有效。您只打印了一个值,但它似乎将self.chosenFiles
设置为适当的文件数。您如何告诉它打印文件?当我调用getChosenFiles()时它说对象没有属性。当我告诉它打印chosenFiles[0]时,我得到了PY_var2;,我可以确认-它对我也有效。但我有不同的“问题”-我选择了包含子文件夹和数百个文件的文件夹,而您的类工作时间太长-我必须终止进程。请确保代码的格式与您的文件中的格式完全相同。因为它根本不会运行。我关于如何修复它的假设可能与您的能力不匹配。如果看不到实际代码,我们将无能为力。我可以确认我的格式设置错了。这解决了我的问题。谢谢。
class scareGUI:
def __init__(self, master):
self.selectedFileName = StringVar()
#filter non video file types
includes = ['*.mp4','*.py']
includes = r'|'.join([fnmatch.translate(x) for x in includes])
#master.attributes('-zoomed', True)
self.frame_header = ttk.Frame(master)
self.frame_header.pack()
ttk.Label(self.frame_header, text="TerrorForm ScareBox").grid(row=0, column = 0, rowspan = 2)
self.frame_files = ttk.Frame(master)
self.frame_files.pack()
self.frame_footer = ttk.Frame(master)
self.frame_footer.pack()
#pull file names from file system
for root, dirs, self.files in os.walk('./movies'):
self.files = [os.path.join(root, f) for f in self.files]
self.files = [f for f in self.files if re.match(includes, f)]
#Determine number of rows in grid
numfiles = len(self.files)
dividesBy = False
numRows = IntVar()
numColumns = 4
while (dividesBy == False):
if(numfiles % numColumns == 0):
numRows=int(numfiles/numColumns)
dividesBy = True
else:
numfiles+=1
#Print Check Boxes in Grid layout
filmIcon = PhotoImage(file='tf_film_icon.gif')
i=0
self.checkedFiles=[None]*len(self.files)
for r in range(numRows):
for c in range(4):
if (i<len(self.files)):
self.checkedFiles[i] = IntVar()
checkbutton = ttk.Checkbutton(self.frame_files, text=self.files[i], variable=self.checkedFiles[i])
checkbutton.config(image = filmIcon,compound = TOP)
checkbutton.image = filmIcon
checkbutton.grid(row = r, column = c)
i += 1
def getChosenFiles(self):
self.chosenFiles=[]
for x in range(len(self.files)):
if(self.checkedFiles[x].get()):
self.chosenFiles.append(self.files[x])
print (self.chosenFiles[0])
return self.chosenFiles
def main():
root = Tk()
scaregui = scareGUI(root)
root.mainloop()
if __name__ == "__main__": main()