Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.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 如何将我的变量从这个循环中取出?-搅拌机_Python_Object_For Loop_Import_Blender - Fatal编程技术网

Python 如何将我的变量从这个循环中取出?-搅拌机

Python 如何将我的变量从这个循环中取出?-搅拌机,python,object,for-loop,import,blender,Python,Object,For Loop,Import,Blender,我正在尝试制作一个脚本,读取一个.txt(存储.obj名称的地方),然后在blender中制作costum按钮。如果单击其中一个按钮,它将根据txt中的名称打开文件 它可以工作,但只会打开列表上的最后一个obj 我怎样才能修好它?我想让它工作 到目前为止,我的代码是: import bpy class directoryPan(bpy.types.Panel): bl_space_type = "VIEW_3D" bl_region_type = "TOOLS"

我正在尝试制作一个脚本,读取一个.txt(存储.obj名称的地方),然后在blender中制作costum按钮。如果单击其中一个按钮,它将根据txt中的名称打开文件

它可以工作,但只会打开列表上的最后一个obj

我怎样才能修好它?我想让它工作

到目前为止,我的代码是:

import bpy 

class directoryPan(bpy.types.Panel):
    bl_space_type = "VIEW_3D"       
    bl_region_type = "TOOLS"        
    bl_label = "Biblio"    
    bl_category = "Import"        #

    def draw(self, context):        

        self.layout.row().label("Import :")
        self.layout.operator("import.stuff", icon ='FILE')
        obj_list = []

        biblio_one = open("C:\\Users\\Jasmin\\Desktop\\liste.txt")

        for line in biblio_one:
           obj_list.append(line.rstrip())
        biblio_one.close()

        print("start")

        for i in obj_list:
            newbutton = i 
            import_obj = "import." + i

            self.layout.operator(import_obj, icon ='FILE')
    ######
            class ScanFileOperator(bpy.types.Operator):
                bl_idname = import_obj
                bl_label = newbutton 

                def execute(self, context):

                    pfad = "C:\\Users\\Jasmin\\Desktop\\" + newbutton+ ".obj"  ###

                    bpy.ops.import_scene.obj(filepath= pfad, filter_glob="*.obj;*.mtl", use_ngons=True, use_edges=True, use_smooth_groups=True, use_split_objects=True, use_split_groups=True, use_groups_as_vgroups=False, use_image_search=True, split_mode='ON', global_clamp_size=0, axis_forward='-Z', axis_up='Y')
                    bpy.ops.object.origin_set(type = 'GEOMETRY_ORIGIN')

                return {'FINISH'}
def register():
    bpy.utils.register_module(__name__)


def unregister():
    bpy.utils.unregister_module(__name__)

if __name__ == "__main__":
    register()

我知道问题出在newbutton上,因为在绘制按钮的循环之后,它具有列表中最后一项的值。但是我不知道如何修复它。

我还没有加载代码来测试它,但是从我看到newbutton是一个变量。for循环不断地设置相同的变量。这就是为什么您只能得到列表中的最后一个值

您可能需要定义一个实例化对象的函数。该函数需要将该对象构建到场景中所需的所有参数。为循环的每次迭代调用该函数将使用预期数据实例化场景的新对象,因为每个对象将封装传递给它的参数


我希望这有帮助

在搅拌机的界面中,一个按钮链接到操作员,单击该按钮可使操作员执行其任务。与其为每个按钮生成新的操作符,更好的方法是向操作符添加属性并设置每个按钮使用的属性

通过向operator类添加属性,可以在面板中显示每个按钮时为其设置属性,然后在运行该操作员时可以访问该属性

class ScanFileOperator(bpy.types.Operator):
    '''Import an obj into the current scene'''
    bl_idname = 'import.scanfile'
    bl_label = 'Import an obj'
    bl_options = {'REGISTER', 'UNDO'}

    objfile = bpy.props.StringProperty(name="obj filename")

    def execute(self, context):
        print('importing', self.objfile)

        return {'FINISHED'}

class directoryPan(bpy.types.Panel):
    bl_space_type = "VIEW_3D"
    bl_region_type = "TOOLS"
    bl_label = "Biblio"
    bl_category = "Import"

    def draw(self, context):

        col = self.layout.column()
        col.label("Import :")

        obj_list = []
        biblio_one = ['obj1','obj2','obj3','obj4','obj5',]

        for line in biblio_one:
            obj_list.append(line.rstrip())

        for i in obj_list:
            import_obj = "import." + i

            col.operator('import.scanfile', text='Import - '+i,
                            icon ='FILE').objfile = import_obj

谢谢他们的回复!因此,我希望列表中的每个文件都有一个按钮,这样我可以在单击其中一个按钮时分别导入它们。因此,我不希望通过运行脚本来实例化它们,而是通过单击右键来实例化它们。有什么建议吗?非常感谢!我需要self.objfile-这就成功了!:)