更改字体大小而不弄乱 Tkinter 按钮大小

Posted

技术标签:

【中文标题】更改字体大小而不弄乱 Tkinter 按钮大小【英文标题】:Change font size without messing with Tkinter button size 【发布时间】:2017-08-07 23:32:45 【问题描述】:

我在 Tkinter 中更改按钮的字体大小时遇到问题,当我尝试这样做时,按钮也会根据文本的大小展开/收缩 .有没有一种方法可以改变文本大小,使按钮的大小固定到位?

我在设计井字游戏应用程序时遇到了这个问题,但是为了省去你的麻烦,这里是一个非常最小的例子在实践中的问题:

import Tkinter as tk

MyWindow = tk.Tk()
MyWindow.geometry("500x550")


button = tk.Button(MyWindow,text="Hello!",width=17,height=10,font=('Helvetica', '20'))
button.grid(row=1, column=1)

MyWindow.mainloop()

这里最重要的部分font=('Helvetica', '15'),或者更具体地说,是数字15。如果您更改该数字并再次运行,不仅文本会变大/变小,按钮也会变小!我该如何解决这个问题?

这可能是一个真正简单的问题。我刚刚开始使用 Tkinter。提前感谢我收到的任何帮助!

【问题讨论】:

为什么将字体大小作为字符串而不是数字传递? @martineau 好吧,我通过哪种方式实际上并不重要,但我想我在网上找到了通过这种方式的文档。 不过,它并不能帮助我解决手头的真正问题 @martineau 尝试运行数字 15 的代码,然后将其替换为数字 20,看看按钮大小之间的差异。 也将 Tkinter 导入为 tk。你用的是什么操作系统? 【参考方案1】:

按钮的宽度以字符宽度为单位定义。在您的情况下,按钮被定义为 17 个字符宽。所以通过改变字符宽度(即改变字体大小)会改变按钮的宽度。 AFAIK,解决这个问题的唯一方法是将按钮放入框架中,因为框架可以以像素为单位定义它的大小。这是一种完全可以做到这一点的新型 Button:

import Tkinter as tk

class Warspyking(tk.Frame):
    '''A button that has it's width and height set in pixels'''
    def __init__(self, master=None, **kwargs):
        tk.Frame.__init__(self, master)
        self.rowconfigure(0, minsize=kwargs.pop('height', None))
        self.columnconfigure(0, minsize=kwargs.pop('width', None))
        self.btn = tk.Button(self, **kwargs)
        self.btn.grid(row=0, column=0, sticky="nsew")
        self.config = self.btn.config

#example usage:
MyWindow = tk.Tk()
MyWindow.geometry("500x550")

from itertools import cycle
fonts = cycle((('Helvetica', '11'),('Helvetica', '15'),('Helvetica', '20')))
def chg():
    button.config(font=next(fonts))

button = Warspyking(MyWindow,text="Click me!",width=200,height=100 ,font=next(fonts), command=chg)
button.grid(row=1, column=1)

MyWindow.mainloop()

编辑:根据我从 Bryan Oakley 那里学到的知识,这里有一个更简洁的实现:

class Warspyking(tk.Button):
    def __init__(self, master=None, **kwargs):
        self.img = tk.PhotoImage()
        tk.Button.__init__(self, master, image=self.img, compound='center', **kwargs)

我还应该补充一点,我非常同意 Bryan:使用这可能表明您做错了什么。您应该让 tkinter 处理大小调整。

【讨论】:

你的班级宣言和东西吓到我了。我只是开始使用 python 和 tkinter 哈哈。 GUI 严重依赖类,python 中的许多其他东西也是如此。跳进去。【参考方案2】:

通常,当您为按钮指定宽度时,该宽度以字符为单位(即:width=1 表示一个平均大小字符的宽度)。但是,如果按钮有图像,则宽度指定以像素为单位的大小。

按钮可以同时包含图像和文本,因此一种策略是将 1x1 像素作为图像放置,以便您可以指定按钮大小(以像素为单位)。当您这样做并更改字体大小时,按钮将不会增长,因为它被赋予了绝对大小。

这是一个说明该技术的示例。运行代码,然后点击“变大”或“变小”,可以看到文字大小变了,但按钮没有变。

