2017-03-16 71 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

相關問題