Tkinter:标签和按钮框之间的空间太大

时间:2019-11-23 20:12:43

标签: python python-3.x tkinter

我对Tkinter还是很陌生,我用不同的小部件构建了一个小窗口。

我的代码如下:

import tkinter as tk
from tkinter import ttk


class Application(tk.Frame):

    def __init__(self, master):
        super().__init__(master)
        self.master = master
        self.master.geometry("800x600")
        self.master.title("Tkinter Sandbox")
        self.master.grid_rowconfigure(0, weight=1)
        self.master.grid_columnconfigure(1, weight=1)

       self._create_left_frame()
       self._create_button_bar()
       self._create_label_frame()

    def _create_left_frame(self):
       frame = tk.Frame(self.master, bg="red")

       tree_view = ttk.Treeview(frame)
       tree_view.column("#0", stretch=tk.NO)
       tree_view.heading("#0", text="Treeview")
       tree_view.pack(fill=tk.Y, expand=1)
       frame.grid(row=0, column=0, rowspan=2, sticky=tk.N + tk.S)

    def _create_button_bar(self):
       frame = tk.Frame(self.master, bg="blue")

       button_run_single = tk.Button(frame, text="Button 1")
       button_run_all = tk.Button(frame, text="Button 2")
       button_details = tk.Button(frame, text="Button 3")
       button_run_single.grid(row=0, column=0)
       button_run_all.grid(row=0, column=1, padx=(35, 35))
       button_details.grid(row=0, column=2)
       frame.grid(row=0, column=1, sticky=tk.N)

    def _create_label_frame(self):
       frame = tk.Frame(self.master, bg="blue")

       name_label = tk.Label(frame, text="Label 1")
       performance_label = tk.Label(frame, text="Label 2")
       name_entry = tk.Entry(frame)
       performance_entry = tk.Entry(frame)
       name_label.grid(row=0, column=0)
       name_entry.grid(row=0, column=1)
       performance_label.grid(row=1, column=0)
       performance_entry.grid(row=1, column=1)
       frame.grid(row=1, column=1)


if __name__ == '__main__':
    root = tk.Tk()
    app = Application(root)
    app.mainloop()

三个按钮和标签+输入框之间是一个巨大的空间。我希望按钮和标签+入口框在彼此的正下方,没有巨大的空间,但树形视图也应该在整个应用程序窗口上垂直扩展。

我认为问题可能出在我的行和列配置上,但我不知道如何解决此问题。

3 个答案:

答案 0 :(得分:2)

结构化代码的方式很难看到问题。作为一般的经验法则,对单个父级中的小部件的所有gridpack调用都应该放在一个地方。否则,您将在功能之间创建难以理解和理解的依赖关系。

我建议让您的每个辅助函数返回框架,而不是在框架上调用grid。这样,您就可以将Application.__init__的控件分配给窗口主要部分的布局。

例如:

left_frame = self._create_left_frame()
button_bar = self._create_button_bar()
label_frame = self._create_label_frame()

left_frame.pack(side="left", fill="y")
button_bar.pack(side="top", fill="x")
label_frame.pack(side="top", fill="both", expand=True)

我在这里使用pack是因为这种布局所需的代码少于grid。但是,如果您选择切换到grid,或者希望以后在根窗口中添加更多小部件,则只需修改此功能,而无需修改多个功能中的grid调用。

注意:这要求您的每个函数都执行return frame才能将框架传递回__init__方法。您还需要从每个助手功能中删除frame.grid

只需进行简单的更改,您最终就会在右侧部分顶部的按钮栏和标签/条目组合中找到。在下面的屏幕截图中,我将button_bar的背景更改为绿色,以便可以看到它填充了UI右侧的顶部。

screenshot

答案 1 :(得分:1)

您需要换行

self.master.grid_rowconfigure(0, weight=1)

self.master.grid_rowconfigure(1, weight=1)

,以便第二行占用所有空间。然后,您需要通过将粘性参数添加到_create_label_frame中的网格调用中来将小部件从标签框架粘贴到顶部:

frame.grid(row=1, column=1, sticky=tk.N)

答案 2 :(得分:1)

我更喜欢使用Pack Function,因为它提供了一个更开放的窗口-易于配置。当您使用Pack()时,您可以使用没有文本且仅包含空格的标签来创建间隔符,这样做不会遇到您面临的问题。

相关问题