1

クラスの使用を避けていた最初の tkinter アプリケーションのコードを書き直しています。それは行き止まりで、最終的に Python でのクラス プログラミングを学ばなければなりません。非常に奇妙なエラーが発生しましたが、修正方法がわかりません。試してみましたが、効果がありません。私がやろうとしているのは、アプリで 2 つのラベルのフォントを指定することです。以前のクラスフリーのコードではうまくいきましたが、今ではエラーが発生します:

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

それはおそらくばかげたことですが、何がこの問題を引き起こしているのか理解できません。以前は正常に動作していました...

ありがとう!

4

2 に答える 2

1

おそらく、コード「NoDefaultRoot()」とエラーメッセージ「オブジェクトに属性 '_default_root' がありません」が関係しているのではないでしょうか? 相関関係に気づきましたか?デバッグの第 1 のルールは、エラー メッセージが有益なことを伝えていると想定することです。

問題は、オブジェクトが属するウィンドウを指定せずにフォント オブジェクトを作成していることです。言わないので、デフォルトのルートウィンドウを使用することを選択します。ただし、デフォルトのルート ウィンドウを明示的に要求していません。

これは、Tkinter プログラムを構造化するやや奇妙な方法です。質問の回答を読むことをお勧めしますPython Tkinter Program Structure

于 2013-07-13T21:34:46.847 に答える
0

よく、私はそれを見つけることができました。親切な人がこの質問に賛成票を投じたので、解決策を投稿しますNoDefaultRoot()。行を削除しました。なぜ機能しなかったのか、なぜ機能するのかはわかりませんが、機能します...誰かがコメントで何が起こったのか説明できますか? 私はこのことに本当に慣れておらず、削除した行にはテンプレートが付属していました。

ネタバレしたらごめんなさい。

于 2013-07-13T17:30:58.667 に答える