【问题标题】:Drawing Labels on a Canvas using Tkinter使用 Tkinter 在画布上绘制标签
【发布时间】:2015-10-28 02:49:23
【问题描述】:

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

如上所述,我可以让画布正确显示,但没有标签。

【问题讨论】:

  • 为什么不能显示标签?您正在尝试什么,以及您未预料到的情况?你有错误吗?如果是这样,有什么错误?当您说“标签”时,您指的是Label 小部件,还是直接放置在画布上的简单文本字符串?
  • @BryanOakley 抱歉不清楚,我的意思是标签小部件。我没有收到任何错误,只是没有出现。
  • 向我们展示您的尝试。如果您不向我们展示您是如何将它们添加到画布中的,我们无法说明它们为什么不显示。
  • 我在“for l in city_list”循环中添加了几行代码,显示了我尝试的最后一件事。
  • 在 Controller 类中打印 lbl。这是 place 返回的内容,因此 lbl.pack() 的结果是未知的,因为您没有在该行收到错误消息。另请注意,下一个标签放置在前一个标签顶部的相同位置。最后,看看effbot.org/tkinterbook/canvas.htmjava2s.com/Tutorial/Python/0360__Tkinker/AddLabeltocanvas.htm的create_text和create_window

标签: python canvas tkinter tkinter-canvas


【解决方案1】:

根据您的代码 sn-p: lbl = Label(self.canvas,text = l).place(x = 1,y = 1) lbl.pack()

这应该会在如下错误中恢复:

回溯(最近一次通话最后): 文件“C:\Users\User\SO_33382086.py”,第 63 行,在 抽屉.draw_map(城市) 文件“C:\Users\User\SO_33382086.py”,第 58 行,在 draw_map lbl.pack() AttributeError:“NoneType”对象没有属性“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())
[...]

如上面的 sn-p 所示,删除 pack 命令应该可以解决您的问题。

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

我假设您在应用程序前没有收到任何错误。 (消息框等) 但是您必须在控制台上收到与上述类似的错误消息。

如果您通过双击脚本文件(Windows 操作系统)来调用应用程序,则命令行输出/解释器 shell 将仅在脚本运行时可用。

如果您将脚本文件命名为 *.pyw,您将根本看不到一个可见的解释器外壳。但是你的整个窗口应该拒绝显示,而不仅仅是标签。

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 1970-01-01
    • 2018-11-04
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    相关资源
    最近更新 更多