2014-10-03 4 views
3

Я просто пытаюсь добавить цвета фона в качестве цветов градиента! Это может показаться моим Tkinter-GUI более привлекательным, чем обычные цветовые коды. Есть ли способ достичь этого в python, может ли кто-нибудь помочь мнеМожно ли применять градиентные цвета к BG-виджетам Tkinter python

Может ли он включить что-то вроде этого?

bg="40%,#207cca 40%,#2989d8 50%" 


def createwidgets(self): 

     master_f = Tkinter.Frame (objMG.root, relief='sunken', bd=2,height =10,bg='#54596d') 
     master_f.pack (side='top', fill='both', expand=1) 

     self.Up_frame = Tkinter.Frame(master_f,relief='sunken',height=50,bg="#C0C0C0") 
     self.Up_frame.pack(side='top',fill='x',expand='no') 


     #self.Up_frame = Tkinter.Frame(master_f,relief='sunken',height=50,bg="40%,#207cca 40%,#2989d8 50%") 
     #self.Up_frame.pack(side='top',fill='x',expand='no') 

ответ

5

Вы не можете дать произвольные виджетам градиент фона, но вы можете сделать градиент на холсте и использовать холст вместо фрейма в качестве контейнера. Вот пример:

import Tkinter as tk 

class Example(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     f = GradientFrame(root) 
     f.pack(fill="both", expand=True) 

class GradientFrame(tk.Canvas): 
    '''A gradient frame which uses a canvas to draw the background''' 
    def __init__(self, parent, borderwidth=1, relief="sunken"): 
     tk.Canvas.__init__(self, parent, borderwidth=borderwidth, relief=relief) 
     self._color1 = "red" 
     self._color2 = "black" 
     self.bind("<Configure>", self._draw_gradient) 

    def _draw_gradient(self, event=None): 
     '''Draw the gradient''' 
     self.delete("gradient") 
     width = self.winfo_width() 
     height = self.winfo_height() 
     limit = width 
     (r1,g1,b1) = self.winfo_rgb(self._color1) 
     (r2,g2,b2) = self.winfo_rgb(self._color2) 
     r_ratio = float(r2-r1)/limit 
     g_ratio = float(g2-g1)/limit 
     b_ratio = float(b2-b1)/limit 

     for i in range(limit): 
      nr = int(r1 + (r_ratio * i)) 
      ng = int(g1 + (g_ratio * i)) 
      nb = int(b1 + (b_ratio * i)) 
      color = "#%4.4x%4.4x%4.4x" % (nr,ng,nb) 
      self.create_line(i,0,i,height, tags=("gradient",), fill=color) 
     self.lower("gradient") 

if __name__ == "__main__": 
    root = tk.Tk() 
    Example(root).pack(fill="both", expand=True) 
    root.mainloop() 
+0

Этот код кажется сломанным с помощью python 2.7.12 и 3.6.0 на моем Mac. – kakyo

+0

@kakyo: «кажется сломанным» немного расплывчато. –

+0

@BryanOakley Используя этот метод, я не могу отобразить текст метки в фрейме 'Example', я вижу только градиент. У вас есть какие-то указатели? Является ли надпись «под» градиентом? Использование стандартного 'Frame' отображает текст просто отлично. – Plasma