在tkinter中创建自定义小部件

kel*_*ite 0 python tkinter

我想在tkinter中创建一个自定义窗口小部件,以便在实例化时显示标签和输入框。示例我创建了一个名为entry的类,并调用as .. entry('name',master),这将在输入框旁边显示一个标签,其文本为main。我已经成功地做到了,但是我的问题是几何管理器。他们似乎都弄乱了一切

Bry*_*ley 5

您的小部件应该是subclass Frame。在框架内,您可以使用所需的任何几何图形管理器,而不会影响任何其他代码。该控件类并是很重要的不叫grid,pack或者place说是一个创建的插件的功能的工作-上本身。每个小部件或创建小部件的功能都应该只担心布局其子级。

这是一个创建几个不同的自定义小部件的示例。每个人都使用不同的几何图形管理器来说明它们互不干扰:

try:
    # python 3.x
    import tkinter as tk
except ImportError:
    # python 2.x
    import Tkinter as tk


class CustomWidget(tk.Frame):
    def __init__(self, parent, label, default=""):
        tk.Frame.__init__(self, parent)

        self.label = tk.Label(self, text=label, anchor="w")
        self.entry = tk.Entry(self)
        self.entry.insert(0, default)

        self.label.pack(side="top", fill="x")
        self.entry.pack(side="bottom", fill="x", padx=4)

    def get(self):
        return self.entry.get()

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.label = tk.Label(self)
        self.e1 = CustomWidget(self, "First Name:", "Inigo")
        self.e2 = CustomWidget(self, "Last Name:", "Montoya")
        self.submitButton = tk.Button(self, text="Submit", command=self.submit)

        self.e1.grid(row=0, column=0, sticky="ew")
        self.e2.grid(row=1, column=0, sticky="ew")
        self.label.grid(row=2, column=0, sticky="ew")
        self.submitButton.grid(row=4, column=0)

        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(2, weight=1)

    def submit(self):
        first = self.e1.get()
        last = self.e2.get()
        self.label.configure(text="Hello, %s %s" % (first, last))

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).place(x=0, y=0, relwidth=1, relheight=1)
    root.mainloop()
Run Code Online (Sandbox Code Playgroud)

  • @Yeheshuah:我第一次在 1990 年代初期开始使用 tk 和 Tcl 语言,并在十多年前开始学习 python 和 tkinter。我并没有太多地学习如何以这种方式编写代码,这更多的是基于多年经验的自然进展。 (2认同)