不同框架中的 Tkinter 入口小部件
Tkinter entry widget in different Frames
我开始学习Python和GUI,我用的是3.7版本。我的问题是条目小部件。
我只是在检查不同的小部件如何与不同的框架一起工作,并且没有像我认为的那样工作。所以我想做一个有两个或更多不同页面的应用程序,但我从两个开始,我想在它们之间进行更改,每个页面都会有不同的小部件。在这种情况下,当我在第二页或框架中使用对条目 class 的调用时,条目块也在主页中,因此我只想在一页或框架中使用条目块。如您所见,我将 .pack() 与条目一起使用 我想使用 .grid() 但是 python 在我尝试这样做时显示错误。
感谢您的帮助。
import tkinter as tk
LARGE_FONT = ("Verdana", 12)
class mainapp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
# self.geometry("800x600")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, NewData):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(StartPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.configure(background='white')
labeltop = tk.Label(self, text="Hello\n"
"Please Select a option:",
bg="white", fg="green", height=4, width=30, font=LARGE_FONT)
labeltop.grid(row=0, column=0, pady=10, padx=10, columnspan=2)
self.logo = tk.PhotoImage(file="logo.gif")
logolabel=tk.Label(self, image=self.logo)
logolabel.grid(row=0, column=3)
button1 = tk.Button(self, text="Option1", fg="White", bg="Green", height=6, width=30,
command=lambda: controller.show_frame(NewData))
button1.grid(row=1, column=0, padx=1, pady=10)
class NewData(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.configure(background='white')
label = tk.Label(self, text="Option1", font=LARGE_FONT)
label.grid(pady=10, padx=10)
button1 = tk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(StartPage))
E1 = tk.Entry()
E1.pack()
button1.grid()
app = mainapp()
app.mainloop()
实际上,我暂时无法测试,但是您不能在一个布局中使用 pack and 网格。我倾向于在你的情况下使用网格。
当您创建小部件时,您必须告诉它们它们属于哪里。当您执行 tk.Entry()
时,您并没有这样做,因此它默认进入根目录 window。
如果您希望条目位于特定页面内,您需要将该页面或其子页面之一作为条目的主页面:tk.Entry(self)
.
我开始学习Python和GUI,我用的是3.7版本。我的问题是条目小部件。 我只是在检查不同的小部件如何与不同的框架一起工作,并且没有像我认为的那样工作。所以我想做一个有两个或更多不同页面的应用程序,但我从两个开始,我想在它们之间进行更改,每个页面都会有不同的小部件。在这种情况下,当我在第二页或框架中使用对条目 class 的调用时,条目块也在主页中,因此我只想在一页或框架中使用条目块。如您所见,我将 .pack() 与条目一起使用 我想使用 .grid() 但是 python 在我尝试这样做时显示错误。
感谢您的帮助。
import tkinter as tk
LARGE_FONT = ("Verdana", 12)
class mainapp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
# self.geometry("800x600")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, NewData):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(StartPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.configure(background='white')
labeltop = tk.Label(self, text="Hello\n"
"Please Select a option:",
bg="white", fg="green", height=4, width=30, font=LARGE_FONT)
labeltop.grid(row=0, column=0, pady=10, padx=10, columnspan=2)
self.logo = tk.PhotoImage(file="logo.gif")
logolabel=tk.Label(self, image=self.logo)
logolabel.grid(row=0, column=3)
button1 = tk.Button(self, text="Option1", fg="White", bg="Green", height=6, width=30,
command=lambda: controller.show_frame(NewData))
button1.grid(row=1, column=0, padx=1, pady=10)
class NewData(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.configure(background='white')
label = tk.Label(self, text="Option1", font=LARGE_FONT)
label.grid(pady=10, padx=10)
button1 = tk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(StartPage))
E1 = tk.Entry()
E1.pack()
button1.grid()
app = mainapp()
app.mainloop()
实际上,我暂时无法测试,但是您不能在一个布局中使用 pack and 网格。我倾向于在你的情况下使用网格。
当您创建小部件时,您必须告诉它们它们属于哪里。当您执行 tk.Entry()
时,您并没有这样做,因此它默认进入根目录 window。
如果您希望条目位于特定页面内,您需要将该页面或其子页面之一作为条目的主页面:tk.Entry(self)
.