Farbwähler bei tkinter ...

Fragen zu Tkinter.
Antworten
Benutzeravatar
Grexie
User
Beiträge: 11
Registriert: Samstag 26. Juni 2021, 09:30

Hi,

laut Fachbuch soll folgender Mini-Code einen Farbwähler, d.h. die Farbpalette von "tkinter" zeigen, funktioniert bei mir aber nicht. :roll: Es kommt dann die Fehlermeldung: "NameError: name 'colorchooser' is not defined". :cry: Habe die aktuelle Version 3.9 von Python.

Code: Alles auswählen

from tkinter import *
t = Tk()
colorchooser.askcolor()
Kann mir jemand sagen, was da falsch ist bzw. wie man den Farbwähler richtig codiert.

Gruß ... Grexie :D
moe
User
Beiträge: 12
Registriert: Montag 30. Juni 2008, 18:00

Hi,

ich würde das so codieren:

Code: Alles auswählen

from tkinter.colorchooser import askcolor
askcolor()
Benutzeravatar
Grexie
User
Beiträge: 11
Registriert: Samstag 26. Juni 2021, 09:30

Hi Moe, besten Dank für deinen Vorschlag. Ich hab's ausprobiert und es klappte. Der Farbwähler wird angezeigt.Jetzt würde mich noch interessieren, wie ich an die RGB-Werte komme. Das müssten ja drei Werte jeweils zwischen 0 und 255 sein - für rot, grün und blau. LG ... Grexie :D
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die Funktion hat einen Rückgabewert. Schau Dir den mal an.

Edit: Auch daran denken, dass der Benutzer per Schaltfläche abbrechen oder das Fenster schliessen kann.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
moe
User
Beiträge: 12
Registriert: Montag 30. Juni 2008, 18:00

Wie __blackjack__ schon erwähnt hat, hat die Funktion askcolor() einen Rückgabewert. Genauer gesagt gibt es ein Tupel zurück, welches die rgb-Werte und zusätzlich noch den hexadezimalen Wert der Farbe beinhaltet. Du musst nur den Rückgabewert in eine Variable speichern. Ungefähr so:

Code: Alles auswählen

from tkinter.colorchooser import *
color = askcolor()
print(color[0])
Mit print werden dann die rgb-Werte ausgegeben. Die Null in eckigen Klammern hinter der Variablen color sorgt dafür, dass nur die rgb-Werte angezeigt werden.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Warum ist denn aus dem ``askcolor`` jetzt ein ``*`` geworden?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
moe
User
Beiträge: 12
Registriert: Montag 30. Juni 2008, 18:00

Hoppla, hast recht hab mich verschrieben! :wink:
moe
User
Beiträge: 12
Registriert: Montag 30. Juni 2008, 18:00

Noch ein kleiner Nachtrag: Seltsamer Weise werden die rgb-Werte als Gleitkommazahlen mit Nachkommastellen ausgegeben. Ich habe mal kurz recherchiert. Dies ist ein Bug in Tkinter, welcher mit Python 3.10 behoben sein wird (https://bugs.python.org/issue33289). Ein kurzer Workaround könnte so aussehen:

Code: Alles auswählen

from tkinter.colorchooser import askcolor
color = askcolor()
rgb = [int(rgb_value) for rgb_value in color[0]]
print(rgb)
Damit wird eine Liste mit Ganzzahlen der rgb-Werte erstellt.
Benutzeravatar
Grexie
User
Beiträge: 11
Registriert: Samstag 26. Juni 2021, 09:30

moe hat geschrieben: Mittwoch 30. Juni 2021, 22:17 Noch ein kleiner Nachtrag: seltsamerweise werden die rgb-Werte als Gleitkommazahlen mit Nachkommastellen ausgegeben. Ich habe mal kurz recherchiert. Dies ist ein Bug in Tkinter, welcher mit Python 3.10 behoben sein wird (https://bugs.python.org/issue33289). Ein kurzer Workaround könnte so aussehen:

Code: Alles auswählen

from tkinter.colorchooser import askcolor
color = askcolor()
rgb = [int(rgb_value) for rgb_value in color[0]]
print(rgb)
Damit wird eine Liste mit Ganzzahlen der rgb-Werte erstellt.

Hi, ja - das funktioniert. Danke! Statt der For-Schleife in der rgb-Zuweisung könnte man es ja auch so machen:

Code: Alles auswählen

from tkinter.colorchooser import askcolor
color = askcolor()

#alle 4 gespeicherten RGB-Werte
print("Die gespeicherten RGB-Werte: ", color)

#die 3 gespeicherten RGB-Werte als "float"
rgb = color[0]
print("3 RGB-Werte: ", rgb)

#die RGB-Werte als Hexadezimalzahl
rgb_hex = color[1]
print("RGB als Hex: ", rgb_hex)

#die einzelnen RGB-Kanäle als "integer"
rgb1 = int(rgb[0])
print("1. RGB-Wert: ", rgb1)

rgb2 = int(rgb[1])
print("2. RGB-Wert: ", rgb2)

rgb3 = int(rgb[2])
print("3. RGB-Wert: ", rgb3)
moe
User
Beiträge: 12
Registriert: Montag 30. Juni 2008, 18:00

Hi Grexie,

ja kann man so machen. Mit deiner Lösung braucht man aber mehr Zeilen Code. Generell versucht man aber in der Programmierung den Code so kompakt wie möglich und verständlich zu halten.
Benutzeravatar
Grexie
User
Beiträge: 11
Registriert: Samstag 26. Juni 2021, 09:30

Hi Moe, das stimmt. Dein Code ist natürlich kompakter. Zum Verständnis der Zusammenhänge kann man den Code mal aufdröseln, danach kommt dann deine elegantere Lösung mit weniger Quelltext. Das ist bei Python schon erstaunlich, wie knapp der Code u.U.ausfallen kann. :)
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

nur mal noch so am rande: rgb = rot, grün, blau.
da brauchts kein 1,2,3 ;)
empty Sig
Antworten