Вопрос:

Как добавить цвета в мой код Python

python tkinter

98 просмотра

1 ответ

6 Репутация автора

Просто хочу знать, как я могу добавить цвета к своим выводам. Код ниже: Использование Python Tkinter GUI.

    if bmi < 18.5:
        self.answer_label['text'] = "A person with a BMI of " + str(bmi) + " is underweight " 
    elif 18.5 <= bmi < 25:
        self.answer_label['text'] = "A person with a BMI of " + str(bmi) + " has a healthy weight"
    elif 25 <= bmi < 30:
        self.answer_label['text'] = "A person with a BMI of " + str(bmi) + " is overweight"
    elif bmi >= 30:
        self.answer_label['text'] = "A person with a BMI of " + str(bmi) + " is obese"
Автор: thomas.brick101 Источник Размещён: 09.03.2017 11:07

Ответы (1)


1 плюс

60877 Репутация автора

Итак, основная проблема заключается в том, что в tkinter виджет Label принимает один цвет.

Вы можете составить текст с различными надписями рядом друг с другом, если вы добавите каждый из них .pack(side="left")- и назначите цвет каждому виджету.

Это не слишком практично.

Другой тип раскрашивания текста использует tkinter.Textвместо этого виджет. Проблема заключается в том, что на противоположной стороне Label, то Textвиджет является слишком широким и позволяет много вариантов для форматирования текста внутри него. С парой сотен строк программа, использующая виджет «Текст» в качестве основного компонента, может стать текстовым редактором для расширенного текста, как Microsoft Word.

Недостатком является то, что документацию трудно найти, с несколькими примерами, и она неполна. (Это моя основная мотивация в получении такого ответа - еще один пример из «реального мира» не будет плохим).

Наиболее полная (но все еще не хватает) документация для виджета «Текст» находится здесь: http://effbot.org/tkinterbook/text.htm

Прочитав его, вы обнаружите, что для того, чтобы иметь возможность вводить цветной текст в виджет «Текст», вы должны предварительно сконфигурировать «теги» с атрибутом text, а затем использовать insertсвой текст, используя индекс в качестве позиции, и отмечая, какие теги ты используешь.

Я сделал подкласс Textвиджета, который жестко кодирует некоторые элементы стиля (и конфигурацию «состояния»), чтобы он вел себя больше как Label, - и добавил два новых метода: appendкоторый позволяет добавлять текст в конец элемента, указывая цвет и цвет фона, и clear, чтобы очистить все его содержимое и начать все сначала.

Идея заключается в том, что вместо виджетов «Метка» вы используете приведенный ниже класс «ColoredLabel». Поскольку он унаследован от виджета tkinter, такие методы, как «configure», «pack», «grid», будут работать нормально, а затем использовать его метод «append» для создания его содержимого:

# boilerplate to assert working under Python 2.7 as well as Python 3:
try:
    import tkinter
except ImportError:
    import Tkinter as tkinter

class ColoredLabel(tkinter.Text):
    def __init__(self, parent, text="", **kw):
        params = {"relief": "flat", "border": 0, "height": 1, "highlightthickness": 0}
        kw.update(params)
        super(ColoredLabel, self).__init__(parent, **kw)
        self.tags = set()
        self.length = 0
        self.append(text)

    def clear(self):
        self["state"] = "normal"
        self.length = 0
        self.delete("1.0", tkinter.END)
        self["state"] = "disabled"

    def append(self, text, color=None, background=None):
        """Inserts text at the end of the existing text.
        Colors passed in the parameter are used for inserted text
        """
        self.length += len(text)
        tagname = "{}_{}".format(color, background)
        if tagname not in self.tags:
            params = {}
            if color: 
                params["foreground"] = color
            if background:
                params["background"] = background
            self.tags.add(tagname)
            self.tag_config(tagname, **params)
        self["state"] = "normal"
        self["width"] = self.length
        self.insert(tkinter.END, text, (tagname,))
        self["state"] = "disabled"

И если ваш атрибут "answer_label" определен как "ColoredLabel", вы просто пишете свой код как:

self.answer_label.clear()
self.answer_label.append("A person with a BMI of ")
if bmi < 18.5:
    self.answer_label.append(str(bmi), "yellow")
    self.answer_label.append(" is underweight ")
elif 18.5 <= bmi < 25:
    self.answer_label.append(str(bmi), "green")
    self.answer_label.append(" has a healthy weight")
elif bmi >= 30:
   self.answer_label.append(str(bmi), "red")
   self.answer_label.append(" is obese")

(Конечно, если вы хотите, чтобы весь ярлык был одного цвета, Labelесть поддержка - просто сделайте self.answer_label['foreground'] = 'red'для исходного текста)

Автор: jsbueno Размещён: 10.03.2017 01:16
Вопросы из категории :
32x32