【问题标题】:Pythonic way of applying changes on closing a dialog window在关闭对话框窗口时应用更改的 Pythonic 方式
【发布时间】:2015-01-23 02:21:20
【问题描述】:

我找不到任何关于这个主题的有用资源。我希望我能在这里找到一些指导。

我使用 Glade、Gtk (3.10) 和 Python 3 制作了一个对话框窗口类。它有大约 30 个可以更改的选项。在初始化函数中,我设置了整个对话窗口并将选项设置为当前值。我还定义了一个布尔变量,用于存储任何小部件是否已更改:

self.settings_changed = False

因此,我为每个小部件设置了一个捕获“更改信号”并执行以下操作的函数:

def on_checkbutton_line_width_changed(self, widget):
    #Set setting_changed to True so that the dialog knows something changed
     self.settings_changed = True
     #Store the changed value in a temporary variable
     self.temp_checkbutton_value = widget.get_active()

现在,当我在对话框中单击“取消”时,我只是不应用任何临时值。但是当我单击“应用”时,我希望应用所有更改的变量。 但这是我的问题:在这 30 个更改的变量中,只有少数存在,所有其他的都会导致很多 AttributeErrors,因为临时变量不存在。

我尝试通过使用很多 try-except 函数来避免错误:

try:
    self.dataclass.set_checkbutton(self.temp_checkbutton_value)
except:
    pass

有没有更简单(更短)的方法来解决这个问题?我想应该有一种方法可以构建一个在单击“应用”后依次执行的更改队列,但我的土豆般的 python 技能到目前为止还没有帮助我解决这个问题。

【问题讨论】:

    标签: user-interface python-3.x gtk


    【解决方案1】:

    这是一个可能有帮助的例子:

    class MyWidget:
        def __init__(self):
            self.changes = []
    
        def cancel_changes(self):
            self.changes.clear()
    
        def change_name(self, new_name):
            self.changes.append(('change_name', new_name))
    
        def change_color(self, new_color):
            self.changes.append(('change_color', new_color))
    
        def apply_changes(self):
            for change in self.changes:
                print("{} - {}".format(change[0], change[1])
    

    或者你可以这样做:

    self.changes.append(lambda: self.dataclass.set_checkoutbutton(value))
    

    然后应用更改将是:

    for change in self.changes:
        change()
    

    【讨论】:

    • 我使用了带有 lambda 函数的解决方案。它不仅有效,而且我终于明白了 lambda 函数可能有用的地方。非常感谢我!
    • 不客气!我发现 lambdas 作为回调中其他函数的包装器最有用。在其他地方也有用,但通常是这样。
    猜你喜欢
    • 2017-02-19
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    相关资源
    最近更新 更多