如何访问另一个类中实例化的类的tkinter?

时间:2015-04-11 08:22:37

标签: python tkinter python-3.3

我正在this site关注本教程(或多或少)。我能够复制并粘贴教程中的代码并使用Python 3模块名称进行修改(Tkinter变为tkinterQueue变为queue等等)代码运行正常。

但是,我的代码在方法中创建小部件。

import tk inter as tk
class ClientUI:
    def __init__(self, master, queue, send_command):
        self.queue = queue
        self.send_command = send_command
        self.master = master
        menu_bar = tk.Menu(master)
        menu_file = tk.Menu(menu_bar, tearoff=0)
        menu_file.add_command(label="Preferences", command=self.show_preferences)
        menu_file.add_command(label="Quit", command=master.destroy)
        menu_bar.add_cascade(label="Client", menu=menu_file)
        master.config(menu=menu_bar)
        master.grid()
        self.create_widgets()
        ...

    def create_widgets(self):
        output = tk.Text(self.master, state=tk.DISABLED, name="output")
        output.grid(row=0)

        input_area = tk.Entry(self, name="input")
        input_area.bind("<Return>", self.send_command)
        input_area.focus()
        input_area.grid(row=1, sticky=tk.W+tk.E)

    ...

class Client:
    def __init__(self, master):
        # super(Client, self).__init__()
        self.master = master
        self.queue = Queue()
        self.ui = ClientUI(master, self.queue, self.send)
        ...

    ...

root = tk.Tk()
client = Client(root)
root.mainloop()

当我尝试运行时,我收到错误

    output = tk.Text(self.master, state=self.master.DISABLED, name="output")
AttributeError: 'ClientUI' object has no attribute 'tk'

我不明白他为什么设置root = tk.Tk()以及如何访问tkinter模块来创建小部件。

2 个答案:

答案 0 :(得分:0)

您的错误消息(但奇怪的是,不是您的代码)显示错误在此行:

output = self.master.tk.Text(...)

假设您将tkinter导入为tk,您希望这样做:

output = tk.Text(...)

答案 1 :(得分:0)

问题在于以下功能或类似用法。 @bryan帮助我通过查找错误分配的变量来确定它。

def create_widgets(self):
    output = tk.Text(self.master, state=tk.DISABLED, name="output")
    output.grid(row=0)

    // This line:
    input_area = tk.Entry(self, name="input")
    input_area.bind("<Return>", self.send_command)
    input_area.focus()
    input_area.grid(row=1, sticky=tk.W+tk.E)

input_area = tk.Entry(self, name="input)行正在传递self类的ClientUI,并且没有tk方法。为什么没有使用全局tk我无法确定。但是,将self.master类的Tk作为第一个参数传递并具有此属性。这解决了错误消息。