2017-03-16 143 views
3

搞乱。有没有一种方法可以在按钮大小固定的情况下更改文本大小?更改字体大小不会与我有麻烦<strong>在Tkinter的改变按钮</strong>的字体大小,当我尝试做<em>按钮还扩展基于文本的大小/合同</em> 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。预先感谢我收到的任何帮助!

+0

为什么你将字号传递为字符串而不是数字? – martineau

+0

@martineau嗯,我通过它的方式其实并不重要,但我想我在网上发现了通过它的文档。 – warspyking

+0

尽管如此,它并没有帮助我解决手头上的真实问题 – warspyking

回答

2

按钮的宽度以字符宽度为单位进行定义。在你的情况下,按钮被定义为17个字符宽。所以通过改变字符宽度(即改变字体大小)来改变按钮的宽度。 AFAIK,唯一的解决方法是将按钮放入一个Frame中,因为Frame可以用像素来定义它的大小。这里有一个新的按钮的那正是这么做的:

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() 

编辑:基于我从布莱恩·奥克利了解到,这里有一个更整洁的实现:

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) 

我还要补充一点,我很同意布莱恩:使用这可能表明你做错了什么。你应该让tkinter处理大小。

+0

你的班级声明和东西吓到我了。我只是开始在python和tkinter哈哈。 – warspyking

+0

GUI很大程度上依赖于类,就像python中的许多其他东西一样。跳进去。 – Novel

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非常善于实现这一目标,所有这些都是默认情况下的工作。

+0

很漂亮。它甚至适用于0x0图像。 – Novel

相关问题