【问题标题】:How to pass ColorPicker property to root widget如何将 ColorPicker 属性传递给根小部件
【发布时间】:2020-06-22 20:07:33
【问题描述】:

我正在尝试学习如何将 ColorPicker 对象属性从 kv 文件传递​​给主类 MainWindow。 我创建了 ColPopup 和 PickColor 类,并且能够获取有关所选颜色的信息,但我无法获取从 PickColor 传递给 MainWindow 的颜色值。

关于如何实现这一点的任何建议?我想将 Object Property colorpicker 设置为 colorpicker,以便以后可以访问 .color 方法。

main.py

from kivy.app import App
#kivy.require("1.11.1")

from kivy.uix.boxlayout import BoxLayout

from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.checkbox import CheckBox 
from kivy.properties import ObjectProperty
from kivy.uix.colorpicker import ColorPicker
from kivy.uix.popup import Popup

from kivy.config import Config
Config.set('graphics', 'width', '1200')
Config.set('graphics', 'height', '600')
     

class ColPopup(Popup):
    pass

class PickColor(ColorPicker):
    pass

class MainWindow(BoxLayout):
    colorpicker = ObjectProperty()
    
    def __init__(self, **kwargs):
        super(MainWindow, self).__init__(**kwargs)
        self.range_tab_action_grid_buttons = {}
        self.create_actions()
        
    def choose_color(self, instance):
        ColPopup().open()
        print("color picked for ", instance, "with current color", instance.background_color)
        print(self.colorpicker)
                    
    def create_actions(self):   
        
        for i in range(1, 4):
            grid = BoxLayout(size=(180, 20), size_hint=(None, None))
            checkbox = CheckBox(group="Actions",allow_no_selection=False, size_hint=(.2,1))
            grid.add_widget(checkbox)
            label = Label(text="Action"+str(i)+" color", size_hint=(.6,1)) 
            grid.add_widget(label)
                        
            colored_button = Button(background_color=[0, 45, 100, 1], size_hint=(.2,0.8), pos_hint={'center_y':0.5})
            colored_button.bind(on_press = self.choose_color)
            
            grid.add_widget(colored_button)
            self.ids.range_tab_action_grid.add_widget(grid)
            self.range_tab_action_grid_buttons["Action"+str(i)] = {"grid":grid, "checkbox":checkbox, "label":label, "colored_button":colored_button} #, "colorpicker":colorpicker}
            
            # Check the first box
            self.range_tab_action_grid_buttons["Action1"]["checkbox"].active = True

        #print(self.range_tab_action_grid_buttons["Action1"][3].background_color)       
        
        
class ColorPickerApp(App):

    def build(self):
        return MainWindow()
    
if __name__ == "__main__":
    ColorPickerApp().run()

colorpicker.kv

# File name: main.py
#:kivy 1.11.1  

<ColPopup>:
    title: 'Pick a Color'
    size_hint: 0.5, 0.6
    colorpicker: colorpicker
    
    BoxLayout:
        orientation: 'vertical'
        PickColor:
            id: colorpicker
        Button:
            text: "Select color"
            on_release: root.dismiss()
            size_hint: 0.3,0.3
            pos_hint: {"center_x":0.75,"top":0.0}
             

<Button>:
    font_size: 10
    color: 1,1,1,1
    size_hint: 0.05, 0.05
    
                   
<MainWindow>:                        
    BoxLayout:
        id: range_tab_action_grid
        orientation: "vertical"
        size_hint: 0.3, 0.2
        pos_hint: {"right":0.0, "top":1.0}        
 

【问题讨论】:

    标签: python python-3.x user-interface kivy kivy-language


    【解决方案1】:

    您可以设置Select coloron_release 来调用MainWindow 中的方法。如果您将kv 规则修改为ColPopup

    <ColPopup>:
        title: 'Pick a Color'
        size_hint: 0.5, 0.6
        colorpicker: colorpicker
        
        BoxLayout:
            orientation: 'vertical'
            PickColor:
                id: colorpicker
            Button:
                text: "Select color"
                on_release:
                    app.root.chosen_color(colorpicker.color)
                    root.dismiss()
                size_hint: 0.3,0.3
                pos_hint: {"center_x":0.75,"top":0.0}
    

    这会将对chosen_color() 的调用添加到Button

    然后修改MainWindow类:

    class MainWindow(BoxLayout):
        colorpicker = ObjectProperty()
    
        def __init__(self, **kwargs):
            super(MainWindow, self).__init__(**kwargs)
            self.range_tab_action_grid_buttons = {}
            self.create_actions()
    
        def choose_color(self, instance):
            for k,v in self.range_tab_action_grid_buttons.items():
                if v['colored_button'] == instance and v['checkbox'].active:
                    colpopup = ColPopup()
                    self.colorpicker = colpopup.colorpicker
                    colpopup.open()
                    return
    
        def chosen_color(self, color):
            Clock.schedule_once(self.get_color, 5)
            for k,v in self.range_tab_action_grid_buttons.items():
                if v['checkbox'].active:
                    v['colored_button'].background_color = color
                    return
    
        def get_color(self, dt):
            print('color:', self.colorpicker.color)
    
        def create_actions(self):
            .
            .
            .
    

    choose_color() 方法设置colorpicker ObjectProperty。如果Button 在活动行中,它也只会打开ColorPicker

    chosen_color() 方法只改变活动Button 的颜色。

    还要注意Buttonbackground_color 充当默认纹理的乘数。你可以通过设置background_normal=''来改变它。

    【讨论】:

    • 谢谢约翰。很好的解释,现在更清楚了。感谢您指出background_normal,我想知道为什么我的按钮是灰色的。我是否正确理解Clock.schedule_once 仅用于打印所选颜色?
    • 是的,我刚刚添加了这一点,以验证您在 Popup 被解雇后仍然可以获得颜色。这只有效,因为对ColorPicker 的引用被保存,否则它会被垃圾收集。
    猜你喜欢
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    相关资源
    最近更新 更多