在Python GTK3中设置Entry Background Color并设置回默认值的最佳方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Python GTK3中设置Entry Background Color并设置回默认值的最佳方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5112字,纯文字阅读大概需要8分钟。
内容图文
![在Python GTK3中设置Entry Background Color并设置回默认值的最佳方法](/upload/InfoBanner/zyjiaocheng/825/b14314d9ce794a44ae458089219e8a2f.jpg)
为一个条目设置背景颜色并将其设置回默认颜色的最佳方法是什么?
我的脚本现在正在运行,但我确信这不是最好的方法.
我还有两个问题:
>如果我插入一个文本,不包含字符串“red”或“green”并选择此文本,我无法看到我的选择,因为它全是白色的.
>我认为有更好的方法,然后我将self.entry_default_background_color_str插入CSS文本.
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk
class Window(Gtk.Window):
def __init__(self):
self.screen = Gdk.Screen.get_default()
self.gtk_provider = Gtk.CssProvider()
self.gtk_context = Gtk.StyleContext()
self.gtk_context.add_provider_for_screen(self.screen, self.gtk_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
Gtk.Window.__init__(self, title="Check Input")
self.set_size_request(300, 80)
self.mainbox = Gtk.VBox()
self.add(self.mainbox)
# entry
self.name_entry = Gtk.Entry()
self.name_entry.set_name("name_entry")
self.mainbox.pack_start(self.name_entry, True, True, 0)
self.name_entry.connect("changed", self.check_input)
entry_context = self.name_entry.get_style_context()
self.entry_default_background_color = entry_context.get_background_color(Gtk.StateType.NORMAL)
self.entry_default_background_color_str = self.entry_default_background_color.to_string()
self.show_all()
def check_input(self, _widget=None):
if "red" in self.name_entry.get_text():
self.gtk_provider.load_from_data('#name_entry { background: red; }')
elif "green" in self.name_entry.get_text():
self.gtk_provider.load_from_data('#name_entry { background: green; }')
else:
self.gtk_provider.load_from_data('#name_entry { background: ' + self.entry_default_background_color_str + '; }')
def main():
window = Window()
Gtk.main()
if __name__ == "__main__":
main()
解决方法:
我将首先解决您提到的问题,因为它们可以深入了解GTK和OP的代码.主要问题(以及执行此操作的正确代码)的答案一直是答案的底部.
- If I insert a text, not containing string “red” or “green” and select this text I cant see my selection because It is all white.
发生这种情况的原因是因为使用了background属性,这会将Entry的所有与背景相关的属性设置为该颜色.所以选择的那个以及“真实的”背景.
然后问题是我们使用什么属性,这是GTK的一部分,文档记录很少,但我们可以找到使用GtkInspector,它让我们看到哪些样式属性正在发生变化.这产生我们应该使用背景图像,并且背景颜色用于选择的背景.
只是将背景图像设置为颜色不起作用,因为需要图像而产生错误.所以现在我们必须找出一种方法,将我们的颜色变成我们可以设置为背景图像的东西,幸运的是,检查员向我们展示了GTK内部的方式,即通过包裹颜色如下:线性渐变(红色).这样做可以创建一个统一的红色图像,可以用作背景.
将这些知识应用于您的代码可以为我们提
if "red" in self.name_entry.get_text():
self.gtk_provider.load_from_data('#name_entry { background-image: linear-gradient(red); }')
elif "green" in self.name_entry.get_text():
self.gtk_provider.load_from_data('#name_entry { background-image: linear-gradient(green); }')
- I think there are better ways then the way I insert
self.entry_default_background_color_str
into the CSS text.
确实有一种更好的方法,即不要这样做.我们可以通过向CssProvider提供一个空的css版本来轻松返回默认值,这将覆盖旧的版本,从而删除任何旧的样式属性,例如颜色.
将此与前一部分相结合,可以为我们提供:
if "red" in self.name_entry.get_text():
self.gtk_provider.load_from_data('#name_entry { background-image: linear-gradient(red); }')
elif "green" in self.name_entry.get_text():
self.gtk_provider.load_from_data('#name_entry { background-image: linear-gradient(green); }')
else:
self.gtk_provider.load_from_data('#name_entry {}')
What is the best way to set background color for one entry and set it back to the default color?
现在我用你的代码解决了问题,现在这是一个非常重要的问题.你现在这样做的方式是替换CSS文件,它工作正常,但从长远来看效率非常低.通常,您将加载CSS并使用类和ID来告诉它应用哪种样式.
下面我修改了你的代码,这样做,检查注释的说明.
def __init__(self):
screen = Gdk.Screen.get_default()
gtk_provider = Gtk.CssProvider()
gtk_context = Gtk.StyleContext()
gtk_context.add_provider_for_screen(screen, gtk_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
# Create the window
Gtk.Window.__init__(self, title="Check Input")
self.set_size_request(300, 80)
self.mainbox = Gtk.VBox()
self.add(self.mainbox)
# Load the CSS
gtk_provider.load_from_data("""
#name_entry.red { background-image: linear-gradient(red); }
#name_entry.green { background-image: linear-gradient(green); }
""")
# Create the entry and give it a name which will be the ID
name_entry = Gtk.Entry()
name_entry.set_name("name_entry")
self.mainbox.pack_start(name_entry, True, True, 0)
# Add the listener
name_entry.connect("changed", self.check_input)
self.show_all()
def check_input(self, entry):
# Get the style context for this widget
entry_style_context = entry.get_style_context()
# Check if our text contains red
if "red" in entry.get_text():
# Add the red class, so now the styling with .red is applied
entry_style_context.add_class("red")
# Check if our text contains green
elif "green" in entry.get_text():
# Add the red class, so now the styling with .green is applied
entry_style_context.add_class("green")
else:
# When the text doesn't contain it remove the color classes to show the default behaviour
entry_style_context.remove_class("red")
entry_style_context.remove_class("green")
内容总结
以上是互联网集市为您收集整理的在Python GTK3中设置Entry Background Color并设置回默认值的最佳方法全部内容,希望文章能够帮你解决在Python GTK3中设置Entry Background Color并设置回默认值的最佳方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。