Напишите переменную класса в метке в главном

1

Я хочу написать переменную класса в ярлыке, который я создал в моей основной, но я не могу получить обновленное значение. Может, кто-то может мне помочь, потому что у меня кончились идеи.

from Tkinter import *

class CounterAway(Frame):
    def __init__(self, parent=None, **kw):        
        Frame.__init__(self, parent, kw)
        self.countera = 0
        self.ca = 0
        self._update_counter()

def _update_counter(self):
    self.ca = self.countera       

def count_up(self):
    self.countera += 1
    if self.countera > 99 : self.countera = 0
    self._update_counter()

def count_down(self):
    self.countera -= 1
    if self.countera < 0 : self.countera = 0
    self._update_counter()

def main():
    root = Tk()
    w, h = root.winfo_screenwidth(), root.winfo_screenheight()  
    """root.geometry("%dx%d+0+0" % (w, h))"""
    root.geometry('1000x1000')  
    counteraway = CounterAway(root)



Button(root, font=('Arial',30), width=10, text='Away +', command=counteraway.count_up).place(x=450, y=300)   
Button(root, font=('Arial',30), width=10, text='Away -', command=counteraway.count_down).place(x=450, y=370)
Button(root, width=10, font=('Arial',30), text='Quit', command=root.destroy).place(x=10, y=10)
counteraway.label = Label(root, font="Arial 100 bold", fg="RED", text=str(counteraway.ca)).pack()

print(counteraway.ca)

root.mainloop()

if __name__ == '__main__':
    main()

Большое спасибо заранее за любую помощь.

br KlaRo

  • 0
    Я не очень разбираюсь в Tkinter , так что это всего лишь предположение: когда вы запускаете этот код, сначала выполняется все, что находится за пределами блока, а затем код внутри этого if . Так может couteraway переменная couteraway внутри main быть перезаписана и потерять предыдущий атрибут label ?
Теги:
class
tkinter
global

2 ответа

0
Лучший ответ

Вы определяете root внутри main(), а затем пытаетесь использовать его вне этой функции, что будет означать, что код генерирует исключение. Также кажется, что отступ для определенного класса неверен, если вы измените код на следующий, который он должен выполнить:

from Tkinter import *

class CounterAway(Frame):
    def __init__(self, parent=None, **kw):        
        Frame.__init__(self, parent, kw)
        self.countera = 0
        self.ca = 0
        self._update_counter()

    def _update_counter(self):
        self.ca = self.countera       

    def count_up(self):
        self.countera += 1
        if self.countera > 99 : self.countera = 0
        self._update_counter()

    def count_down(self):
        self.countera -= 1
        if self.countera < 0 : self.countera = 0
        self._update_counter()


def main():
    root = Tk()
    w, h = root.winfo_screenwidth(), root.winfo_screenheight()  
    """root.geometry("%dx%d+0+0" % (w, h))"""
    root.geometry('1000x1000')  
    counteraway = CounterAway(root)

    Button(root, font=('Arial',30), width=10, text='Away +', command=counteraway.count_up).place(x=450, y=300)   
    Button(root, font=('Arial',30), width=10, text='Away -', command=counteraway.count_down).place(x=450, y=370)
    Button(root, width=10, font=('Arial',30), text='Quit', command=root.destroy).place(x=10, y=10)
    counteraway.label = Label(root, font="Arial 100 bold", fg="RED", text=str(counteraway.ca)).pack()

    print(counteraway.ca)

    root.mainloop()


if __name__ == '__main__':
    main()

Если вы хотите обновить текст на ярлыке, вы должны изучить Tkinter Variables, например Tkinter StringVar. Код будет выглядеть примерно так:

from Tkinter import *

class CounterAway(Frame):
    def __init__(self, parent=None, **kw):        
        Frame.__init__(self, parent, kw)
        self.countera = 0
        self.ca = StringVar()
        self._update_counter()

    def _update_counter(self):
        self.ca.set(str(self.countera))       

    def count_up(self):
        self.countera += 1
        if self.countera > 99 : self.countera = 0
        self._update_counter()

    def count_down(self):
        self.countera -= 1
        if self.countera < 0 : self.countera = 0
        self._update_counter()

def main():
    root = Tk()
    w, h = root.winfo_screenwidth(), root.winfo_screenheight()  
    """root.geometry("%dx%d+0+0" % (w, h))"""
    root.geometry('1000x1000')  
    counteraway = CounterAway(root)

    Button(root, font=('Arial',30), width=10, text='Away +', command=counteraway.count_up).place(x=450, y=300)   
    Button(root, font=('Arial',30), width=10, text='Away -', command=counteraway.count_down).place(x=450, y=370)
    Button(root, width=10, font=('Arial',30), text='Quit', command=root.destroy).place(x=10, y=10)
    counteraway_label = Label(root, font="Arial 100 bold", fg="RED", textvariable=counteraway.ca).pack()

    print(counteraway.ca)

    root.mainloop()


if __name__ == '__main__':
    main()
0

Теперь я могу видеть обновленную метку, рассчитывая :-)

Но если я хочу прочитать текущее значение переменной метки, чтобы отправить ее на 8x7-сегментный дисплей, я получаю только 0, а не текущее значение.

print counteraway.ca.get()

Я думал, что это работает с.get(), но кажется, что я ошибаюсь

Я только получаю: ================= RESTART: /home/pi/Anzeige/ClassVar_Test.py ================== 0 в моей оболочке Python

Ещё вопросы

Сообщество Overcoder
Наверх
Меню