2013-06-23 4 views
1

У меня есть небольшая программа Python, которая принимает значение шкалы Tkinter и помещает ее в метку.Попытка получить значение из шкалы Tkinter и поместить его в метку

#!/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 сопряжение. Мне бы очень хотелось, чтобы кто-то мог объяснить, что я делаю неправильно.

ответ

5

Это происходит потому, что вы создаете StringVar перед созданием корневого элемента Tk. Если вы переместите оператор root = Tk() перед определением класса, вы увидите, как он работает должным образом.

Однако, идеальным решением было бы написать его таким образом, что вы не зависят от того, чтобы сделать его работу, поэтому я предлагаю вам создать STRINGVAR в конструкторе:

class App: 
    def __init__(self,master): 
     frame = Frame(master) 
     frame.pack() 
     self.strval = StringVar(frame) 
     # ... 
+0

+1 Ударьте меня ему – Jared

+0

@ A.Rodas Спасибо! – Awalrod