Python 文件选择器的字体颜色

Python 文件选择器的字体颜色,python,kivy,Python,Kivy,我想知道如何更改FileChooserListView和FileChooseConView的字体颜色(文本颜色) 我可以改变背景颜色(白色),我想改变字体颜色为黑色 我该怎么做呢?Kivy widget的默认样式被放置在文件中。您可以复制它的条目并根据自己的喜好进行更改。例如: from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout from kivy.app import App from kivy

我想知道如何更改FileChooserListView和FileChooseConView的字体颜色(文本颜色)

我可以改变背景颜色(白色),我想改变字体颜色为黑色


我该怎么做呢?

Kivy widget的默认样式被放置在文件中。您可以复制它的条目并根据自己的喜好进行更改。例如:

from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App
from kivy.lang import Builder

Builder.load_string('''

<FileChooserListView>:
    # --------------------
    # ADD BACKGROUND COLOR
    # --------------------
    canvas.before:
        Color:
            rgb: 1, 1, 1
        Rectangle:
            pos: self.pos
            size: self.size
    layout: layout
    FileChooserListLayout:
        id: layout
        controller: root

[FileListEntry@FloatLayout+TreeViewNode]:
    locked: False
    entries: []
    path: ctx.path
    # FIXME: is_selected is actually a read_only treeview property. In this
    # case, however, we're doing this because treeview only has single-selection
    # hardcoded in it. The fix to this would be to update treeview to allow
    # multiple selection.
    is_selected: self.path in ctx.controller().selection

    orientation: 'horizontal'
    size_hint_y: None
    height: '48dp' if dp(1) > 1 else '24dp'
    # Don't allow expansion of the ../ node
    is_leaf: not ctx.isdir or ctx.name.endswith('..' + ctx.sep) or self.locked
    on_touch_down: self.collide_point(*args[1].pos) and ctx.controller().entry_touched(self, args[1])
    on_touch_up: self.collide_point(*args[1].pos) and ctx.controller().entry_released(self, args[1])
    BoxLayout:
        pos: root.pos
        size_hint_x: None
        width: root.width - dp(10)
        Label:
            # --------------
            # CHANGE FONT COLOR
            # --------------
            color: 0, 0, 0, 1
            id: filename
            text_size: self.width, None
            halign: 'left'
            shorten: True
            text: ctx.name
        Label:
            # --------------
            # CHANGE FONT COLOR
            # --------------
            color: 0, 0, 0, 1
            text_size: self.width, None
            size_hint_x: None
            halign: 'right'
            text: '{}'.format(ctx.get_nice_size())


<MyWidget>:
    FileChooserListView
''')

class MyWidget(BoxLayout):
    pass

class TestApp(App):
    def build(self):
        return MyWidget()


if __name__ == '__main__':
    TestApp().run()
从kivy.uix.button导入按钮
从kivy.uix.boxlayout导入boxlayout
从kivy.app导入应用程序
从kivy.lang导入生成器
Builder.load_字符串(“”)
:
# --------------------
#添加背景色
# --------------------
在以下情况之前:
颜色:
rgb:1,1,1
矩形:
pos:self.pos
大小:self.size
布局:布局
文件选择器列表布局:
id:布局
控制器:根
[FileListEntry@FloatLayout+TreeViewNode]:
锁定:错误
条目:[]
路径:ctx.path
#FIXME:is_selected实际上是一个只读树视图属性
#不过,我们之所以这样做是因为treeview只有一个选择
#硬编码的。解决方法是更新treeview以允许
#多重选择。
_是否选中:ctx.controller()选择中的self.path
方向:“水平”
尺寸提示:无
高度:“48dp”,如果dp(1)>1,则为“24dp”
#不允许扩展../节点
is_leaf:不是ctx.isdir或ctx.name.endswith(“..”+ctx.sep)或self.locked
按下按钮时:self.collide\u point(*args[1].pos)和ctx.controller().entry\u按下按钮(self,args[1])
触摸时:self.collide_point(*args[1].pos)和ctx.controller().entry_已释放(self,args[1])
盒子布局:
pos:root.pos
大小提示:无
宽度:根部宽度-dp(10)
标签:
# --------------
#更改字体颜色
# --------------
颜色:0,0,0,1
id:文件名
文本大小:self.width,无
哈利格:“左”
是的
文本:ctx.name
标签:
# --------------
#更改字体颜色
# --------------
颜色:0,0,0,1
文本大小:self.width,无
大小提示:无
哈利格:“对”
文本:“{}”。格式(ctx.get_nice_size())
:
文件选择器列表视图
''')
类MyWidget(BoxLayout):
通过
类TestApp(应用程序):
def生成(自):
返回MyWidget()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
TestApp().run()
在回答问题时,我想出了不同的设计Kivy filechooser的方法。除了全局覆盖样式外,还可以使用自定义函数bind to
on_entry\u added
on_subentry\u to_entry
事件更改添加的文件项。这种方法产生了更清晰的代码:

from kivy.app import App
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout


Builder.load_string("""
<MyWidget>:
    FileChooserListView
        id: filechooser
""")

class MyWidget(BoxLayout):
    def __init__(self, *args):
        Clock.schedule_once(self.init_widget, 0)
        return super().__init__(*args)

    def init_widget(self, *args):
        fc = self.ids['filechooser']
        fc.bind(on_entry_added=self.update_file_list_entry)
        fc.bind(on_subentry_to_entry=self.update_file_list_entry)

    def update_file_list_entry(self, file_chooser, file_list_entry, *args):
        file_list_entry.ids['filename'].color = (0.0, 1.0, 1.0, 1.0)


class MyApp(App):
    def build(self):
        return MyWidget()


if __name__ == '__main__':
    MyApp().run()
从kivy.app导入应用
从kivy.clock导入时钟
从kivy.lang导入生成器
从kivy.uix.boxlayout导入boxlayout
生成器。加载\u字符串(“”)
:
文件选择器列表视图
id:filechooser
""")
类MyWidget(BoxLayout):
定义初始化(self,*args):
Clock.schedule_一次(self.init_小部件,0)
返回super()。\uuuu init\uuuu(*args)
def init_小部件(self,*args):
fc=self.ids['filechooser']
绑定(在条目上添加=自更新文件列表条目)
绑定(在子条目到条目=自我更新文件列表条目上)
def更新文件列表项(self、文件选择器、文件列表项、*args):
文件列表条目.ids['filename'].color=(0.0,1.0,1.0,1.0)
类别MyApp(应用程序):
def生成(自):
返回MyWidget()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
MyApp().run()

Nykakin在2019年的回应似乎是最好的方法,然而,我不得不稍微修改一下,以便为我工作。我不确定这是因为我使用了FileChooseConView,还是因为kivy在制作示例后进行了一些重构

对于其他正在挣扎的人,以下是我对Kykakin示例代码所做的更改:

def __init__(self, **args):
        Clock.schedule_once(self.init_widget, 0)
        return super(Loc, self).__init__(**args) # where Loc is the class I am working in

 def update_file_list_entry(self, file_chooser, file_list_entry, *args):
        file_list_entry.children[0].color = (0.0, 0.0, 0.0, 1.0)  # File Names
        file_list_entry.children[1].color = (0.0, 0.0, 0.0, 1.0)  # Dir Names`