由于某种原因,python Tkinter网格方法无法正常工作

gab6jxml  于 2023-01-10  发布在  Python
关注(0)|答案(1)|浏览(125)

我试图让我的列表框移动到图形用户界面的底部,但无论我给予它的行值有多高,它都不会移动。你可以在我的代码中的Creat_Gui方法中看到我的列表框。我不确定为什么会发生这种情况,因为按钮在第1行,所以我不确定是什么原因导致了这种情况。
我试过使用sticky='s',但没有成功我试过多次更改行,但没有成功。我试过使用root.rowconfigure(100,weight=1),这可以正常工作,但会扰乱网格,这很烦人

import tkinter as tk

class Manager:
    def __init__(self):
        self.root=tk.Tk()

        self.root.title('password_manager')
        self.root.geometry('500x600')

        self.create_GUI()
        self.storage = {}
        self.root.mainloop()

    def create(self):
        pass

    def open_page(self):
        print('openpage')
    def add_new_button(self):
        pass
    def add_new(self):
        self.app_title=tk.Label(text='test')
        self.app_title.grid(row=2,column=50)
        self.application_name=tk.Entry(self.root,width=20,font=('arial',18))
        self.username=tk.Entry(self.root,width=20,font=('arial',18))
        self.password=tk.Entry(self.root,width=20,font=('arial',18))
        self.application_name.grid(row=2, column=1)
        self.username.grid(row=3, column=2)
        self.password.grid(row=4, column=3)

        self.app_name_label = tk.Label(self.root, text='Application Name:')
        self.username_label = tk.Label(self.root, text='Username:')
        self.password_label = tk.Label(self.root, text='Password:')

        self.app_name_label.grid(row=2, column=0)
        self.username_label.grid(row=3, column=1)
        self.password_label.grid(row=4, column=2)

        self.password.bind('<Return>',self.hide)
    def hide(self,thing):
        #store user info to pass onto dictionary and hide textboxes
        username=self.username.get()
        password=self.password.get()
        app_name=self.application_name.get()
        self.application_name.grid_forget()
        self.username.grid_forget()
        self.password.grid_forget()
        self.add_to_memory(username,password,app_name)

    def add_to_memory(self,username,password,app_name):
        #store username password and application name in dictionary
        if app_name in self.storage.keys():
            return
        else:
            self.storage[app_name]=(username,password)
        print(self.storage)
    def create_GUI(self):
        #create initial interface
        #self.root.columnconfigure(100, weight=1)
        #self.root.rowconfigure(100, weight=1)
        self.listbox=tk.Listbox(self.root,width=100)

        self.listbox.grid(row=200,column=0)
        self.button=tk.Button(self.root,text='add new',font=('arial',18),command=self.add_new)
        self.button.grid(row=1,column=0)

Manager()
vddsk6oq

vddsk6oq1#

如果你想使用网格,并且你想让一个小部件位于其父小部件的底部,你需要在小部件上方指定一些行来占据所有额外的空间,迫使小部件位于底部。

def create_GUI(self):
    self.listbox=tk.Listbox(self.root,width=100)
    self.expando_frame = tk.Frame(self.root)
    self.button=tk.Button(self.root,text='add new',font=('arial',18),command=self.add_new)

    self.root.grid_rowconfigure(2, weight=1)
    self.button.grid(row=1,column=0)
    self.expando_frame.grid(row=2, sticky="nsew")
    self.listbox.grid(row=3,column=0)

这样,列表框将位于底部,上方有额外的空间。如果你想添加更多的小部件,你可以将它们添加到self.expando_frame而不是self.root,它们将出现在列表框的上方。
以这种方式使用框架是一种很有价值的技术。例如,你可以在root中使用三个框架:一个用于顶行按钮,一个用于底部的列表框,一个用于中间的所有内容,然后您可以在这些框架上使用pack并保存一行代码(因为不必配置行),然后您可以在中间框架内的小部件上使用grid

相关问题