import Tkinter as tk
import tkFont

def bigger():
    size = font.cget("size")
    font.configure(size=size+2)

def smaller():
    size = font.cget("size")
    size = max(2, size-2)
    font.configure(size=size)

root = tk.Tk()
font = tkFont.Font(family="Helvetica", size=12)

toolbar = tk.Frame(root)
container = tk.Frame(root)

toolbar.pack(side="top", fill="x")
container.pack(side="top", fill="both", expand=True)

bigger = tk.Button(toolbar, text="Bigger", command=bigger)
smaller = tk.Button(toolbar, text="Smaller", command=smaller)

bigger.pack(side="left")
smaller.pack(side="left")

pixel = tk.PhotoImage(width=1, height=1)
for row in range(3):
    container.grid_rowconfigure(row, weight=1)
    for column in range(3):
        container.grid_columnconfigure(column, weight=1)
        button = tk.Button(container, font=font, text="x",
            image=pixel, compound="center", width=20, height=20)
        button.grid(row=row, column=column)

root.mainloop()

话虽如此,但几乎从来没有一个好主意。如果用户想要更大的字体,整个 UI 应该适应。 Tkinter 非常擅长实现这一点,以至于它在默认情况下大部分都可以正常工作。

【讨论】:

这太棒了,太容易理解了!作为标记,这个答案在python 2.x上,为了在python 3.x上进行测试,请在第一行将Tkinter编辑为tkinter,在第二行将import tkFont编辑为from tkinter import font,然后@下面的987654329@到font.Font(,就大功告成了!【参考方案3】:

我找到了这个问题的解决方案。我试图解决一个类似的问题:我想把图像放在标签上。我将图像大小设置为标签大小。当我试图用命令label.config(image=img) 放置它时,标签大小会增长。图像具有我设置的大小,因此它没有完全覆盖标签。我正在使用网格管理器。所有尺寸都不是预先输入的,而是由 Tkinter 计算的。我使用的是grid_columnconfiguregrid_rowconfigure。我找到的解决方案是将此带有图像的标签(或您的情况下的按钮)放在LabelFrame 并将grid_propagate 设置为False。 代码示例:

MyWindow = tk.Tk()
MyWindow.geometry("500x550")

#create LabelFrame (200x200)
label = tk.LabelFrame(MyWindow, width=200, height=200)

#grid manager to set label localization
labelk.grid(row=0, column=0)

#label row and column configure: first argument is col or row id
label.grid_rowconfigure(0, weight=1)
label.grid_columnconfigure(0, weight=1)

#cancel propagation
label.grid_propagate(False)

#Create button and set it localization. You can change it font without changing size of button, but if You set too big not whole will be visible
button = t.Button(label, text="Hello!", font=('Helvetica', '20'))

#Use sticky to button took up the whole label area
button.grid(row=0, column=0, sticky='nesw')

MyWindow.mainloop()

字体大小为 40 和 20 的结果:

通过网格管理器创建具有动态大小的按钮示例:

MyWindow = tk.Tk()
MyWindow.geometry("500x550")

#Divide frame on 3x3 regions
for col in range(3):
    MyWindow.grid_columnconfigure(col, weight=1)
for row in range(3):
    MyWindow.grid_rowconfigure(row, weight=1)

label = tk.LabelFrame(MyWindow)

#Put label in the middle
label.grid(row=1, column=1, sticky='nesw')
label.grid_propagate(False)
label.grid_rowconfigure(0, weight=1)
label.grid_columnconfigure(0, weight=1)
button = tk.Button(label, text="Hello!", font=('Helvetica', '30'))
button.grid(row=0, column=0, sticky='nesw')
MyWindow.mainloop()

这是迟到的答案,但也许它会帮助某人。

【讨论】:

***.com/q/67241484/14715170 你能帮帮我吗?

以上是关于更改字体大小而不弄乱 Tkinter 按钮大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在不知道小部件的字体系列/大小的情况下更改小部件的字体样式?

更改单选按钮旁边的字体大小

无法更改像素本上的 tkinter 字体

无法更改 HTML 表单提交按钮的字体大小

在 Extjs 4 中更改按钮字体大小

如何在不更改字体大小的情况下快速更改 UISegmentedControl 的字体?