【问题标题】:Kivy Language Dynamic Checkbox ListKivy 语言动态复选框列表
【发布时间】:2015-08-30 20:41:15
【问题描述】:

我想在 Kivy 语言中动态添加复选框。我知道如何在 python 中实现这一点,但不知道如何在 Kivy 语言中实现这一点。 下面列表中的每个文件都应该有一个复选框:

 from kivy.uix.filechooser import FileSystemLocal
 file_system = FileSystemLocal()
 file_list=file_system.listdir(App.get_running_app().user_data_dir+'\\')   # this returns a list of files in dir
 file_list=[x for x in file_list if x[-4:]=='.csv']

如何循环这个 Kivy?我假设应该在右侧循环,因为那是 python 代码。但我不知道怎么做?任何初学者都会有所帮助。

编辑

class MergeScreen(Screen):
    result_label=''
    check_boxes={}
    def __init__(self,**kwargs):
        self.name='MergeScreen'
        super(MergeScreen, self).__init__(**kwargs)
        b=BoxLayout(orientation='vertical')
        file_system = FileSystemLocal()
        file_list=file_system.listdir(App.get_running_app().user_data_dir+'\\')   # this returns a list of files in dir
        file_list=[x for x in file_list if x[-4:]=='.csv']
        for file_1 in file_list:
            g=GridLayout(cols=2)
            c=CheckBox()
            l=Label(bold= True,font_size=20,text=file_1)
            self.check_boxes[c]=file_1
            g.add_widget(l);g.add_widget(c)
            b.add_widget(g)
        g=GridLayout(cols=2)
        l=Label(bold= True,font_size=20,text='Result Name')
        t=TextInput(font_size=25)
        self.result_label=t
        g.add_widget(l)
        g.add_widget(t)
        b.add_widget(g)
        g_options=GridLayout(cols=2)
        g_options.add_widget(Button(text="Okay",on_press=self.create_result))
        g_options.add_widget(Button(text="Back",on_press=self.return_back))
        b.add_widget(g_options)
        self.add_widget(b)        
    def return_back(self,btn):
        self.parent.current = 'ExperimentSelectScreen'    
    def create_result(self,btn):
        file_list=[]
        root_dir= App.get_running_app().user_data_dir+'\\'
        for key, value in self.check_boxes.iteritems():
            if key.active==True:
                file_list.append(root_dir+'\\'+value)
        result_name=self.result_label.text+'.csv'
        result_dir=root_dir+'results'
        if os.path.exists(result_dir)==False:os.makedirs(result_dir)
        result_path=result_dir+'\\'+result_name
        fout=open(result_path,"w+")
        # # first file:
        for line in open(file_list[0]):
            fout.write(line)
        # # now the rest:    
        for num in file_list[0:]:
            f = open(num)
            f.next() # skip the header
            for line in f:
                fout.write(line)
            f.close() # not really needed
        fout.close()
        file_create=Popup(title='Confirmation',content=Label(text="Merged File has stored at\n"+result_path)\
                ,size_hint=(.75,.75),auto_dismiss=True)
        file_create.open()
        Clock.schedule_interval(file_create.dismiss, 3) 

问题是如果创建了文件,我怎么能添加复选框,因为init() 只运行一次。我每次都重启应用。

【问题讨论】:

    标签: android python checkbox kivy


    【解决方案1】:

    您不能在 kv 语言中动态添加小部件,除非在例如写 self.add_widget(Something()) 之类的东西。一个事件绑定,例如on_press。不过,我认为它不适合您正在做的事情,这听起来像是您应该在 Python 端完成的任务。

    【讨论】:

    • 谢谢@inclement。在类的什么方法里面应该这样做? build()? kivy中大部分代码的问题。所以我用kivy语言添加了相关的屏幕。如何在 Python 中从头开始定义它的布局?
    • 这取决于你,取决于你的程序的结构,但请记住,用 kv 语言实例化的所有东西仍然是一个 python 对象。这意味着例如您可以使用一个类的__init__ 来创建它的子类。
    • 我在这里有点困惑。如果我在python中定义屏幕,是不是不能通过kivy代码将它添加到屏幕管理器中。
    • 请立即编辑问题。在只有一个屏幕的应用程序中,我可以使用build(),但是如何在另一个屏幕中定义布局?
    • 听从您的建议,请检查我的代码。问题是如果创建了文件,我该如何添加复选框,因为init() 只运行一次。我每次都重启应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 2018-05-02
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多