更改字体大小而不弄乱 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_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()
这是迟到的答案,但也许它会帮助某人。
【讨论】:
***.com/q/67241484/14715170 你能帮帮我吗?以上是关于更改字体大小而不弄乱 Tkinter 按钮大小的主要内容,如果未能解决你的问题,请参考以下文章