1

Tkinter スケールの値を取得してラベルに入れる小さな Python プログラムがあります。

#!/usr/bin/python

from Tkinter import *

class App:

    strval = StringVar()
    def __init__(self,master):

        frame = Frame(master)
        frame.pack()
        self.slide = Scale(frame, command = self.up, from_ = 1, to = 100)
        self.out = Label(frame, textvariable = self.strval)
        self.slide.pack()
        self.out.pack()

    def up(self,newscale):
        amount = str(newscale)
        self.strval.set(amount)


root = Tk()
app =  App(root)
root.mainloop()

プログラムを実行すると、エラーメッセージが表示されます:

Traceback (most recent call last):
  File "/Users/alex/Desktop/Python/Tkinter/scale_Entry.py", line 5, in <module>
    class App:
  File "/Users/alex/Desktop/Python/Tkinter/scale_Entry.py", line 7, in App
    strval = StringVar()
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-tk/Tkinter.py", line 254, in __init__
    Variable.__init__(self, master, value, name)
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-tk/Tkinter.py", line 185, in __init__
    self._tk = master.tk
AttributeError: 'NoneType' object has no attribute 'tk'
Exception exceptions.AttributeError: "StringVar instance has no attribute '_tk'" in <bound method StringVar.__del__ of <Tkinter.StringVar instance at 0x69f238>> ignored
logout

何がうまくいかないのかわからないし、Tk のインターフェースがまったくダメだ。誰かが私が間違っていることを説明できれば幸いです。

4

1 に答える 1

5

これは、Tk ルート要素を作成する前に StringVar を作成しているためです。クラスの定義の前にステートメントを移動するroot = Tk()と、期待どおりに機能することがわかります。

ただし、理想的な解決策は、機能させる順序に依存しない方法で記述することです。そのため、コンストラクターで StringVar を作成することをお勧めします。

class App:
    def __init__(self,master):
        frame = Frame(master)
        frame.pack()
        self.strval = StringVar(frame)
        # ...
于 2013-06-23T02:08:25.067 に答える