为什么我的框架在 tkinter 中没有完全伸展

why isn't my frame stretch completely in tkinter

我尝试使用 sticky='nsew' 拉伸框架,但它无法正常工作。我在这里附上了screenshot。

白色window是我的框架,我想贴在所有角落。我不想弄乱我制作的按钮。如果我设置 row=0 它可以工作但在那种情况下我丢失了按钮..我也想保留那个按钮

from tkinter import *

root=Tk()
root.title("manage your cashflow")
#for setting full screen window
screen_width=root.winfo_screenwidth()
screen_height=root.winfo_screenheight()
print(screen_height, screen_width)
root.geometry("%dx%d" % (screen_width,screen_height))
root.configure(bg='grey')

#configure

Grid.rowconfigure(root,0,weight=1)
Grid.columnconfigure(root,0,weight=1)

Grid.columnconfigure(root,1,weight=1)




# creating tabs
up_button1= Button(root, text="the list of month", bg='#ebca87')
up_button1.grid(row=0,column=0, sticky='NEW')

up_button2=Button(root, text="the new month",bg='#ebca87')
up_button2.grid(row=0,column=1,sticky='NEW',pady=0)


#class for frames
class frame:
    
    
    
    #method for
    def frame2(self):
                #for frame sticky
        Grid.rowconfigure(root,1,weight=1)

        Grid.columnconfigure(root,0,weight=1)

        Grid.columnconfigure(root,1,weight=1)

        #frame for listbox
        frame2=Frame(root)
        frame2.grid(row=1,column=0,columnspan=2,sticky="NSEW")
        

        Grid.rowconfigure(frame2,0,weight=1)
        Grid.columnconfigure(frame2,0,weight=1)
        Grid.columnconfigure(frame2,1,weight=1)


        salary_text=Label(frame2,text="salary")
        salary_text.pack()
        salary_entry=Entry(frame2)
        salary_entry.pack() 

frame_ob=frame()
frame_ob.frame2()    
root.mainloop()

我想把框架拉伸到按钮上。我该怎么做? 你们可以在屏幕截图中看到白框没有粘在第 2 行和第 1 和 2 列的所有角落

您的主要问题是 Grid.rowconfigure(root,0,weight=1)。这导致按钮所在的行以与框架所在的行相同的速率扩展。

去掉那一行应该可以解决你的问题。 那就是说我会用你的代码改变几件事。

  1. 您使用 Grid.rowconfigure() 等等,这不是标准用法。你这样做有什么理由吗?通常我希望看到 frame2.rowconfigure(0, weight=1).

  2. 您将框架构建为 class,但实际上并没有在其中做任何需要它成为 class 的事情。您也不会在 class 中继承 tk.Frame。我会在这里写得有点不同。

  3. import *皱眉。随着代码的增长,随着时间的推移维护代码可能会导致问题,并且更难知道方法的来源,因此更难排除故障。尝试 import tkinter as tk 并使用 tk. 前缀。

  4. 您可能需要或想要为小部件设置变量名称的原因是您打算稍后与它进行交互。比如更新标签,或者如果您想设置一个变量名以便更容易识别该小部件的用途。然后你可以这样做,但我个人更愿意避免设置变量,如果它们以后永远不会被修改的话。

您的代码可以减少很多。 这是一个非 OOP 示例(我将框架背景设置为黑色,以便更容易查看框架是否正在扩展。如果需要,您可以将其改回):

import tkinter as tk

root = tk.Tk()
root.title("manage your cashflow")
root.geometry("%dx%d" % (root.winfo_screenwidth(), root.winfo_screenheight()))
root.configure(bg='grey')

root.rowconfigure(1, weight=1)
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=1)

tk.Button(root, text="the list of month", bg='#ebca87').grid(row=0, column=0, sticky='NEW')
tk.Button(root, text="the new month", bg='#ebca87').grid(row=0, column=1, sticky='NEW', pady=0)

frame2 = tk.Frame(root, bg='black')
frame2.grid(row=1, column=0, columnspan=2, sticky="NSEW")
frame2.rowconfigure(0, weight=1)
frame2.columnconfigure(0, weight=1)
frame2.columnconfigure(1, weight=1)

tk.Label(frame2, text="salary").pack()
salary_entry = tk.Entry(frame2)
salary_entry.pack()

root.mainloop()

结果:

对于更适合 OOP 的选项,您可以这样做。

import tkinter as tk


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("manage your cashflow")
        self.geometry("%dx%d" % (self.winfo_screenwidth(), self.winfo_screenheight()))
        self.configure(bg='grey')
        self.rowconfigure(1, weight=1)
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)

        tk.Button(self, text="the list of month", bg='#ebca87').grid(row=0, column=0, sticky='NEW')
        tk.Button(self, text="the new month", bg='#ebca87').grid(row=0, column=1, sticky='NEW', pady=0)
        frame2 = Frame2()
        frame2.grid(row=1, column=0, columnspan=2, sticky="NSEW")


class Frame2(tk.Frame):
    def __init__(self):
        super().__init__(bg='black')
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)

        tk.Label(self, text="salary").pack()
        salary_entry = tk.Entry(self)
        salary_entry.pack()


if __name__ == '__main__':
    App().mainloop()