Иногда вам нужно сменить цвет фона виджета панели или какого-то другого виджета интерфейса из набора инструментов wxPython. Это очень полезно для того, чтобы сделать сообщения об ошибках более заметными или чтобы отличать статусы в вашем приложении. Но вот процесс возвращения прежнего цвета уже не так очевиден. Когда я впервые хотел сбросить фоновый цвет панели, я думал, что вот этот код отлично для этого подойдёт:
1 2 |
color = wx.SystemSettings.GetColour(wx.SYS_COLOUR_BACKGROUND) panel.SetBackgroundColour(color) |
К сожалению, работает это не всегда. Вместо него, Робин Дан (создатель wxPython) посоветовал использовать wx.NullColor. Согласно словам мистера Дана, причина в том, что wx.NullColor сообщит wx, что у виджета не установлен определённый цвет и он будет использовать тот цвет, который ему предлагает платформа, а в определённой системной теме, в свою очередь, может не оказаться подходящего цвета.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Это немного отличается от использования цвета заданного настройками системы, так как в этом случае wx ведёт себя так, будто определённый цвет уже был задан и его не волнует, если этот цвет окажется таким же, как и системный.
Давайте примем эту информацию во внимание и напишем простой скрипт, который демонстрирует изменение цвета фона объекта Panel, а затем сбрасывает его, сменяя на стандартный серый. Мы также сменим цвет фона TextCtrl и сбросим его, просто, чтобы довести дело до конца.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
import wx class MyForm(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, wx.ID_ANY, "Background Reset Tutorial") # добавляем панель, чтобы она выглядела нормально на всех платформах self.panel = wx.Panel(self, wx.ID_ANY) self.txt = wx.TextCtrl(self.panel) self.txt.SetBackgroundColour("Yellow") blueBtn = wx.Button(self.panel, label="Change Background Color") blueBtn.Bind(wx.EVT_BUTTON, self.onChangeBackground) resetBtn = wx.Button(self.panel, label="Reset") resetBtn.Bind(wx.EVT_BUTTON, self.onReset) topSizer = wx.BoxSizer(wx.VERTICAL) btnSizer = wx.BoxSizer(wx.HORIZONTAL) btnSizer.Add(blueBtn, 0, wx.ALL|wx.CENTER, 5) btnSizer.Add(resetBtn, 0, wx.ALL|wx.CENTER, 5) topSizer.Add(self.txt, 0, wx.ALL, 5) topSizer.Add(btnSizer, 0, wx.CENTER) self.panel.SetSizer(topSizer) def onChangeBackground(self, event): """ Меняем цвет фона панели. """ self.panel.SetBackgroundColour("Blue") self.panel.Refresh() def onReset(self, event): """ Возвращаем обычный цвет фона по умолчанию. """ self.panel.SetBackgroundColour(wx.NullColor) self.txt.SetBackgroundColour(wx.NullColor) self.panel.Refresh() # Запускаем программу if __name__ == "__main__": app = wx.PySimpleApp() frame = MyForm() frame.Show() app.MainLoop() |
В этом коде вы можете заметить, что я задал изначальным цветом фона жёлтый и дал пользователю возможность сменять цвет фона с помощью кнопочного хендлера. Также пользователь может сбросить цвет фона обеих виджетов с помощью кнопки «Reset».
Вот изображения «до» и «после»
До сброса
После сброса
Итоги
Сейчас вы знаете как сбросить цвет стандартных виджетов wxPython. Это знание крайне полезно в некоторых случаях, но назвать его тем, что пригодится вам в ежедневной практике не поворачивается язык. Как бы то ни было, данные знания точно не будут лишними.
Продолжение
Следующий урок №6: Как создать «тёмный режим»?
Предыдущий урок №4: Как поставить фоновое изображение на приложение
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»