我正在尝试使用Tkinter练习制作画布,但是我无法使用for循环在画布上显示标签。说我有一个看起来像这样的列表:
cities = ["Boston","New York","Chicago","Munich","Berlin","Monterrey"]
我想要一个遍历每个城市的for循环,然后在画布上的某个位置放置一个带有每个城市名称的标签。到目前为止,我有这个代码(只显示一个画布,无法让它向我显示标签):
class Map_Window(Frame):
def __init__(self,title,left,top,width,height,master):
Frame.__init__(self,master)
self.master.title(title)
self.master.geometry("%dx%d+%d+%d" % (width,height,left,top))
self.create_gui()
self.pack()
def create_gui(self):
self.frm1 = Frame(self)
self.canvas = Canvas(self.frm1)
self.canvas.pack()
self.frm1.pack()
该代码将设置画布。现在我正在尝试创建将列表中的内容放在画布中的类。到目前为止我有这个:
class Controller:
def __init__(self, canvas):
self.canvas = canvas
def draw_map(self,city_list):
for l in city_list:
lbl = Label(self.canvas,text = l).place(x = 1,y = 1)
lbl.pack()
代码的主要部分:
top_level = Tk()
win = Map_Window("Locations",150,150,300,400,top_level)
drawer = Controller(win.canvas)
drawer.draw_map(cities)
top_level.mainloop()
正如我上面提到的,我可以让画布正确显示但没有标签。
答案 0 :(得分:1)
根据您的代码段:
lbl = Label(self.canvas,text = l).place(x = 1,y = 1)
lbl.pack()
这应该在如下错误中恢复:
Traceback (most recent call last): File "C:\Users\User\SO_33382086.py", line 63, in drawer.draw_map(cities) File "C:\Users\User\SO_33382086.py", line 58, in draw_map lbl.pack() AttributeError: 'NoneType' object has no attribute 'pack'
要找出问题所在,您可以使用:
[...]
def draw_map(self,city_list):
for l in city_list:
lbl = Label(self.canvas,text = l)
print(lbl)
print(lbl.place(x = 1,y = 1))
# print(lbl.pack())
[...]
如上面的代码段所示,删除pack
命令可以解决您的问题。
<强>为什么吗
这是一个简单的问题。 place
,grid
和pack
是几何管理员。
他们都自己放置小部件。不同的行为,不同的参数,但所有参数都将构造函数(例如lbl=Label(self.canvas, text=l)
)创建的小部件放在另一个小部件上。
我假设您在申请前没有收到任何错误。 (MessageBox等) 但是您必须在控制台上收到类似上面的错误消息。
如果使用双击脚本文件(Windows操作系统)调用应用程序,只要脚本正在运行,命令行输出/解释器shell就可用。
如果您将脚本文件命名为* .pyw,则根本不会获得可见的解释器shell。但是,您的完整窗口应该拒绝显示标签。