Tkinter: обновление метки новым фоновым цветом (Python 3.5.3) - PullRequest
0 голосов
/ 02 июля 2018

Я разрабатываю простой таймер с использованием Tkinter, который меняет цвет после истечения определенного времени. У меня есть базовая программа таймера, которая работает хорошо, но теперь я хочу изменить ее, чтобы фон изменил цвет.

У меня есть операторы if, которые запускаются через соответствующие интервалы, а затем изменяют атрибут класса, назначенный цвету фона, но я не могу получить цвет метки для обновления.

Я понимаю, что функция "makeWidgets" запускается только один раз и считаю, что это, вероятно, источник моей проблемы. Я экспериментировал, разбивая эту функцию на основную программу с переменным успехом. Я могу заставить работать таймер, но все еще не могу изменить цвет. Я также попытался написать функцию (и) изменения цвета, но безуспешно. У меня нет опыта работы с python, tkinter и full-disclosure, я не разработал основную часть базовой программы таймера.

Я был бы очень признателен за любые указания / советы о том, как заставить это работать. Я чувствую, что я или близко, или нуждаюсь в полной переделке. Надеюсь, что первый случай.

from tkinter import *
import time

class StopWatch(Frame):
    global mincount
    """ Implements a stop watch frame widget. """                                                                
    def __init__(self, parent=None, **kw):
    Frame.__init__(self, parent, kw)
    self.start = 0.0        
    self.elapsedtime = 0.0
    self.running = 0
    self.timestr = StringVar()               
    self.makeWidgets()
    self.color = 'green'

def makeWidgets(self):      #this function only run once at setup                   
    """ Make the time label. """
    self.color='green' #this works
    l = Label(self, textvariable=self.timestr, bg=self.color, font=("Helvetica",300), width=12, height=2)
    self.setTime(self.elapsedtime)
    l.pack(fill=X, expand=YES, pady=2, padx=2)


def update(self): 
    """ Update the label with elapsed time. """
    self.elapsedtime = time.time() - self.start
    self.setTime(self.elapsedtime)
    self.timer = self.after(50, self.update)

def setTime(self, elap,):
    global mincount
    """ Set the time string to Minutes:Seconds:Hundreths """
    minutes = int(elap/60)
    seconds = int(elap - minutes*60.0)
    hseconds = int((elap - minutes*60.0 - seconds)*100)                
    self.timestr.set('%02d:%02d:%02d' % (minutes, seconds, hseconds))
    mincount = int(elap)
    if mincount>=3:
        print("yellow")
        self.color='yellow' #has no effect
        l.config(bg='yellow') #not in scope
        #CHANGE COLOR TO YELLOW - call fx?
        if mincount>=5:
            print("red")
            #CHANGE COLOR TO RED

def Start(self):                                                     
    """ Start the stopwatch, ignore if running. """
    if not self.running:            
        self.start = time.time() - self.elapsedtime
        self.update()
        self.running = 1

def Stop(self):                                    
    """ Stop the stopwatch, ignore if stopped. """
    if self.running:
        self.after_cancel(self.timer)            
        self.elapsedtime = time.time() - self.start    
        self.setTime(self.elapsedtime)
        self.running = 0

def Reset(self):
    """ Reset the stopwatch. """
    self.start = time.time()         
    self.elapsedtime = 0.0    
    self.setTime(self.elapsedtime)
    self.color='green'     

def main():
root = Tk()
sw = StopWatch(root)
sw.pack(side=TOP)

Button(root, text='Start', command=sw.Start).pack(side=BOTTOM, fill=BOTH)
Button(root, text='Stop', command=sw.Stop).pack(side=BOTTOM, fill=BOTH)
Button(root, text='Reset', command=sw.Reset).pack(side=BOTTOM, fill=BOTH)
Button(root, text='Quit', command=root.quit).pack(side=BOTTOM, fill=BOTH)
current=sw.timestr

root.mainloop()

if __name__ == '__main__':
main()

1 Ответ

0 голосов
/ 02 июля 2018

Вы не можете использовать l в своей функции setTime: l является локальной переменной в makeWidgets его нельзя использовать в setTime. Чтобы исправить это, вы должны сделать l переменной частью класса в makeWidgets: self.label = ... для примера. И после этого используйте вашу новую переменную self.label в setTime: self.label.config("bg"="yellow")

Что-то может быть улучшено в вашем операторе if if mincount>=3:, потому что если это правда, вы изменяете bg и после этого проверяете if mincount>=5. Вы должны сделать это:

if mincount>=5:
    ...
elif mincount >=3:
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...