【问题标题】:How do I access tkinter for a class instantiated in another class?如何访问在另一个类中实例化的类的 tkinter?
【发布时间】:2015-04-11 08:22:37
【问题描述】:

我正在关注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 模块来创建小部件。

【问题讨论】:

  • 我在您的代码中没有看到output = self.master.tk.Text(...)。请阅读stackoverflow.com/help/mcve
  • AttributeError 消息中也没有提到 tkapp。您的代码与linked asynchronous I/O code 配方的关系也不清楚。
  • import tkinter as tk 声明在哪里?如果已经执行了一个,那么名为tk 的全局变量应该可以被同一模块中的所有代码访问。
  • 我认为全局应该,我的问题是它不是。
  • @martineau 我纠正了错误。当我询问并复制以前的错误时,我正在处理它。我尝试用self.master 替换tk. 作为远射。无论出于何种原因,self.master 似乎是 tkapp

标签: python tkinter python-3.3


【解决方案1】:

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

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

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

output = tk.Text(...)

【讨论】:

  • 我改变了它试图弄明白。 tk.Text () 似乎正确,但全局 tk 不可用。
  • @ToothlessRebel:您问题中的代码清楚地表明您正在使用tk.Tk(),因此如果它在那里工作,它必须在其他地方工作,除非您在某处创建一个名为tk 的变量。
  • 这正是我的想法。我不认为我可能会在某处创建一个名为 tk 的变量。我会去找的。​​span>
【解决方案2】:

问题在于以下函数或类似用法。 @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 类并且确实具有这样的属性。这解决了错误消息。

【讨论】:

    猜你喜欢
    • 2013-04-16
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多