【发布时间】:2015-04-11 08:22:37
【问题描述】:
我正在关注this site 上的教程(或多或少)。我可以复制并粘贴教程中的代码,并使用 Python 3 模块名称对其进行修改(Tkinter 变为 tkinter,Queue 变为 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