Tkinter - 文本和滚动条小部件不填充和适合框架
Tkinter - Text and Scrolled bar widgets don't fill and fit the frame
我创建了一个自定义框架,其中已经放置了两个小部件(文本和滚动条)。当我使用它时,对象可以工作,但内部小部件不遵循“网格”规则。
下面是我的代码:
import tkinter as tk
from tkinter import ttk
class TextFrame(tk.Frame):
def __init__(self, container):
super().__init__(container)
# main frame:
self.F1=tk.Frame(self, background="white", highlightbackground="#7a7a7a", highlightthickness=1)
self.F1.pack(expand=True, fill=tk.BOTH)
# text widget:
self.T1=tk.Text(self.F1, wrap=tk.WORD, font=("Segoe UI", 9), border=0)
self.T1.grid(padx=(0, 16), row=1, column=1, sticky="nsw")
# scrolling bar:
self.SB1=ttk.Scrollbar(self.F1, orient="vertical", command=self.T1.yview)
self.SB1.grid(padx=(0, 1), pady=(1, 1), row=1, column=1, sticky="nse")
self.T1.configure(yscrollcommand=self.SB1.set)
# main window:
class MainWindow:
def __init__(self):
self.parent=tk.Tk()
self.parent.geometry("500x300+370+100")
self.parent.title("Test")
self.parent.configure(background="#f0f0f0")
self.parent.minsize(400, 200)
obj=TextFrame(self.parent)
obj.pack(padx=(10,10), pady=(10,10), expand=True, fill=tk.BOTH)
self.parent.mainloop()
if __name__=="__main__":
app=MainWindow()
我只想让小部件填充并适合框架,当我展开它时,它们都必须展开,但它没有发生!为什么?我该如何解决这个问题?
更新:
我按照您的建议修改了代码:
import tkinter as tk
from tkinter import ttk
class TextFrame(tk.Frame):
def __init__(self, container):
super().__init__(container)
# main frame:
self.F1=tk.Frame(self, background="white", highlightbackground="#7a7a7a", highlightthickness=1)
self.F1.pack(expand=True, fill=tk.BOTH)
self.F1.grid_rowconfigure(0, weight=1)
self.F1.grid_columnconfigure(0, weight=1)
# text widget:
self.T1=tk.Text(self.F1, wrap=tk.WORD, font=("Segoe UI", 9), border=0)
self.T1.grid(row=0, column=0, sticky="nsew")
# scrolling bar:
self.SB1=ttk.Scrollbar(self.F1, orient="vertical", command=self.T1.yview)
self.T1.configure(yscrollcommand=self.SB1.set)
self.SB1.grid(row=0, column=1, sticky="nsew")
self.F1.grid_rowconfigure(0, weight=1)
self.F1.grid_columnconfigure(0, weight=1)
# main window:
class MainWindow:
def __init__(self):
self.parent=tk.Tk()
self.parent.geometry("500x300+370+100")
self.parent.title("Test")
self.parent.configure(background="#f0f0f0")
self.parent.minsize(400, 200)
ttk.Label(self.parent, text="Test:").pack(anchor="w")
obj=TextFrame(self.parent)
obj.pack(padx=(10,10), pady=(10,10), expand=True, fill=tk.BOTH)
ttk.Label(self.parent, text="Test:").pack(anchor="w")
self.Entry=ttk.Entry(self.parent)
self.Entry.pack(fill=tk.BOTH, anchor="w", padx=(10,10), pady=(10,10))
self.parent.mainloop()
if __name__=="__main__":
app=MainWindow()
但现在我有另一个问题。如果我将其他小部件放在主 window 中,它们将被自定义框架覆盖。查看底部的两个小部件,标签和条目:
所有小部件都应该可见,但自定义框架似乎想要所有 space 为他自己。我该如何解决这种不良行为?
我认为您需要为行和列添加类似这样的内容。这样,当缩放 window 变大或变小时,它们会被同等对待。
self.rowconfigure(0, weight=1),
self.columnconfigure(0, weight=1)
默认情况下,网格行和列会扩大或缩小以适应其内容的大小。如果您希望扩展一个或多个行或列以填充 window,您必须通过适当地设置这些行或列的 weight
属性来明确声明。
在具体的情况下,希望一行一列展开,需要将该行和该列的权重设置为正整数。由于这是您要展开的唯一行或列,因此任何正整数都可以。
self.F1.grid_rowconfigure(0, weight=1)
self.F1.grid_columnconfigure(0, weight=1)
您还需要 sticky
属性类似于 nsew
(北、南、东、西),以便 row/column 的内容扩展以填充 space四面都给。
您还遇到了将滚动条和文本小部件放在同一列中的问题。它们需要在单独的列中。此外,虽然从 1 开始计算行和列是无害的,但第一行和第一列是 0。
self.T1.grid(row=0, column=0, sticky="nsew")
self.SB1.grid(row=0, column=1, sticky="nsew")
有关 weight
参数的详细信息,请参阅
我创建了一个自定义框架,其中已经放置了两个小部件(文本和滚动条)。当我使用它时,对象可以工作,但内部小部件不遵循“网格”规则。
下面是我的代码:
import tkinter as tk
from tkinter import ttk
class TextFrame(tk.Frame):
def __init__(self, container):
super().__init__(container)
# main frame:
self.F1=tk.Frame(self, background="white", highlightbackground="#7a7a7a", highlightthickness=1)
self.F1.pack(expand=True, fill=tk.BOTH)
# text widget:
self.T1=tk.Text(self.F1, wrap=tk.WORD, font=("Segoe UI", 9), border=0)
self.T1.grid(padx=(0, 16), row=1, column=1, sticky="nsw")
# scrolling bar:
self.SB1=ttk.Scrollbar(self.F1, orient="vertical", command=self.T1.yview)
self.SB1.grid(padx=(0, 1), pady=(1, 1), row=1, column=1, sticky="nse")
self.T1.configure(yscrollcommand=self.SB1.set)
# main window:
class MainWindow:
def __init__(self):
self.parent=tk.Tk()
self.parent.geometry("500x300+370+100")
self.parent.title("Test")
self.parent.configure(background="#f0f0f0")
self.parent.minsize(400, 200)
obj=TextFrame(self.parent)
obj.pack(padx=(10,10), pady=(10,10), expand=True, fill=tk.BOTH)
self.parent.mainloop()
if __name__=="__main__":
app=MainWindow()
我只想让小部件填充并适合框架,当我展开它时,它们都必须展开,但它没有发生!为什么?我该如何解决这个问题?
更新:
我按照您的建议修改了代码:
import tkinter as tk
from tkinter import ttk
class TextFrame(tk.Frame):
def __init__(self, container):
super().__init__(container)
# main frame:
self.F1=tk.Frame(self, background="white", highlightbackground="#7a7a7a", highlightthickness=1)
self.F1.pack(expand=True, fill=tk.BOTH)
self.F1.grid_rowconfigure(0, weight=1)
self.F1.grid_columnconfigure(0, weight=1)
# text widget:
self.T1=tk.Text(self.F1, wrap=tk.WORD, font=("Segoe UI", 9), border=0)
self.T1.grid(row=0, column=0, sticky="nsew")
# scrolling bar:
self.SB1=ttk.Scrollbar(self.F1, orient="vertical", command=self.T1.yview)
self.T1.configure(yscrollcommand=self.SB1.set)
self.SB1.grid(row=0, column=1, sticky="nsew")
self.F1.grid_rowconfigure(0, weight=1)
self.F1.grid_columnconfigure(0, weight=1)
# main window:
class MainWindow:
def __init__(self):
self.parent=tk.Tk()
self.parent.geometry("500x300+370+100")
self.parent.title("Test")
self.parent.configure(background="#f0f0f0")
self.parent.minsize(400, 200)
ttk.Label(self.parent, text="Test:").pack(anchor="w")
obj=TextFrame(self.parent)
obj.pack(padx=(10,10), pady=(10,10), expand=True, fill=tk.BOTH)
ttk.Label(self.parent, text="Test:").pack(anchor="w")
self.Entry=ttk.Entry(self.parent)
self.Entry.pack(fill=tk.BOTH, anchor="w", padx=(10,10), pady=(10,10))
self.parent.mainloop()
if __name__=="__main__":
app=MainWindow()
但现在我有另一个问题。如果我将其他小部件放在主 window 中,它们将被自定义框架覆盖。查看底部的两个小部件,标签和条目:
所有小部件都应该可见,但自定义框架似乎想要所有 space 为他自己。我该如何解决这种不良行为?
我认为您需要为行和列添加类似这样的内容。这样,当缩放 window 变大或变小时,它们会被同等对待。
self.rowconfigure(0, weight=1),
self.columnconfigure(0, weight=1)
默认情况下,网格行和列会扩大或缩小以适应其内容的大小。如果您希望扩展一个或多个行或列以填充 window,您必须通过适当地设置这些行或列的 weight
属性来明确声明。
在具体的情况下,希望一行一列展开,需要将该行和该列的权重设置为正整数。由于这是您要展开的唯一行或列,因此任何正整数都可以。
self.F1.grid_rowconfigure(0, weight=1)
self.F1.grid_columnconfigure(0, weight=1)
您还需要 sticky
属性类似于 nsew
(北、南、东、西),以便 row/column 的内容扩展以填充 space四面都给。
您还遇到了将滚动条和文本小部件放在同一列中的问题。它们需要在单独的列中。此外,虽然从 1 开始计算行和列是无害的,但第一行和第一列是 0。
self.T1.grid(row=0, column=0, sticky="nsew")
self.SB1.grid(row=0, column=1, sticky="nsew")
有关 weight
参数的详细信息,请参阅