从导入的模块引用小部件

时间:2016-12-10 12:59:16

标签: tkinter attributeerror nameerror

我有2个TkInter模块。一个是工具栏模块(tBar.py),第二个是通用模块(tBarCall.py)。

1)工具栏模块(tBar.py):这将创建一个工具栏框架并在其上放置按钮(如保存,添加,删除等)。

2)客户端主模块(tBarCall.py):这将导入并运行工具栏模块。然后在稍后阶段,它应该启用/禁用工具栏框架上的一些按钮。当我尝试启用/禁用按钮时,请查看我显示的错误。

我可以从客户端主模块中导入工具栏模块,但是我无法启用/禁用(引用)工具栏框架上的按钮。

你能帮我解决一下这个问题吗?

以下是代码:

=== tBar.py ===

import tkinter as tk

def attach_toolbar(rootWindow, action, save_record, first_record):
    if action == "I":
        fToolbar = tk.Frame(rootWindow, padx = 1, pady = 1, bg="RED")
        fToolbar.grid(row=0, column = 0, sticky='w') #pack(anchor="nw",expand=1) #
        bSave = tk.Button(fToolbar, text="save", command=save_record)     #width=6, height=2, text = "Save\nrecord", font=("Calibri", 8), 
        bFirst = tk.Button(fToolbar, text="first", command=first_record)     #width=6, height=2, text = "First\nrecord", font=("Calibri", 8), 

        bSave.pack(side="left")
        bFirst.pack(side="left")
    else:
        bFirst.configure(state="disabled")

=== tBarCall.py ===

import tkinter as tk
import tBar

def save_record():
    print ("save_record")

def first_record():
    print ("first_record")

class startModule:
    def __init__(self, rootWindow):
        print("__init__")

        self.rootWindow = rootWindow
        self.rootClient = tk.Toplevel(self.rootWindow)
        self.rootClient.geometry('1300x650+1+1')
        tBar.attach_toolbar(self.rootClient, "I", save_record, first_record)
        #tBar.attach_toolbar(self.rootClient, "D", save_record, first_record) #UnboundLocalError: local variable 'bFirst' referenced before assignment
        #bFirst.configure(state="disabled") #NameError: name 'bFirst' is not defined        
        #self.rootClient.bFirst.configure(state="disabled") #AttributeError: 'Toplevel' object has no attribute 'bFirst'
        #self.rootClient.fToolbar.bFirst.configure(state="disabled") #AttributeError: 'Toplevel' object has no attribute 'fToolbar'

if __name__ == "__main__":
    root = tk.Tk()
    startModule(root)
    root.mainloop()

Errorscr

1 个答案:

答案 0 :(得分:0)

我有一个解决方法。我在工具栏模块中使用了DICTionary(即tBarCall.py)来存储按钮的详细信息,保存,添加,删除等。然后我将这个字典返回给调用模块,即tBarCall.py。现在,我可以使用这个字典禁用按钮。以下是我做的额外编码:

tBar.py

retButtonIdentifier = {"bSave" : bSave}
retButtonIdentifier["bFirst"]=bFirst    

return retButtonIdentifier

tBarCall.py

self.dictButtonIdentifier = tBar.attach_toolbar(self.rootClient, "I", save_record, first_record)

self.dictButtonIdentifier["bSave"].configure(state="disabled")            
self.dictButtonIdentifier["bFirst"].configure(state="disabled")