簡體   English   中英

Python tkinter 標簽

[英]Python tkinter Label

嗨,我有一個關於 tkinter 中的標簽的小問題。

當您在類外使用 Label 時,您會執行類似的操作

import tkinter as tk


root = tk.Tk()
label = tk.Label(root, text = "something", background = "something")
label.pack()

但是,當它在類中並且代碼類似於

將 tkinter 作為 tk 導入

class Example(tk.Frame):

    COLOURS = [ "#f45", "#ee5", "#aa4", "#a1e433", "#e34412", "#116611",
                "#111 eeefff", "#3aa922191", "#abbabbaaa" ]

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.parent = parent


        col = 1
        for colour in Example.COLOURS:
        #
        label = tk.Label(self, text=colour, background=colour)
        #
        label.grid(row=1, column=col)
        col += 1


def main():
root = tk.Tk()
ex = Example(root)
root.geometry("+300+300")
root.mainloop()

if __name__ == '__main__':
    main()

但不應該更像

label = tk.Label(self.parent, text=colour, background=colour)

因為 self.parent 會對應於 root? 當我嘗試這樣做時,我收到一個錯誤,並且只有當我在它下面有 label.grid(...) 行時才會這樣做(我試過 pack 並且它工作正常)。

所以我認為這段代碼

import tkinter as tk

root = tk.Tk()

label = tk.Label(root)
label.grid(row=0, column=0)

root.mainloop()

也不會工作,但它實際上工作得很好。 所以我很困惑。 誰能解釋一下?

不,它不應該是self.parent

在您給出的類示例中,類本身就是一個框架。 以這種方式設計使示例自包含。 通過從Frame繼承,您可以獲取該類中的所有代碼並將其放在 GUI 中的任何位置。 您可以將類及其中的所有內容視為單個自定義小部件。 您可以擁有多個這樣的類,並且每個類都可以被視為一個 GUI 對象。

為了實現這一點,該類只將小部件放在自身內部,而不是在其父類中。

使用Frame的子類的全部目的是充當其他小部件的容器。 如果您不打算將其用作其他小部件的容器,那么從Frame繼承就沒有意義了。

它相當於這個,沒有類:

import tkinter as tk

root = tk.Tk()
frame = tk.Frame(root)
frame.pack(...)
label = tk.Label(frame, text = "something", background = "something")
label.pack(...)

如果您希望類將小部件放在父類中,您可以像下面這樣定義類。 請注意,它繼承自object而不是Frame

class Example(object):
    def __init__(self, parent):
        self.parent = parent
        ...
        label = tk.Label(parent, ...)

暫無
暫無

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

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