2013-10-03 38 views
1

如何在当前函数外部创建的tkinter窗口部件上作用?下面的print声明显示框架名称存在,但我如何获得它们?从框架外部改变tkinter框架的属性

目标是在按下按钮时更改背景和前景色等属性。下面的例子中只显示一个按钮。实际应用中还有多个框架可供使用。

from tkinter import * 
ALL=N+S+W+E 

class Application(Frame): 
    def create_buttons(self): 
     self.b = Button(self, text='Green', 
      command=lambda: self.set_text_color('Green')) 
     self.b.grid(row=1, column=1, sticky=ALL) 
     #... 

    def set_text_color(self, color): 
     print("Setting text color", self, color) 
     ## none of these work as frame_1 doesn't exist here 
     ## how to act on a frame up the tree? 
     #self.frame_1.config({'bg':color}) 
     #top.frame_1.config({'bg':color}) 
     #app.top.frame_1.config({'bg':color}) 
     #app.f1.config({'bg':color}) 
     f1.config({'bg':color}) 

    def __init__(self, master=None): 
     Frame.__init__(self, master, padx=10, pady=10, name='top') 
     self.config({'bg':'bisque'}) 
     self.rowconfigure(0, minsize=50, weight=1) 
     self.grid(sticky=ALL) 

     f1 = Frame(self, padx=10, pady=10, name='frame_1') 
     f1.config({'bg':'cornsilk'}) 
     f1.rowconfigure(0, minsize=20, weight=1) 
     f1.grid(sticky=ALL, columnspan=2) 

     #... 

     self.create_buttons() 

root = Tk() 
app = Application(master=root) 
app.mainloop() 

点击[绿色]按钮的结果:

Setting text color .top Green 
Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python32\lib\tkinter\__init__.py", line 1456, in __call__ 
    return self.func(*args) 
    File "B:\py2\09\xx-set-color.py", line 7, in <lambda> 
    command=lambda: self.set_text_color('Green')) 
    File "B:\py2\09\xx-set-color.py", line 19, in set_text_color 
    f1.config({'bg':color}) 
NameError: global name 'f1' is not defined 

回答

2

所有你需要做的,当你创建它保存到F1的引用:

def __init__(self, master=None): 
    ... 
    self.f1 = Frame(...) 
    ... 

一旦你这样做那你在课堂上把它称为self.f1。 。

+0

啊! (Yay!,但是* argh!*)我与这个**打了**。**非常感谢。 –