我对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()
三个按钮和标签+输入框之间是一个巨大的空间。我希望按钮和标签+入口框在彼此的正下方,没有巨大的空间,但树形视图也应该在整个应用程序窗口上垂直扩展。
我认为问题可能出在我的行和列配置上,但我不知道如何解决此问题。
答案 0 :(得分:2)
结构化代码的方式很难看到问题。作为一般的经验法则,对单个父级中的小部件的所有grid
或pack
调用都应该放在一个地方。否则,您将在功能之间创建难以理解和理解的依赖关系。
我建议让您的每个辅助函数返回框架,而不是在框架上调用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右侧的顶部。
答案 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()时,您可以使用没有文本且仅包含空格的标签来创建间隔符,这样做不会遇到您面临的问题。