2012-05-16 73 views
0

在Tkinter中,標籤背景的兩種顏色之間可以實現淡入淡出效果? 我希望我的計時器的標籤顏色隨着計數器的變化而改變。這些是我目前正在使用的片段,(爲了澄清我在做什麼)。在tkinter中隨着時間的推移,標籤顏色之間的淡入淡出?

… 

labelcolor = "#%02x%02x%02x" % (0, 0, 0) 

… 

def pomodoro(self, remaining = None): 
    self.button.configure(state=tk.DISABLED) 
    self.labelcolor = "#%02x%02x%02x" % (200, 32, 32) 
    self.label.configure(bg = self.labelcolor) 
    if remaining is not None: 
     self.remaining = remaining 

    if self.remaining <= 0: 
     self.label.configure(text="Time's up!") 
     self.breakcommand 
    else: 
     self.label.configure(text= time.strftime('%M:%S', time.gmtime(self.remaining))) #Integer to 'Minutes' and 'Seconds' 
     self.remaining = self.remaining - 1 
     self.after(1000, self.pomodoro) 

… 

self.label = tk.Label(self, text="Pick One", width=12, font="Helvetica 32", fg = "white", bg = self.labelcolor) 

… 
+0

你對這個問題有什麼不瞭解?你不知道如何改變標籤的背景顏色,或者你不知道如何創建一系列的顏色,或者是否有其他你不明白的東西? –

+0

@Bryan我不明白如何從數學的角度來淡化自己,並從那裏創建一個基於定時器的任何兩種顏色之間淡入淡出的可用函數。對不起,我的問題不清楚。 –

回答

3

這裏有一個代碼,我一起創建一個漸變色條。我不知道這是否是對你有用,但是......它的工作原理...

import Tkinter as tk 

def cinterp(x1,x2,x,c1,c2): 
    """ 
    interpolate two colors. c1 and c2 are 3-tuples of rgb values -- 
    e.g. (0,0,255) 

    x1,x2 and x are used to determine the interpolation constants. 
    """ 
    s1=float(x-x1)/(x2-x1) 
    s2=1.-s1 
    return [int(s1*i+s2*j) for i,j in zip(c1,c2)] 

root=tk.Tk() 
cvs=tk.Canvas(root,width=100,height=50) 
cvs.grid(row=0,column=0) 
width=int(cvs['width']) 
height=int(cvs['height']) 
for i in range(width): 
    fill=cinterp(0,width,i,(255,0,0),(255,255,255)) 
    fs="#%02x%02x%02x"%(fill[0],fill[1],fill[2]) 
    cvs.create_rectangle(i,1,i+1,height,fill=fs,width=0) 

root.mainloop() 

當然,你可能要保持手柄上的矩形,所以你以後可以改變顏色,你也可以更有效地做到這一點,但這可能是一個很好的起點。

編輯

import Tkinter as tk 

def cinterp(x1,x2,x,c1,c2): 
    s1=float(x-x1)/(x2-x1) 
    s2=1.-s1 
    return [int(s1*i+s2*j) for i,j in zip(c1,c2)] 

root=tk.Tk() 
cvs=tk.Label(root,text="Hello") 
c2=(255,0,0) 
c1=(255,255,255) 
def updateCVS(dt,timeleft,deltat): 
    timeleft=timeleft-dt 
    fill=cinterp(0,deltat,deltat-timeleft,c1,c2) 
    fs="#%02x%02x%02x"%(fill[0],fill[1],fill[2]) 
    cvs.configure(bg=fs) 
    if(timeleft>0): 
     timeleft=timeleft-dt 
     cvs.after(int(dt*1000),updateCVS,dt,timeleft,deltat) 

cvs.grid(row=0,column=0) 
b=tk.Button(root,text="push me",command=lambda : updateCVS(.2,5,5)) 
b.grid(row=1,column=0) 

root.mainloop() 

這將是一個很大清潔的一類,但希望你的想法。

+0

這是有用的其他原因,但不是我在找什麼。隨着計數器倒計時,我想隨時間改變畫布背景顏色。我重新提出了我的問題,希望能夠使我想要做的更清楚。 –

+1

@RyanHasse這也很簡單。只要使用函數cinterp,並調用它來更新你的標籤/畫布/無論在'after'調用中重新註冊。我現在沒有時間發佈真正的解決方案,但如果你還沒有弄明白,我可以在早上。 – mgilson

+0

@RyanHasse:我的編輯代碼是做你想做的嗎? – mgilson