0

私は25個のボタンを持つプログラムを作成しようとしています.1つが押されると、テキストファイルから読み取られ、変数に保存され、ページの下部にあるラベルのテキストが次のテキストに変更されますテキストファイル。これまでの私のコードは次のとおりです。

from Tkinter import*
box1 = 'C:/Users/Geekman2/Documents/Tests/box1.txt'
var = StringVar()
var.set("man")
def openfile(filename):
    filetxt = (open(filename,"r").read())
   #filetxt.set(iletxt)
    print filetxt
    return filetxt

def Box1():
    openfile(box1)


openfile(box1)
donut = Tk()
donut.geometry('450x450')

cupcake = Button(donut,text = "Box #1", command= Box1 )
cupcake.pack()

Whatsin = Label(donut,textvariable = var)
Whatsin.pack(side =BOTTOM)

donut.mainloop()

これらの 2 行は問題を引き起こしています。コメントを外してプログラムを実行しようとすると、「AttributeError: 'NoneType' object has no attribute 'tk'」というエラーが表示されます。

var = Stringvar()
var.set("man")

これの原因は何ですか?エラーの意味はわかりますが、私が知る限り、この状況には当てはまりません

4

2 に答える 2

3

Tkを使用する前に、 のインスタンスをインスタンス化する必要がありますStringVar。行の前に移動donut = Tk()すると、機能するはずです。

于 2012-10-18T00:49:53.863 に答える
0

StringVar (および他の Tkinter 変数) は、Tcl 変数1のラッパーです。エラーは、Tcl インタープリターが初期化される前に StringVar を作成したことが原因です。

したがってTk()、変数を作成する前に (そのような初期化を実行する) を呼び出すことができます。

StringVar コンストラクターのシグネチャ__init__(self, master=None, value=None, name=None)を見ると、他の Tkinter オブジェクトと同様に、コンストラクターmasterが最初の引数として a を受け入れることがわかります。このマスターは、Tcl インタープリターにアクセスするために基本的に必要です。Tkinter.Tk提供されていない場合は、グローバルインスタンスへのフォールバックがあり_default_rootますNone。その上で Tcl インタープリター ( という名前のフィールドtk) に尋ねると、AttributeError.

ウィジェットの場合、マスター リードを提供しないとデフォルトのウィジェットが作成されますが、変数は作成されないことに注意してください。

1 Tkinter ツールキット全体は、Tk と呼ばれる Tcl ツールキットのラッパーです。Tcl 変数をトレースできます。つまり、変数の変更時にコールバックをバインドします。Tk はこのメカニズムを頻繁に使用するため、Tkinter は Tcl 変数へのアクセスを提供する必要があります。

于 2012-10-18T10:04:29.867 に答える