使用Tkinter在画布上绘制标签

时间:2015-10-28 02:49:23

标签: python canvas tkinter tkinter-canvas

我正在尝试使用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()

正如我上面提到的,我可以让画布正确显示但没有标签。

1 个答案:

答案 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命令可以解决您的问题。

<强>为什么吗 这是一个简单的问题。 placegridpack是几何管理员。 他们都自己放置小部件。不同的行为,不同的参数,但所有参数都将构造函数(例如lbl=Label(self.canvas, text=l))创建的小部件放在另一个小部件上。

我假设您在申请前没有收到任何错误。 (MessageBox等) 但是您必须在控制台上收到类似上面的错误消息。

如果使用双击脚本文件(Windows操作系统)调用应用程序,只要脚本正在运行,命令行输出/解释器shell就可用。

如果您将脚本文件命名为* .pyw,则根本不会获得可见的解释器shell。但是,您的完整窗口应该拒绝显示标签。