kivy:如何将开关默认从ON / OFF更改为OPEN / CLOSE或更改为YES / NO?

时间:2016-08-22 14:27:43

标签: kivy

为了更清楚,我希望Switch的文本从On/Off更改为Open/CloseYes/No。我没有发现如何做到这一点。感谢。

4 个答案:

答案 0 :(得分:4)

您可以通过更改开关中右侧矩形的背景图像来解决此问题 您可以制作像小部件一样的83x32像素的图标 我在sumo在线照片上做了一个非常难看的例子:
enter image description here
然后我将其保存为images/icon.jpg
如果你想改变滑块,它的43x32像素。

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.switch import Switch


class MyGui(Widget):

    def __init__(self,**kwargs):
        super(MyGui,self).__init__(**kwargs)

        self.switch = Switch()

        self.switch.canvas.children[2].source = "images/icon.jpg" # The slider is the last element, so in that case -> children[-1].source

        self.add_widget(self.switch)



class MyApp(App):

    def build(self):
        return MyGui()


if __name__ == '__main__':
    MyApp().run()

如果你想用kv语言这样做,你可以这样做:

from kivy.lang import Builder

Builder.load_string("""

<MyGui>:
    Switch:
        canvas:
            Color:
                rgb: 1,1,1
            Rectangle:
                source: 'switch.jpg'        # make or download your background jpg
                size: sp(83), sp(32)
                pos: int(self.center_x - sp(41)), int(self.center_y - sp(16))
            Rectangle:
                source: 'switch_slider.jpg' # make or download your slider jpg
                size: sp(43), sp(32)
                pos: int(self.center_x - sp(41) + self.active_norm_pos * sp(41)), int(self.center_y - sp(16))
""")

class MyGui(Widget):
    pass

答案 1 :(得分:1)

切换文字遗憾的不是文字而是图像。你可以找到kv文件here。您应该能够提供不同的主题(请参阅here),或者您可以覆盖该类并实现您自己的渲染(然后显示OPEN / CLOSE)而不是ON / OFF。

答案 2 :(得分:1)

如果您不打算改变其整体外观,可以patch the style.kv并使用一些画布说明来创建您喜欢的小部件。 ^。^

(并且它比为每个不同的开关创建图像更灵活,如果你不想改变它的颜色)

from kivy.lang import Builder
from kivy.base import runTouchApp
from kivy.uix.boxlayout import BoxLayout
Builder.load_string('''
<Custom@Switch>:
    values: ['OFF', 'ON']
    canvas:
        Color:
            rgb: 0.2, 0.709, 0.898, 1
        Rectangle:
            size: [sp(41.5), sp(20)]
            pos: [self.center_x - sp(41.5), self.center_y - sp(10)]
        Color:
            rgb: 0.4, 0.4, 0.4, 1
        Rectangle:
            size: [sp(41.5), sp(20)]
            pos: [self.center_x, self.center_y - sp(10)]
    Label:
        text: '[b]{}[/b]'.format(root.values[0])
        markup: True
        font_size: 13
        pos: [root.center_x - sp(70), root.center_y - sp(50)]
    Label:
        color: 0.75, 0.75, 0.75, 1
        text: '[b]{}[/b]'.format(root.values[1])
        markup: True
        font_size: 13
        pos: [root.center_x - sp(30), root.center_y - sp(50)]

<Test>:
    Custom:
    Switch:
    Custom:
        values: ['Yes', 'No']
''')
class Test(BoxLayout): pass
runTouchApp(Test())

答案 3 :(得分:0)

如果您使用@ el3in的解决方案,请确保澄清$ foo () { declare -g x; x=3; echo "$x"; } $ x=2 $ foo 3 $ echo "$x" 3 而不是canvas.after,否则原始开关图像将停留在顶部;)