Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter-使用命令功能_Python_Tkinter - Fatal编程技术网

Python Tkinter-使用命令功能

Python Tkinter-使用命令功能,python,tkinter,Python,Tkinter,我在玩tkinter,我想把它应用到一个我正在努力解决的问题上。基本代码基于位于的“简单Hello World程序”下的教程。 我正在切换到一个目录,创建该目录的列表,并根据找到的文件创建复选按钮。当我当前选中或取消选中其中一个复选按钮时,它会向控制台打印“大家好!” 假设os.listdir()返回: my_list=[file1、file2、file3、file4、file5] 最终,我希望得到一个带有文件名和checkbutton状态的字典,如下所示: 我的遗嘱{file1:1,file2

我在玩tkinter,我想把它应用到一个我正在努力解决的问题上。基本代码基于位于的“简单Hello World程序”下的教程。 我正在切换到一个目录,创建该目录的列表,并根据找到的文件创建复选按钮。当我当前选中或取消选中其中一个复选按钮时,它会向控制台打印“大家好!”

假设os.listdir()返回: my_list=[file1、file2、file3、file4、file5]

最终,我希望得到一个带有文件名和checkbutton状态的字典,如下所示:

我的遗嘱{file1:1,file2:0,file3:0,file4:1,file5:1}

我还需要这个实时更新,直到程序结束

如果我单独手动创建每个复选按钮,我可以做到这一点,但是文件的数量会不时变化,我不希望每次添加或删除文件时都要回来更改脚本

如何获取每个生成的checkbutton的变量,并随时在字典中更新该值

import tkinter as tk
import os

os.chdir('c:\\some\\path\\here')
my_list = os.listdir()
class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()

    def create_widgets(self):
    for filename in my_list:
        var = tk.IntVar()
        self.filename = tk.Checkbutton(self, text=filename, variable=var, command=self.check_state)
        self.items[filename] = var #this is where i'm getting the 'application has no member' error
        self.filename.pack(side="top")

    self.quit = tk.Button(self, text="Cancel",
                          command=self.master.destroy)
    self.quit.pack(side="bottom")

def check_state(self):
    my_dict = {filename:self.items[filename].get() for filename in self.items} #getting the same 'application has no member' error here as well
    print(my_dict)


root = tk.Tk()
app = Application(master=root)
app.mainloop()

您可以使用一个
dict
,filename作为键,
IntVar
作为值,然后在
check\u state()中生成所需的
dict


“每次添加或删除文件时。”:您没有演示如何执行此操作,而是从
我的列表中创建一次
按钮。要删除
按钮
您需要一个引用或使其成为
self.destroy()
按钮由create\u widgets函数生成。这些文件不会自动添加或删除。在大多数情况下,这些文件将保持不变。但是,它们将定期添加。这似乎正朝着我需要的方向发展。我修改了代码以反映这些更改,但出现错误“应用程序实例没有“items”成员”。我以前从未遇到过这个错误。你能详细解释一下为什么我会收到这个吗?如果没有你修改过的代码,我很难提供帮助。我更新了上面的代码,并在问题行旁边添加了注释。具体导致问题的部分是每行中的“self.items”。您没有在
create_widgets()
中包含更改
self.items={}
。您是正确的。我完全忽略了那条线。我感谢你的帮助。我已将此标记为答案。我可以在这里做我需要的其他事情。
def create_widgets(self):
    self.items = {}   # holds filename:IntVar
    for filename in my_list:
        var = tk.IntVar()
        cb = tk.Checkbutton(self, text=filename, variable=var, command=self.check_state)
        cb.pack(side="top")
        self.items[filename] = var

    self.quit = tk.Button(self, text="Cancel", command=self.master.destroy)
    self.quit.pack(side="bottom")

def check_state(self):
    print("hi there, everyone!")
    my_dict = {filename:self.items[filename].get() for filename in self.items}
    print(my_dict)
    # or use self.my_dict if it is used by other instance functions