将gui变量传递给类的有效方法?

时间:2017-08-29 02:21:57

标签: python-2.7 user-interface maya

我使用Maya程序在python中创建一个相当大的项目。我有很多选项,将由GUI和用户输入决定。 选项的一个示例是要呈现的维度。但是我还没有制作GUI,我还在测试中。

我最终想要的是让变量能够被多个模块中的各种类/方法查找和使用的方法。而且有一种方法可以在没有实际GUI的情况下测试所有代码。

我应该直接将所有数据传递给每个方法吗?我的问题是如果方法foo依赖于变量A,但是方法栏需要调用foo,它可能会让这些变量真正变得烦人,无法将它们传递给Foo。

我看到的另一种方法是将所有变量传递给每个类实例本身并使用实例变量进行访问。但是如果一个选项改变了,那么每次运行时我都必须重新加载。

为了测试我现在使用的是一个模块,它使用变量从配置文件中获取变量,然后导入该模块并在整个脚本中使用实例变量。

def __init__(self):
        # Get and assign all instance variables.
        options = config_section_map('Attrs', '%s\\ui_options.ini' %(data_path))
        for k, v in options.items():
            if v.lower() == 'none':
                options[k] = None
        self.check_all = int(options['check_all'])
        self.control_group = options['control_group']

有没有人有建议或能指出我正确的方向来处理获取/使用ui变量?

1 个答案:

答案 0 :(得分:2)

如果选项列表不是太长而且不会发生变化,您只需在类初始化程序中设置成员变量,这样便于读者理解初始化:

class OptionData(object):


     def __init___(self):
         #set the options on startup

         self.initial_path = "//network"
         self.initial_name = "filename"
         self.use_hdr = True
         # ... etc

如果您希望初始化经常更改,可以将初始值拆分为类的构造函数:

class OptionData(object):


     def __init___(self, path = "//network", name = "filename", hdr=True)

     self.initial_path = path
     self.initial_name = name
     self.use_hdr = hdr

如果您需要保留数据,可以填写读取cfg文件的课程,或者以其他方式存储。坚持使事情变得更难,因为你不能保证用户不会同时打开两个Maya,这可能会以不可预测的方式改变保存的数据。您可以使用Maya的fileInfo存储数据的每个文件副本。

在这两种情况下,我都会让实际的GUI将数据对象(OptionData或任何你称之为你的对象)作为初始化程序。这样您就可以从GUI读取和写入数据。然后让实际的功能代码读取OptionData:

 def perform_render(optiondata):
     #.... etc

这样你就可以在没有gui的情况下运行批处理过程,而且功能代码也不会更明智。 GUI的唯一工作是成为数据对象的自定义编辑器,然后将其传递给处于有效状态的最终函数。