更改字体大小而不影响 Tkinter 按钮大小
Change font size without messing with Tkinter button size
我在尝试更改 Tkinter 中的按钮时遇到问题更改按钮的字体大小按钮也expands/contracts 基于文本的大小。有没有一种方法可以在固定按钮大小的情况下更改文本大小?
我 运行 在设计井字游戏应用程序时遇到过这个问题,但是为了省去您的麻烦,这里有一个非常最小的示例 中的问题实践:
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。如果您再次 更改该数字 并 运行 ,不仅文本将变为 bigger/smaller,,按钮也将变为 !我该如何解决这个问题?
这可能是一个真的简单的问题。我刚刚开始使用 Tkinter。提前感谢我收到的任何帮助!
按钮的宽度以字符宽度为单位定义。在您的例子中,按钮被定义为 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 处理大小。
通常,当您为按钮指定宽度时,该宽度以字符为单位(即:width=1
表示一个平均大小的字符的宽度)。但是,如果按钮有图像,则宽度指定以像素为单位的大小。
一个按钮可以同时包含图像和文本,因此一种策略是将 1x1 像素作为图像,这样您就可以以像素为单位指定按钮大小。当您这样做并更改字体大小时,按钮将不会变大,因为它被赋予了绝对大小。
这是一个说明该技术的示例。 运行 代码,然后单击 "bigger" 或 "smaller" 以查看文本大小发生变化但按钮没有变化。
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 真的很擅长实现这一点,以至于它在默认情况下几乎都能正常工作。
我找到了这个问题的解决方案。我试图解决一个类似的问题:我想把图像贴在标签上。我将图像大小设置为等于标签大小。当我一直试图用命令 label.config(image=img)
放置它时,标签大小会增加。图片有我设置的尺寸,所以它没有完全覆盖标签。我正在使用网格管理器。所有大小都不是预先输入的,而是由 Tkinter 计算的。我使用的是 grid_columnconfigure
和 grid_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()
回答晚了,但也许会对某人有所帮助。
我在尝试更改 Tkinter 中的按钮时遇到问题更改按钮的字体大小按钮也expands/contracts 基于文本的大小。有没有一种方法可以在固定按钮大小的情况下更改文本大小?
我 运行 在设计井字游戏应用程序时遇到过这个问题,但是为了省去您的麻烦,这里有一个非常最小的示例 中的问题实践:
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。如果您再次 更改该数字 并 运行 ,不仅文本将变为 bigger/smaller,,按钮也将变为 !我该如何解决这个问题?
这可能是一个真的简单的问题。我刚刚开始使用 Tkinter。提前感谢我收到的任何帮助!
按钮的宽度以字符宽度为单位定义。在您的例子中,按钮被定义为 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 处理大小。
通常,当您为按钮指定宽度时,该宽度以字符为单位(即:width=1
表示一个平均大小的字符的宽度)。但是,如果按钮有图像,则宽度指定以像素为单位的大小。
一个按钮可以同时包含图像和文本,因此一种策略是将 1x1 像素作为图像,这样您就可以以像素为单位指定按钮大小。当您这样做并更改字体大小时,按钮将不会变大,因为它被赋予了绝对大小。
这是一个说明该技术的示例。 运行 代码,然后单击 "bigger" 或 "smaller" 以查看文本大小发生变化但按钮没有变化。
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 真的很擅长实现这一点,以至于它在默认情况下几乎都能正常工作。
我找到了这个问题的解决方案。我试图解决一个类似的问题:我想把图像贴在标签上。我将图像大小设置为等于标签大小。当我一直试图用命令 label.config(image=img)
放置它时,标签大小会增加。图片有我设置的尺寸,所以它没有完全覆盖标签。我正在使用网格管理器。所有大小都不是预先输入的,而是由 Tkinter 计算的。我使用的是 grid_columnconfigure
和 grid_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()
回答晚了,但也许会对某人有所帮助。