【问题标题】:Tkinter Text Widget to be inside Notebook as resizable/streched/font changableTkinter 文本小部件在 Notebook 内可调整大小/拉伸/字体可更改
【发布时间】:2020-12-03 05:31:25
【问题描述】:
  1. 为什么我不能用 sticky 在 Notebook 小部件(Tab) 内拉伸 Text 小部件?
  2. 如何在更改字体时获得固定的文本小部件大小,而 grid_propagate 不给出结果。
  3. 如何再次调整同一窗口的大小(权重)

谢谢

import tkinter as tk
from tkinter import *
from tkinter import ttk, font


class TextInsideNotebook:
    def __init__(self, main):
        self.main = main
        self.fontSizePx = -20

        # Font
        self.fontspecs = font.Font(family="consolas", size=self.fontSizePx)

        # Notebook
        self.tab = ttk.Notebook(main, width=800, height=600)
        self.tab.grid(row=0, column=0, sticky="nsew")

        # Tab
        self.tab_frame = Frame(self.tab)
        self.tab.grid(row=0, column=0, sticky="nsew")
        self.tab.add(self.tab_frame, text='  NEW FILE ')

        # Text Area
        self.textarea = tk.Text(self.tab_frame, font=self.fontspecs)

        self.textarea.grid(row=0, column=0, sticky="nsew")
        self.tab_frame.grid_propagate(False)

        # weights
        main.columnconfigure(0, weight=1)
        main.rowconfigure(0, weight=1)

        # Bind
        self.main.bind('<Control-MouseWheel>', self.new_font_size)

    def new_font_size(self, event):
        if event.delta > 0:
            self.fontSizePx = self.fontSizePx - 2
        else:
            self.fontSizePx = self.fontSizePx + 2

        self.fontspecs.config(size=self.fontSizePx)


if __name__ == "__main__":
    main = tk.Tk()
    agc = TextInsideNotebook(main)
    main.mainloop()

【问题讨论】:

  • 请一次只问一个问题。

标签: python python-3.x tkinter


【解决方案1】:

为什么我不能在 Notebook 小部件(Tab) 中用粘性拉伸 Text 小部件?

文本确实粘在您分配给它的区域的边缘。但是,您没有为 self.tab_frame 内的任何行或列赋予权重,因此行和列仅与文本小部件一样宽和高。

如果您只是将文本小部件放在框架中,使用pack 比使用网格要容易得多,因为它只需要一行代码而不是三行代码:

self.textarea.pack(fill="both", expand=True)

如果您出于某种原因希望坚持使用grid,则必须为包含文本小部件的行和列赋予非零权重

self.tab_frame.grid_rowconfigure(0, weight=1)
self.tab_frame.grid_columnconfigure(0, weight=1)
self.textarea.grid(row=0, column=0, sticky="nsew")

根据经验,在任何具有由grid 管理的子级的小部件中,您应该始终为至少一行和一列赋予非零的正权重。

如何在更改字体时获得固定的文本小部件大小

我建议给小部件一个小尺寸,例如 1x1,然后让几何管理器(packplacegrid)拉伸它以适应分配给它的空间。

self.textarea = tk.Text(..., width=1, height=1)

同一个窗口如何重新调整大小(权重)?

我不明白这个问题。它永远不会调整大小。

【讨论】:

  • 谢谢布莱恩,正是 self.tab_frame.grid_row/columnconfigure 连接了我想要的所有三个答案。我确信在主机上这样做并获得相同的结果,但不是。在每一帧你必须重复做 .grid_row/columnconfigure
猜你喜欢
  • 1970-01-01
  • 2017-10-18
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 2017-12-29
相关资源
最近更新 更多