我在我的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.
答案 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()))