我正在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
模块来创建小部件。
答案 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
作为第一个参数传递并具有此属性。这解决了错误消息。