【发布时间】:2016-03-17 14:09:10
【问题描述】:
所以我正在用 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()
Login Screen before progress bars are added
当我将以下代码添加到 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
Login Screen after progress bars are added
谁能告诉我为什么会发生这种情况以及如何解决它。如果我更改这些框架中的小部件的大小以及我添加到程序中的所有其他框架,我需要该解决方案也能正常工作。
【问题讨论】:
-
您创建了两次
Login框架。这是故意的吗? -
不,这不是故意的,我该如何解决这个问题?
标签: python oop python-3.x tkinter