在Python Tk应用程序中调整列表框的大小

在Python Tk应用程序中调整列表框的大小,python,user-interface,tkinter,tk,Python,User Interface,Tkinter,Tk,我有这个: #!/usr/bin/env python import Tkinter import ttk import datetime from Tkinter import Tk, Frame, Entry, Button, Listbox, N, S, E, W class TkPersonalActivityLog(object): def __init__(self): pass def configure_window(self, root

我有这个:

#!/usr/bin/env python

import Tkinter
import ttk
import datetime

from Tkinter import Tk, Frame, Entry, Button, Listbox, N, S, E, W

class TkPersonalActivityLog(object):

    def __init__(self):
        pass

    def configure_window(self, root):

        root.grid_columnconfigure(0, weight=1)
        root.grid_rowconfigure(0, weight=1)
        root.grid_rowconfigure(1, weight=1)
        root.grid_rowconfigure(2, weight=2)

        self.frame = Frame(root)
        self.frame.grid(sticky=N+E+S+W)
        self.frame.grid_columnconfigure(0, weight=2)
        self.frame.grid_rowconfigure(0, weight=2)
        self.frame.grid_rowconfigure(1, weight=2)
        self.frame.grid_rowconfigure(2, weight=2)

        self.entry = Entry(self.frame, bg='#e3ecfc')
        self.entry.grid(row=0, sticky=E+W)
        self.entry.focus_set()

        self.savebutton = Button(self.frame, text="Save and Minimize", fg="Black", command=self.cb_save_button)
        self.savebutton.grid(row=1)

        self.history = Listbox(self.frame)
        self.history.grid(row=2,sticky=N+S+E+W)

    def cb_save_button(self):
        act = (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), self.entry.get())
        self.history.insert(0, ' '.join(act))

    def mainloop(self):
        self.root = Tk()
        self.configure_window(self.root)
        self.root.mainloop()


if __name__ == '__main__':
    main = TkPersonalActivityLog()
    main.mainloop()
在调整整个窗口的大小时,我希望
self.history
调整窗口底部的大小。事实上,它并没有这样做:

也就是说,它确实可以根据我的需要水平调整主窗口的侧面大小,但不会垂直调整窗口底部的大小


为什么呢?毕竟,我确实告诉它是
sticky=N+S+E+W

如果您只是将Tkinter作为tk导入,您可以避免自己的一些头痛

尝试更改此选项:

from Tkinter import Tk, Frame, Entry, Button, Listbox, N, S, E, W
致:

此外,您不需要导入
N、S、E、W
,因为您可以使用字符串来表示这些方向。因此
sticky=“nsew”
sticky=N+S+E+W
您的主要问题不是列表框没有填充框架,而是您的
self.frame
没有填充根窗口

首先,让我们删除所有无用的权重。由于您的
self.frame
仅被放置在
行=0,列=0上,并且您没有其他小部件放置在根窗口中,因此不需要为其他行/列提供权重

更改此项:

root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)
root.grid_rowconfigure(1, weight=1)
root.grid_rowconfigure(2, weight=2)
致:

然后,让我们更改帧的权重,以便列表框展开

更改:

self.frame.grid_columnconfigure(0, weight=2)
self.frame.grid_rowconfigure(0, weight=2)
self.frame.grid_rowconfigure(1, weight=2)
self.frame.grid_rowconfigure(2, weight=2)
致:

这将解决您的大小调整问题

结果:

另一方面,您不止一次地从tkinter导入方法。这应该避免,也不需要。这是您的代码的一个修改版本,我认为它更简洁,完成相同的任务需要更少的行

#!/usr/bin/env python

import Tkinter as tk
import datetime

class TkPersonalActivityLog(object):

    def __init__(self, root):
        self.master = root
        self.master.rowconfigure(0, weight=1)
        self.master.columnconfigure(0, weight=1)

        self.frame = tk.Frame(self.master)
        self.frame.grid(sticky="nsew")
        self.frame.grid_columnconfigure(0, weight=1)
        self.frame.grid_rowconfigure(2, weight=1)

        self.entry = tk.Entry(self.frame, bg='#e3ecfc')
        self.entry.grid(row=0, sticky="ew")
        self.entry.focus_set()

        self.savebutton = tk.Button(self.frame, text="Save and Minimize", fg="Black", command=self.cb_save_button)
        self.savebutton.grid(row=1)

        self.history = tk.Listbox(self.frame)
        self.history.grid(row=2,sticky="nsew")

    def cb_save_button(self):
        act = (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), self.entry.get())
        self.history.insert(0, ' '.join(act))


if __name__ == '__main__':
    root = tk.Tk()
    main = TkPersonalActivityLog(root)
    root.mainloop()

此代码较短,通过使用
import Tkinter as Tk

可以防止多次导入。我认为,如果您为根窗口和
self.frame
提供独特的背景色,您可能会对看到的结果感到惊讶。这样做将有助于验证
self.frame
填充整个窗口的假设是否正确。这将告诉您问题是出在列表框上还是出在其他地方。@BryanOakley顺便问一下,您能解释一下为什么小部件被打包到窗口中,而(据我所知)它们被打包到框架中,而框架从未打包吗?@Rightleg框架被放置在根窗口中,并带有
grid()
@Sierra Mountaintech哦,糟糕,我跳过了这一行,因为它们都是以
网格
开头的。非常感谢。
self.frame.grid_columnconfigure(0, weight=2)
self.frame.grid_rowconfigure(0, weight=2)
self.frame.grid_rowconfigure(1, weight=2)
self.frame.grid_rowconfigure(2, weight=2)
self.frame.grid_columnconfigure(0, weight=1)
self.frame.grid_rowconfigure(2, weight=1)
#!/usr/bin/env python

import Tkinter as tk
import datetime

class TkPersonalActivityLog(object):

    def __init__(self, root):
        self.master = root
        self.master.rowconfigure(0, weight=1)
        self.master.columnconfigure(0, weight=1)

        self.frame = tk.Frame(self.master)
        self.frame.grid(sticky="nsew")
        self.frame.grid_columnconfigure(0, weight=1)
        self.frame.grid_rowconfigure(2, weight=1)

        self.entry = tk.Entry(self.frame, bg='#e3ecfc')
        self.entry.grid(row=0, sticky="ew")
        self.entry.focus_set()

        self.savebutton = tk.Button(self.frame, text="Save and Minimize", fg="Black", command=self.cb_save_button)
        self.savebutton.grid(row=1)

        self.history = tk.Listbox(self.frame)
        self.history.grid(row=2,sticky="nsew")

    def cb_save_button(self):
        act = (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), self.entry.get())
        self.history.insert(0, ' '.join(act))


if __name__ == '__main__':
    root = tk.Tk()
    main = TkPersonalActivityLog(root)
    root.mainloop()