将 gui 变量传递给 类 的有效方法?
Efficient way to pass gui variables to classes?
我正在使用 Maya 程序在 python 中制作一个相当大的项目。我有许多选项将由 GUI 确定并由用户输入。
选项的一个示例是渲染的维度。不过我还没有制作GUI,还在测试中。
我最终想要的是一种让变量能够被多个模块中的 classes/methods 查找和使用的方法。还有一种方法,我可以在没有实际 GUI 的情况下测试所有代码。
我应该直接将所有数据传递给每个方法吗?我的问题是,如果方法 foo 依赖于变量 A,但方法 bar 需要调用 foo,那么从调用它的任何地方将这些变量传递给 Foo 可能会很烦人。
我看到的另一种方法是将所有变量传递给每个 class 实例本身并使用实例变量进行访问。但是,如果选项发生变化怎么办,那么每次运行时我都必须重新加载导入。
为了测试我现在使用的是一个模块,该模块从带有变量的配置文件中获取变量,我导入该模块并在整个脚本中使用实例变量。
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']
有没有人有建议或可以指出我处理 getting/using ui 变量的正确方向?
如果选项列表不是太长且不会改变,可以简单地在class初始化器中设置成员变量,这使得初始化易于读者理解:
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 的构造函数中:
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文件边填写class,或者用其他方式存储。坚持让事情变得更难,因为你不能保证用户不会同时打开两个 Maya,可能会以不可预测的方式更改保存的数据。您可以使用 Maya 的 fileInfo.
存储数据的每个文件副本
在这两种情况下,我都会让实际的 GUI 将数据对象(OptionData
或您所称的任何对象)作为初始值设定项。这样您就可以从 GUI 读取和写入数据。然后让实际的功能代码读取 OptionData:
def perform_render(optiondata):
#.... etc
这样你就可以 运行 一个完全没有图形用户界面的批处理,功能代码将 none 更明智。 GUI 的唯一工作是成为数据对象的自定义编辑器,然后将其以有效状态传递给最终函数。
我正在使用 Maya 程序在 python 中制作一个相当大的项目。我有许多选项将由 GUI 确定并由用户输入。 选项的一个示例是渲染的维度。不过我还没有制作GUI,还在测试中。
我最终想要的是一种让变量能够被多个模块中的 classes/methods 查找和使用的方法。还有一种方法,我可以在没有实际 GUI 的情况下测试所有代码。
我应该直接将所有数据传递给每个方法吗?我的问题是,如果方法 foo 依赖于变量 A,但方法 bar 需要调用 foo,那么从调用它的任何地方将这些变量传递给 Foo 可能会很烦人。
我看到的另一种方法是将所有变量传递给每个 class 实例本身并使用实例变量进行访问。但是,如果选项发生变化怎么办,那么每次运行时我都必须重新加载导入。
为了测试我现在使用的是一个模块,该模块从带有变量的配置文件中获取变量,我导入该模块并在整个脚本中使用实例变量。
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']
有没有人有建议或可以指出我处理 getting/using ui 变量的正确方向?
如果选项列表不是太长且不会改变,可以简单地在class初始化器中设置成员变量,这使得初始化易于读者理解:
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 的构造函数中:
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文件边填写class,或者用其他方式存储。坚持让事情变得更难,因为你不能保证用户不会同时打开两个 Maya,可能会以不可预测的方式更改保存的数据。您可以使用 Maya 的 fileInfo.
存储数据的每个文件副本在这两种情况下,我都会让实际的 GUI 将数据对象(OptionData
或您所称的任何对象)作为初始值设定项。这样您就可以从 GUI 读取和写入数据。然后让实际的功能代码读取 OptionData:
def perform_render(optiondata):
#.... etc
这样你就可以 运行 一个完全没有图形用户界面的批处理,功能代码将 none 更明智。 GUI 的唯一工作是成为数据对象的自定义编辑器,然后将其以有效状态传递给最终函数。