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