繁体   English   中英

如何使用On_Press更改动态创建的小部件的BG颜色并使用Pickle保存? (带有Kivy的Python)

[英]How to Change BG Color of Dynamically Created Widget with On_Press and Save with Pickle? (Python with Kivy)

目标:

  1. 按下即可更改动态创建的小部件的背景颜色。
  2. 用泡菜保存此状态,以便当我打开程序备份时,保留新的颜色更改

注意:您会在代码中看到尚未尝试将按钮bg颜色状态保存到文件中,因为我仍在尝试使按动事件起作用。

我收到以下错误:

  File "C:/Users/phili/scrollablelabelexample.py", line 45, in create_button
    button_share.bind(on_press = self.update_buttons_departoverride(self))

TypeError: update_buttons_departoverride() takes 1 positional argument but 2 were given

Python代码:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.textinput import TextInput
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.uix.scrollview import ScrollView
from kivy.properties import StringProperty, ObjectProperty, NumericProperty
from kivy.clock import Clock
import pandas as pd
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label

class AnotherScreen(Screen):
    pass

class BackHomeWidget(Widget):
    pass

class Sequence(Screen):
    pass

class ScreenManagement(ScreenManager):
    pass

class MainScreen(Screen):
    pass

class CleanScreen(BoxLayout):
    def __init__(self, **kwargs):
        super(CleanScreen, self).__init__(**kwargs)
        self.orientation = "vertical"
        Clock.schedule_once(lambda *args:self.create_button(self.ids.box_share))

    def create_button(self, box_share):
        top_button_share = 1.1
        color = [.48,.72,.23,1]
        for i in range(len(parts)):
            top_button_share -= .4
            button_share = Button(background_normal = '', background_color = color, id = "part"+str(i+1),pos_hint={"x": 0, "top": top_button_share}, size_hint_y=None, height=60, text=str(i))
            button_share.bind(on_press = self.update_buttons_departoverride(self))
            box_share.add_widget(button_share)

    def update_buttons_departoverride(self):
        self.background_color = 1.0, 0.0, 0.0, 1.0

presentation = Builder.load_file("garagemainexample.kv")

class MainApp(App):
    def build(self):
        return presentation 

if __name__ == "__main__":
    MainApp().run()

验证码:

#: import FadeTransition kivy.uix.screenmanager.FadeTransition

ScreenManagement:
    transition: FadeTransition()
    MainScreen:
    Sequence:

<BigButton@Button>:
    font_size: 40
    size_hint: 0.5, 0.15
    color: 0,1,0,1 

<SmallNavButton@Button>:    
    font_size: 32
    size: 125, 50    
    color: 0,1,0,1

<BackHomeWidget>:
    SmallNavButton:
        on_release: app.root.current = "main"
        text: "Home"
        pos: root.x, root.top - self.height

<MainScreen>:
    name: "main"
    FloatLayout:
        BigButton:
            on_release: app.root.current = "sequence"
            text: "Sequence"
            pos_hint: {"x":0.25, "top": 0.4} 

<CleanScreen>:
    ScrollView:
        GridLayout:
            id: box_share
            cols: 1
            size_hint_y: None
            size_hint_x: 0.5
            spacing: 5
            padding: 90
            height: self.minimum_height
            canvas:
                Color: 
                    rgb: 0, 0, 0
                Rectangle:
                    pos: self.pos
                    size: self.size

<Sequence>:
    name: "sequence"
    CleanScreen:
        id: cleanscreen
    BackHomeWidget:

使用button_share.bind (on_press = self.update_buttons_departoverride (self)) 您正在调用方法 ,因此您尝试将on_pressNone绑定( self.update_buttons_departoverride返回None )。 如果要传递参数,请使用lambdafunctools.partial

from functools import partial
button_share.bind(on_press=partial(self.update_buttons_departoverride, arg1,...))

但是,如果您只需要传递按钮的引用,则它已经被自动传递。 您只需要做:

button_share.bind(on_press=self.update_buttons_departoverride)

和:

def update_buttons_departoverride(self, button):

要存储小部件的配置,可以使用Storage 使用DictStore的简化示例:

main.py:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.widget import Widget
from kivy.clock import Clock
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.properties import ObjectProperty
from kivy.storage.dictstore import DictStore


class AnotherScreen(Screen):
    pass


class BackHomeWidget(Widget):
    pass


class Sequence(Screen):
    pass


class ScreenManagement(ScreenManager):
    pass


class MainScreen(Screen):
    pass


class CleanScreen(BoxLayout):
    box_share = ObjectProperty()
    config_file = DictStore('conf.dat')

    def __init__(self, **kwargs):
        super(CleanScreen, self).__init__(**kwargs)
        self.orientation = "vertical"
        Clock.schedule_once(self.create_button)

    def create_button(self, *args):

        top_button_share = 1.1
        color = (.48, .72, .23, 1)
        for i in range(5):
            top_button_share -= .4
            id_ = "part" + str(i + 1)

            if self.config_file.exists(id_):
                btn_color = self.config_file[id_]["background_color"]
            else:
                self.config_file.put(id_, background_color=color)
                btn_color = color

            button_share = Button(background_normal='',
                                  background_color=btn_color,
                                  id=id_,
                                  pos_hint={"x": 0, "top": top_button_share},
                                  size_hint_y=None,
                                  height=60,
                                  text=str(i))
            button_share.bind(on_press=self.update_buttons_departoverride)
            self.box_share.add_widget(button_share)

    def update_buttons_departoverride(self, button):
        button.background_color = 1.0, 0.0, 0.0, 1.0
        self.config_file.put(button.id, background_color=(1.0, 0.0, 0.0, 1.0))

presentation = Builder.load_file("garagemainexample.kv")

class MainApp(App):

    def build(self):
        return presentation

if __name__ == "__main__":
    MainApp().run()

garagemainexample.kv:

#: import FadeTransition kivy.uix.screenmanager.FadeTransition

ScreenManagement:
    transition: FadeTransition()
    MainScreen:
    Sequence:

<BigButton@Button>:
    font_size: 40
    size_hint: 0.5, 0.15
    color: 0,1,0,1 

<SmallNavButton@Button>:    
    font_size: 32
    size: 125, 50    
    color: 0,1,0,1

<BackHomeWidget>:
    SmallNavButton:
        on_release: app.root.current = "main"
        text: "Home"
        pos: root.x, root.top - self.height

<MainScreen>:
    name: "main"
    FloatLayout:
        BigButton:
            on_release: app.root.current = "sequence"
            text: "Sequence"
            pos_hint: {"x":0.25, "top": 0.4} 

<CleanScreen>:
    box_share: box_share
    ScrollView:
        GridLayout:
            id: box_share
            cols: 1
            size_hint_y: None
            size_hint_x: 0.5
            spacing: 5
            padding: 90
            height: self.minimum_height
            canvas:
                Color: 
                    rgb: 0, 0, 0
                Rectangle:
                    pos: self.pos
                    size: self.size

<Sequence>:
    name: "sequence"
    CleanScreen:
        id: cleanscreen
    BackHomeWidget:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM