如何在字体更改时停止 Tkinter Text 小部件调整大小?
Posted
技术标签:
【中文标题】如何在字体更改时停止 Tkinter Text 小部件调整大小?【英文标题】:How to stop Tkinter Text widget resize on font change? 【发布时间】:2012-04-07 16:31:08 【问题描述】:我正在尝试为初学者创建一个简单的文字处理器,以便更好地学习 Python。
我在主编辑程序中使用 Tkinter Text
小部件,唯一的问题是 height 和 width 是由字符定义的。
这会在我更改字体时产生问题,因为并非所有字体的宽度都相同。
每次更改字体时,Text 小部件都会重新调整大小,尽管从技术上讲它是相同的宽度和高度。尝试输入内容时这看起来很荒谬,我正在尝试使文字处理器尽可能nice。
有没有办法以像素为单位定义宽度和高度?
.grid_propagate(False)
没有用,因为大小在技术上没有改变,只有字符宽度。
我现在尽量远离wxPython
,因为到目前为止我所做的一切都在 Tkinter 中。
我在谷歌上进行了无数小时的广泛搜索,但没有找到解决方案。
【问题讨论】:
【参考方案1】:当你说你不能使用grid_propagate(False)
时你错了,因为你可以。 grid_propagate
与 实际 大小有关,而不是与 属性 大小有关。此外,如果您只是使用wm_geometry
为您的应用程序提供固定大小,则字体更改不会影响窗口的大小。
这是一个使用grid_propagate
的示例,它将容器设置为以像素为单位的固定大小:
import Tkinter as tk
import tkFont
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self._textFont = tkFont.Font(name="TextFont")
self._textFont.configure(**tkFont.nametofont("TkDefaultFont").configure())
toolbar = tk.Frame(self, borderwidth=0)
container = tk.Frame(self, borderwidth=1, relief="sunken",
width=600, height=600)
container.grid_propagate(False)
toolbar.pack(side="top", fill="x")
container.pack(side="bottom", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
text = tk.Text(container, font="TextFont")
text.grid(row=0, column=0, sticky="nsew")
zoomin = tk.Button(toolbar, text="+", command=self.zoom_in)
zoomout = tk.Button(toolbar, text="-", command=self.zoom_out)
zoomin.pack(side="left")
zoomout.pack(side="left")
text.insert("end", '''Press te + and - buttons to increase or decrease the font size''')
def zoom_in(self):
font = tkFont.nametofont("TextFont")
size = font.actual()["size"]+2
font.configure(size=size)
def zoom_out(self):
font = tkFont.nametofont("TextFont")
size = font.actual()["size"]-2
font.configure(size=max(size, 8))
if __name__ == "__main__":
app = SampleApp()
app.mainloop()
【讨论】:
我指的是 grid_propagate 不适用于 Text 小部件。从技术上讲,它可以工作,但它仍然会扩展,因为它的宽度以字符为单位,因此它在字符中保持相同的长度,但并非所有字符大小都相同。文本小部件没有填满我的整个窗口,我希望以后有空间添加按钮。问题是实际的“文本”小部件不断调整大小以满足每种不同字体的需求。输入内容并更改字体并看到文本小部件扩展和收缩时看起来很傻。 @reallycoolnerd:很抱歉,您对grid_propagate
的看法不正确。它与 size 属性无关,它与小部件的实际大小有关。如果您可以在尝试使用grid_propagate
的地方显示代码但它不起作用,我们可以修复它。听起来你不明白grid_propagate
的工作原理。你知道你必须打电话给父母吗?在文本小部件本身上调用 grid_propagate
无效。
@reallycoolnerd:我的示例中有什么让您感到困惑的地方吗?该示例清楚地显示了我如何通过设置其容器的大小并关闭几何传播来设置文本小部件的大小(以像素为单位)。也许如果你能解释为什么你不理解这个例子,那么我就能弄清楚如何改进它。
@reallycoolnerd:仅仅因为文本小部件填充了框架并不意味着您不能使用其他小部件。将框架和文本小部件视为单个小部件。您可以将该组合放在另一个框架中,以便添加其他小部件。我的例子说明了——除了文本/框架组合之外,还有按钮和工具栏。
@reallycoolnerd:如果您喜欢这个答案,请投票。如果它解决了您的问题,请单击答案旁边的复选标记接受它。这样做可以让其他人知道他们不需要尝试给你不同的答案。有关更多信息,请参阅meta.stackexchange.com/questions/5234/…【参考方案2】:
..对此进行了测试:这适用于框架大小,但不适用于(滚动)文本小部件大小。 我的设置有点复杂,有 2 个站点的主机,每个站点的主机和具有各种内容的框架,i.a.滚动文本小部件。
添加 grid_propagate、*_row- 和 *_columnconfigure 可以防止主框架调整大小,即使向主框架和内容框架添加网格选项,也会导致主框架调整大小.. 更改字体时,小部件大小也会发生变化 - 和,在最后一个示例中,scrolledtext-widget 消失在右侧的框架后面(包含其他小部件)..
【讨论】:
解决方法当然是调整高度(/行)和宽度(/每行字母),直到一切都合适。 (..对不起:忘了提..)【参考方案3】:使用pack geometry manager
打包小部件。
我正在创建一个记事本并希望字体示例区域显示字体大小。 所以我创建了一个标签框架并在其中添加了一个标签 - 即 AabYyZz - 以显示字体示例。
当我增加字体大小时,标签框的大小也增加了,所以我尝试了.pack_propagate
方法并且它起作用了。
【讨论】:
以上是关于如何在字体更改时停止 Tkinter Text 小部件调整大小?的主要内容,如果未能解决你的问题,请参考以下文章
如何从Tkinter,Python中的Text小部件中移除焦点
如何将Tkinter Text小部件的撤消/重做历史记录复制到另一个小部件中