所以我在Python中编写面向对象的程序,并使用Tkinter构建GUI . 我是面向对象和Tkinter的新手,所以我一直在youtube,effbot.org,stackoverflow和zetcode.com上使用Sentdex视频来帮助我 .
这是我的程序,我已经删除了很多,所以它更短,更容易理解 . 它以全屏模式启动并使框架居中 . 然后我单击登录按钮,然后引发下一帧,但是这一帧不会居中,尽管它位于由权重= 1的单元格包围的网格中间 .
import tkinter as tk
from tkinter import ttk
class Program(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
container.grid_rowconfigure(2, weight=1)
container.grid_columnconfigure(2, weight=1)
self.frames = {}
frame = Login(container, self)
self.frames[Login] = frame
frame.grid(row=1, column=1, sticky="nsew")
for F in (Login, AdminHome):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row = 1, column = 1, sticky = "nsew")
self.show_frame(Login)
def show_frame(self,cont):
frame = self.frames[cont]
frame.tkraise()
class Login(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
name = tk.Label(self, text = "Program")
name.grid(row=0, columnspan=5, sticky="W"+"E")
username = tk.Label(self, text="Username: ")
username.grid(row=1, columnspan=2, sticky="W")
user = ttk.Entry(self, text ="", width=45)
user.grid(row=1, column=2 ,columnspan=3, sticky="w")
password = tk.Label(self, text="Password: ")
password.grid(row=2, columnspan=2, sticky="W")
passentry = ttk.Entry(self, text ="", width=45)
passentry.grid(row=2, column=2 ,columnspan=3, sticky="W")
loginb = ttk.Button(self, text = "Login", command = lambda: controller.show_frame(AdminHome))
loginb.grid(row=3, columnspan=5, sticky="W"+"E")
class AdminHome(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
name = tk.Label(self, text = "Admin Home")
name.grid(row=0, sticky="W")
name = tk.Label(self, text = "FirstName + LastName")
name.grid(row=0, column=5 ,sticky="E")
update = ttk.Button(self, text = "Update Online", command = lambda: controller.show_frame(AdminHome))
update.grid(row=1, columnspan=6, sticky="W"+"E")
fetch = ttk.Button(self, text = "Fetch Data", command = lambda: controller.show_frame(AdminHome))
fetch.grid(row=2, columnspan=6, sticky="W"+"E")
a = ttk.Button(self, text = "a", command = lambda: controller.show_frame(AdminHome))
a.grid(row=3, columnspan=2, sticky="W"+"E")
b = ttk.Button(self, text = "b", command = lambda: controller.show_frame(AdminHome))
b.grid(row=3, column=2, columnspan=2, sticky="W"+"E")
c = ttk.Button(self, text = "c", command = lambda: controller.show_frame(AdminHome))
c.grid(row=3, column=4, columnspan=2, sticky="W"+"E")
edit = ttk.Button(self, text = "Edit Details", command = lambda: controller.show_frame(AdminHome))
edit.grid(row=4, columnspan=6, sticky="W"+"E")
app = Program()
app.state('zoomed')
app.mainloop()
当我将以下代码添加到AdminHome类时,问题相反,登录屏幕停止居中但管理员主屏幕变为居中 .
uip = tk.Label(self, text="Updating in Progress ")
uip.grid(row=5, sticky="W")
updatebar = ttk.Progressbar(self,orient ="horizontal",length = 200, mode ="determinate")
updatebar.grid(row=5, column=1, sticky="W"+"E")
updatebar["maximum"] = 100
updatebar["value"] = 50
fip = tk.Label(self, text="Fetching in Progress ")
fip.grid(row=5, column=2, sticky="W")
fetchbar = ttk.Progressbar(self,orient ="horizontal",length = 200, mode ="determinate")
fetchbar.grid(row=5, column=3, sticky="W"+"E")
fetchbar["maximum"] = 100
fetchbar["value"] = 50
有人能告诉我为什么会这样,以及我如何解决它 . 如果我改变这些框架中小部件的大小以及我添加到程序中的所有其他框架,我还需要解决方案 .