簡體   English   中英

使用Tkinter在畫布上繪制標簽

[英]Drawing Labels on a Canvas using Tkinter

我正在嘗試練習使用Tkinter制作畫布,但是我無法使用for循環使Labels出現在畫布上。 說我有一個看起來像這樣的列表:

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()

如上所述,我可以使畫布正確顯示,但沒有標簽。

根據您的代碼段: 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 OS)來調用應用程序,則僅在腳本運行時,命令行輸出/解釋程序外殼程序才可用。

如果將腳本文件命名為* .pyw,則根本看不到可見的解釋程序外殼。 但是,然后您的整個窗口應該拒絕顯示,而不僅是標簽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM