在tkinter中设置字体会返回错误

时间:2013-07-13 16:31:21

标签: python tkinter tk

我正在为我的第一个tkinter应用程序重写代码,我避免使用类。那是一个死胡同,我必须最终在python中学习类编程。我遇到了一个非常奇怪的错误,我不知道如何解决它。我试过了,但没有效果。我要做的是在我的应用程序中指定两个标签的字体。它在我以前的无类代码中运行良好,但现在它给了我一个错误:

(...) line 56, in create_widgets
TimeFont = font.Font(family='Palatino', size=88, weight='bold')
File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/tkinter/font.py", line 71, in __init__
root = tkinter._default_root
AttributeError: 'module' object has no attribute '_default_root'

这是我用来创建小部件的功能:

def create_widgets(self):
    self.set_timer = ttk.Entry(self, textvariable=self.timer)
    self.start = ttk.Button(self, text='Start', command=self.start)
    TimeFont = font.Font(family='Palatino', size=88, weight='bold') #the infamous line 56
    self.display1 = ttk.Label(self, textvariable=self.player1, font=TimeFont)
    self.display2 = ttk.Label(self, textvariable=self.player2, font=TimeFont)

还有一些“来自上方”的代码,如果相关的话:

from decimal import *
from tkinter import *
from tkinter import ttk
from tkinter import font
import time, _thread, subprocess

class Chclock(ttk.Frame):

    @classmethod
    def main(cls):
        NoDefaultRoot()
        root = Tk()
        app = cls(root)
        app.grid(sticky=NSEW)
        root.grid_columnconfigure(0, weight=1)
        root.grid_rowconfigure(0, weight=1)
        root.resizable(True, False)
        root.mainloop()

    def __init__(self, root):
        super().__init__(root)
        root.bind('q', self.player1move)
        root.bind('p', self.player2move)
        root.bind('b', self.pause)
        root.bind('a', self.undo)
        root.bind('l', self.undo)
        self.create_variables()
        self.create_widgets() #here I call the function containing the error
        self.grid_widgets()
        self.grid_columnconfigure(0, weight=1)

这可能是愚蠢的,但我不能理解导致这个问题的原因。过去工作得很好......

谢谢!

2 个答案:

答案 0 :(得分:1)

也许代码“NoDefaultRoot()”和错误消息“对象没有属性'_default_root'”可能与彼此有关?注意相关性?调试的第一个规则是假设错误消息告诉你一些有用的东西。

问题在于您正在创建一个字体对象,而不告诉该对象它属于哪个窗口。由于您没有告诉它,它选择使用默认的根窗口。但是,您明确要求没有默认的根窗口。

这是构建Tkinter程序的一种有点奇怪的方法。我建议您阅读问题Python Tkinter Program Structure

中的答案

答案 1 :(得分:0)

我已经设法找到了它。由于某些人提出了这个问题,我将发布解决方案:我已删除NoDefaultRoot()行。我不确定为什么它不起作用,为什么它现在有效,但它确实......有人可以解释评论中发生的事情吗?我对这些内容真的很陌生,我删除的内容附带了一个模板。

很抱歉,如果我弄得一团糟。