![](/img/trans.png)
[英]Tkinter ~ Is Drawing a Canvas to GUI possible using .grid()?
[英]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
命令應該可以解決您的問題。
為什么? 這是一個簡單的問題。 place
, grid
和pack
是幾何管理器。 他們都將小部件放置在自己的位置。 不同的行為,不同的參數,但是所有參數都將由構造函數創建的窗口小部件(例如lbl=Label(self.canvas, text=l)
放置在另一個窗口小部件上。
我假設您在應用程序之前沒有任何錯誤。 (MessageBox等), 但是您必須在控制台上收到類似上面的錯誤消息。
如果您通過雙擊腳本文件(Windows OS)來調用應用程序,則僅在腳本運行時,命令行輸出/解釋程序外殼程序才可用。
如果將腳本文件命名為* .pyw,則根本看不到可見的解釋程序外殼。 但是,然后您的整個窗口應該拒絕顯示,而不僅是標簽。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.