tkinter.colorchooser, Farben und Variablen setzen

Fragen zu Tkinter.
Antworten
AntagonisT
User
Beiträge: 42
Registriert: Samstag 11. Juli 2009, 16:36

Hallo,

folgendes Snippet (Python 3.1):

Code: Alles auswählen

import tkinter
import tkinter.colorchooser

class MyApp:
    def __init__(self, root):
        ###Hauptfenster f0------------------------------------------------------
        self.f0 = tkinter.Frame(root)
        self.f0.pack(padx=5, pady=5, anchor="nw")
        self.lf0 = tkinter.LabelFrame(self.f0, text="Farben")
        self.lf0.pack(padx=2, pady=2, expand="1", fill="both")

        ###Startwerte-----------------------------------------------------------
        self.mycolor0 = "#cafa0b"
        self.mycolor1 = "#0bcb0b"
        self.mycolor2 = "#0c0ccc"

        ###3 Farbauswahlfelder--------------------------------------------------
        self.ca0 = tkinter.Canvas(self.lf0, width=13, height=13)
        self.ca0 ["background"] = self.mycolor0
        self.ca0.bind("<Button-1>", self.choosecolor)
        self.ca0.grid(row=3, column=0)

        self.ca1 = tkinter.Canvas(self.lf0, width=13, height=13)
        self.ca1 ["background"] = self.mycolor1
        self.ca1.bind("<Button-1>", self.choosecolor)
        self.ca1.grid(row=4, column=0)

        self.ca2 = tkinter.Canvas(self.lf0, width=13, height=13)
        self.ca2 ["background"] = self.mycolor2
        self.ca2.bind("<Button-1>", self.choosecolor)
        self.ca2.grid(row=5, column=0)


    def choosecolor(self, event):
        (triple, hexstr) = tkinter.colorchooser.askcolor(color="#cafa0b")
        if hexstr:
            event.widget.config(background=hexstr)

root = tkinter.Tk()
myapp = MyApp(root)
root.mainloop()
Ich habe verschiedene Canvaswidgets die als Farbauswahlfelder dienen sollen. Mit Klick in das Canvas geht das Farbauswahlfeld auf und man kann eine Farbe wählen. Dazu 2 Fragen:

1. Bevor ich die Farben zum ersten mal gewählt habe, sollen default-Farbwerte genommen werden (hier self.mycolor0, 1, 2). Verändere ich dann später eine Farbe, soll sich aber nicht nur das Canvas ändern (das geht schon), sondern natürlich auch die Instanzvariable, die den zugehörigen Startwert festgelegt hat (bspw. "self.mycolor0")...
-> hier steh ich auf dem Schlauch, da ich ja meine choosecolor-Methode von verschiedenen Canvaswidgets aufrufen kann, kann ich innerhalb der Methode nicht einfach bspw. "self.mycolor0 = hexstr" sagen.
Ich habe schon herausgefunden, daß dem event über "event.widget.config(background=..." Informationen über das widget mitgegeben werden. Aber wie kann ich noch die Variable, die auf "background" verweist, mitändern?

2. mit der Option "color" in "tkinter.colorchooser.askcolor(color="#cafa0b")" kann ich ja eine Vorgabe machen. Wie kriege ich hin, das hierzu die voreingestellte Farbe aus dem jeweiligen Canvas genommen wird?

----
Ich denke, 1. und 2. gehören irgendwie zusammen, in beiden Fragen geht es darum, wie ich Parameter in die Methode und wieder aus der Methode heraus bekomme. Und ich befürchte, daß da ein grundlegendes Klassen/OOP-Verständnisproblem meinerseits verantwortlich ist. :wink:
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Die Loesung liegt eher im funktionalen Bereich als bei OO. Mit der lambda-Funktion oder 'functools.partial' kann man ja weitere Argumente an die Callback-Funktion uebergeben. Habe Deinen Code mal etwas umgemodelt:

Code: Alles auswählen

import tkinter as tk
import tkinter.colorchooser as chooser

####

class Gui(object):

  
  def __init__(self, root, colors):

    self.frame = tk.Frame(root)
    self.frame.pack(padx=5, pady=5, anchor='nw', expand=True, fill='both')
    
    self.labelframe = tk.LabelFrame(self.frame, text='Farben')
    self.labelframe.pack(padx=2, pady=2, expand=True, fill='both')

    self.colors = list(colors)   
    self.canvases = [tk.Canvas(self.labelframe, width=22, height=22,
                               highlightthickness=0,
                               background=col) for col in self.colors]

    for i, c in enumerate(self.canvases):
      c.bind("<Button-1>", lambda ev, i=i: self.choosecolor(i)) 
      c.pack(padx=2, pady=4, anchor=tk.NW)


  def choosecolor(self, i):
    triple, hexstr = chooser.askcolor(color=self.colors[i])
    print(triple, hexstr)
    if hexstr:
      self.canvases[i].config(background=hexstr)
      self.colors[i] = hexstr
      print(hexstr)
      
####
      
if __name__ == '__main__':

  COLORS = '#cafa0b', '#0bcb0b', '#0c0ccc'
  
  root = tk.Tk()
  Gui(root, COLORS)
  root.mainloop()
:wink:
yipyip
AntagonisT
User
Beiträge: 42
Registriert: Samstag 11. Juli 2009, 16:36

hui, das muss ich mir gleich mal anschauen, danke! :o

werden sicher noch Fragen kommen...
Antworten