Python 如何确定动态创建时选择的复选按钮?

Python 如何确定动态创建时选择的复选按钮?,python,tkinter,Python,Tkinter,我正在tkinter中创建一个自定义文件选择器。我正在创建一个由代表目录中文件的复选按钮组成的网格。现在我只想得到一个用户选择的文件名列表。到目前为止,我的代码很好地显示了gui,但当我试图确定用户选中了哪些框时,它不起作用。我不确定我做错了什么。很可能是我为checkbutton设置变量的方式。我知道这对python专业人士来说很容易,但我不是专业人士,所以非常感谢您的帮助。请参阅下面的代码。为大量的代码提前道歉,但我不确定哪里出了问题,所以我把它全部放进去了 标记 gui类: 定义初始(自我

我正在tkinter中创建一个自定义文件选择器。我正在创建一个由代表目录中文件的复选按钮组成的网格。现在我只想得到一个用户选择的文件名列表。到目前为止,我的代码很好地显示了gui,但当我试图确定用户选中了哪些框时,它不起作用。我不确定我做错了什么。很可能是我为checkbutton设置变量的方式。我知道这对python专业人士来说很容易,但我不是专业人士,所以非常感谢您的帮助。请参阅下面的代码。为大量的代码提前道歉,但我不确定哪里出了问题,所以我把它全部放进去了

标记

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()