从另一个类调用窗口小部件以在tKinter中更改其属性

时间:2017-11-28 12:32:37

标签: python tkinter widget

我在我的tKinter应用程序的主构造函数中创建了一个函数,它更新了小部件的某些属性,例如:他们跨多个框架的文字。我想要做的是在控制器框架中同时更改多个框架中的小部件。

-1000  31-Dec-13
-10 31-Dec-14
30  13-Mar-15
1200    17-Mar-15
-40 30-Jun-15
1300    30-Sep-16
1200    31-Oct-17
1250    30-Nov-18
1500    31-Dec-18

但是使用这段代码,我遇到了两个问题。首先,我收到一个属性错误,指出两个框架都没有属性 widget_name 。其次,当我尝试使用自前缀引用窗口小部件名称时,两个框架都表示它们没有 self 属性。有办法解决这个问题吗?

以下完整计划:

def update_widgets(self, frame_list, widget_name, criteria, output):
    for i in frame_list:

        i.widget_name.config(criteria=output)

# update_widgets(self, [Main, AnalysisSection], text_label, text, "foo")
# would result in Main.text_label_config(text="foo") and 
# AnalysisSection.text_label_config(text="foo") ideally.

1 个答案:

答案 0 :(得分:2)

您的代码中的问题是您尝试获取的属性而不是类的实例。您需要将i转换为该类的实际实例。您还有一个问题,即您传递'self.wordLabel'而非'wordLabel'

一个简单的解决方法是在self.frames

中查找实例
def update_widgets(self, frame_list, widget_name, criteria, output):
    for i in frame_list:
        frame = self.frames[i]
        label = getattr(frame, widget_name)
        label[criteria] = output

您还需要将按钮命令更改为:

self.changeTextEntryButton = tk.Button(... command=lambda: self.controller.update_widgets([A,B], 'wordLabel', 'text', self.changeTextEntry.get()))

如果您希望update_widgets始终更新所有页面类,则没有理由传递帧类列表。相反,您可以遍历已知的类:

def update_widgets(self, widget_name, criteria, output):
    for frame in self.frames.values():
        label = getattr(frame, 'classLabel')
        label[criteria] = output

然后,您需要修改按钮以删除框架类列表:

self.changeTextEntryButton = tk.Button(..., command=lambda: self.controller.update_widgets('wordLabel', 'text', self.changeTextEntry.get()))