2014-09-04 70 views
4

在函數內部和腳本的主體中定義一個字體似乎行爲不同,我似乎無法弄清楚它應該如何工作。爲什麼我不能在函數中定義(並保存)Tkinter字體?

例如,在這個例子中,Label最終以較大字體是,正如預期:

from Tkinter import * 
from ttk import * 

import tkFont 

root = Tk() 

default = tkFont.Font(root=root, name="TkTextFont", exists=True) 
large = default.copy() 
large.config(size=36) 

style = Style(root) 
style.configure("Large.TLabel", font=large) 

root.title("Font Test") 

main_frame = Frame(root) 
Label(main_frame, text="Large Font", style="Large.TLabel").pack() 

main_frame.pack() 
root.mainloop() 

Screenshot of working version

但是,如果我試圖定義一個函數裏面的風格,它看起來像字體被刪除或垃圾收集是不可用的小部件需要使用它的時候:

from Tkinter import * 
from ttk import * 

import tkFont 

def define_styles(root): 
    default = tkFont.Font(root=root, name="TkTextFont", exists=True) 

    large = default.copy() 
    large.config(size=36) 

    style = Style(root) 
    style.configure("Large.TLabel", font=large) 


root = Tk() 

root.title("Font Test") 

define_styles(root) 

main_frame = Frame(root) 
Label(main_frame, text="Large Font", style="Large.TLabel").grid(row=0, column=0) 

main_frame.pack() 
root.mainloop() 

Screenshot of non-working version

在第一個版本打印輸出tkFont.names()只是main_frame.pack()列出了自定義字體爲font<id>過,但打印相同的第二個版本沒有列出define_styles功能外的自定義字體。我需要做一些特別的事情來拯救他們嗎?

爲什麼我不能將該代碼放入函數中?我從根本上誤解了一些關於字體應該如何使用的問題? tkFont似乎有某種字體註冊表,爲什麼不是我的粘附?

回答

6

我沒有證據支持這一點,但我相信你的large字體對象被Python垃圾回收一旦define_styles結束。這是因爲沒有純粹的Python對象有任何引用,即使底層的Tcl實現仍在使用它。這也是一個困擾Tkinter的PhotoImage類的問題。

解決方法是通過對該對象進行長時間的引用來使對象保持活動狀態。例如,將其分配給root對象上的任何舊屬性。

def define_styles(root): 
    default = tkFont.Font(root=root, name="TkTextFont", exists=True) 

    large = default.copy() 
    large.config(size=36) 

    style = Style(root) 
    style.configure("Large.TLabel", font=large) 
    root.myfont = large 

結果:

enter image description here

+0

它是有意義的,並且不固定的例子中(和較大的程序,促使在首位這個問題),如果一個比特不令人滿意。這是一個錯誤嗎?它可能缺少文檔,但是我可以從現在到永久填寫丟失的tkinter文檔錯誤。 – Collin 2014-09-04 17:50:13

+2

我認爲它處於「錯誤」和「複雜系統的驚人相互作用」之間的灰色地帶。如果不需要這種手動引用保留,我會喜歡它,但是我知道開發人員有這樣一個很好的理由。 – Kevin 2014-09-04 18:04:12

相關問題