【问题标题】:python Tkinter grid method not working as should be for some reasonpython Tkinter 网格方法由于某种原因不能正常工作
【发布时间】:2023-01-09 05:31:20
【问题描述】:

我试图让我的列表框移动到 gui 的底部,但无论我给它多高的行值,它都不会让步。您可以在我的代码中的 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()

【问题讨论】:

  • 您是否知道空行和空列的大小为零?
  • 你这是什么意思@BryanOakley
  • 这意味着如果第 2-199 行中没有任何内容,则将其放入第 200 行与将其放入第 2 行相同
  • 好的,我明白你的意思了,但是为什么列表框没有出现在页面底部
  • 因为您将窗口设置为 500x600 并且窗口中只有 2 个小部件。您要么需要扩展列表框高度,在列表框上方添加更多小部件,要么不使用网格。或设置行跨度。或者缩小窗口

标签: python python-3.x user-interface tkinter


【解决方案1】:

如果您想使用网格,并且希望一个小部件位于其父级的底部,则需要在该小部件上方指定一些行以占用所有额外空间,迫使该小部件位于底部。这是一个例子:

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,它们将出现在列表框上方。

以这种方式使用框架是一种有价值的技术。例如,您可以在根目录中使用三个框架:一个用于顶行按钮,一个用于底部的列表框,一个用于中间的所有内容。然后您可以在这些框架上使用 pack 并保存一行代码。然后,您可以将 grid 用于中间框架内的小部件。

【讨论】:

    猜你喜欢
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    相关资源
    最近更新 更多