添加到数据后更新RecycleView列表

时间:2018-11-15 13:59:47

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

“我的个人资料”屏幕包含一个RV列表。单击“添加配置文件”将带您进入带有TextInput和“添加”按钮的单独屏幕。单击按钮后,它将输入添加到pickle文件中,RV列表从该文件中获取数据。然后,该按钮会将您带回到“个人资料”屏幕。

我的问题是,单击添加并返回到配置文件屏幕后,列表不会使用新添加的配置文件名称进行更新,但是在关闭程序并重新加载后,我们将在RV列表中找到该项目。

.kv文件中的配置文件屏幕为ProfileScreen,添加配置文件屏幕为PAddScreen。

home.py

import kivy
kivy.require("1.10.1")
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from modules import roll as r
from modules import profile as p
from modules import modifier as m
from modules import variable as v
from kivy.uix.selectableview import SelectableView
from kivy.uix.recycleview import RecycleView
from kivy.uix.recycleview.views import RecycleDataViewBehavior
from kivy.uix.label import Label
from kivy.properties import BooleanProperty
from kivy.uix.recycleboxlayout import RecycleBoxLayout
from kivy.uix.behaviors import FocusBehavior
from kivy.uix.recycleview.layout import LayoutSelectionBehavior
from kivy.uix.textinput import TextInput
from kivy.clock import Clock


# Begin code for Recycle Viewer
class SelectableRecycleBoxLayout(FocusBehavior, LayoutSelectionBehavior,
                                 RecycleBoxLayout):
    ''' Adds selection and focus behaviour to the view. '''


class SelectableLabel(RecycleDataViewBehavior, Label):
    ''' Add selection support to the Label '''
    index = None
    selected = BooleanProperty(False)
    selectable = BooleanProperty(True)

    def refresh_view_attrs(self, rv, index, data):
        ''' Catch and handle the view changes '''
        self.index = index
        print("View Refreshed")
        return super(SelectableLabel, self).refresh_view_attrs(
            rv, index, data)

    def on_touch_down(self, touch):
        ''' Add selection on touch down '''
        if super(SelectableLabel, self).on_touch_down(touch):
            print("Touched")
            return True
        if self.collide_point(*touch.pos) and self.selectable:
            print("Touched 2")
            return self.parent.select_with_touch(self.index, touch)

    def apply_selection(self, rv, index, is_selected):
        ''' Respond to the selection of items in the view. '''
        self.selected = is_selected
        if is_selected:
            print("selection changed to {0}".format(rv.data[index]))
            print("Applied")

        else:
            print("selection removed for {0}".format(rv.data[index]))
            print("Applied 2")


class RV(RecycleView):
    def __init__(self, **kwargs):
        super(RV, self).__init__(**kwargs)
        # self.data = [{'text': str(x)} for x in range(100)]
        self.data = [{'text': str(x)} for x in p.PickleLoadProfile.zip1]


# Begin code for screen manager
class ProfileScreen(Screen):
    pass


class RollScreen(Screen):
    pass


class ModifierScreen(Screen):
    pass


class VariableScreen(Screen):
    pass


class PAddScreen(Screen):

    def addprofile(self, pname):
        p.Profile.add(pname)


class IAddScreen(Screen):
    pass


class ScreenManagement(ScreenManager):
    pass


pres = Builder.load_file("main.kv")


class MainApp(App):

    def build(self):
        return pres


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

main.kv

#: import FadeTransition kivy.uix.screenmanager.FadeTransition
#: import Profile profile

ScreenManagement:
    transition: FadeTransition()
    ProfileScreen:
    PAddScreen:
    RollScreen:
    IAddScreen:
    ModifierScreen:
    VariableScreen:


<SelectableLabel>:
# Draw a background to indicate selection
    font_size: self.height - dp(15)
    canvas.before:
        Color:
            rgba: (.0, 0.9, .1, .3) if self.selected else (0, 0, 0, 1)
        Rectangle:
            pos: self.pos
            size: self.size

<RV>:

<ProfileScreen>:
    name: "profile"
    id: profiles

    BoxLayout:
        orientation: 'vertical'
        BoxLayout:
            orientation: 'vertical'
            size_hint_y: .08
            Label:
                font_size: self.height - 2
                text: "Profiles"
                bold: True
                canvas.before:
                    Color:
                        rgba: (.25, .25, .25, 1)
                    Rectangle:
                        pos: self.pos
                        size: self.size
        BoxLayout:
            id: "rv"
            orientation: 'vertical'
            size_hint_y: .71
            #BoxLayout:
            RV:
                viewclass: 'SelectableLabel'
                id: RVTest
                SelectableRecycleBoxLayout:
                    id: RVList
                    spacing: 4
                    default_size: None, root.height *.08
                    default_size_hint: 1, None
                    size_hint: 1, None
                    height: self.minimum_height
                    orientation: 'vertical'
                    multiselect: False
                    touch_multiselect: False
        BoxLayout:
            orientation: 'horizontal'
            size_hint_y: .07
            Button:
                on_release: app.root.current = "roll"
                text: "Open"
                font_size: self.height *.7
        BoxLayout:
            orientation: 'horizontal'
            size_hint_y: .07
            Button:
                on_release: app.root.current = "padd"
                text: "Add Profile"
                font_size: self.height *.7
            Button:
                on_release: app.root.current = "roll"
                text: "Remove Profile"
                font_size: self.height *.7
        BoxLayout:
            orientation: 'horizontal'
            size_hint_y: .07
            Button:
                on_release: app.root.current = "variable"
                text: "Variables"
                font_size: self.height *.7
            Button:
                on_release: app.root.current = "modifier"
                text: "Modifiers"
                font_size: self.height *.7

<RollScreen>:
    name:"roll"
    BoxLayout:
        orientation: 'vertical'
        BoxLayout:
            orientation: 'vertical'
            size_hint_y: .08
            Label:
                font_size: self.height *.8
                text: "Rolls"
        BoxLayout:
            orientation: 'vertical'
            size_hint_y: .84
        BoxLayout:
            orientation: 'horizontal'
            size_hint_y: .08
            BoxLayout:
                Button:
                    on_release: app.root.current = "profile"
                    text: "Profile"
                    font_size: 15
                Button:
                    on_release: app.root.current = "variable"
                    text: "Variables"
                    font_size: 15
                Button:
                    on_release: app.root.current = "modifier"
                    text: "Modifiers"
                    font_size: 15

<VariableScreen>:
    name:"variable"
    BoxLayout:
        orientation: 'vertical'
        BoxLayout:
            orientation: 'vertical'
            size_hint_y: .08
            Label:
                font_size: 20
                text: "Variables"
        BoxLayout:
            orientation: 'vertical'
            size_hint_y: .84
        BoxLayout:
            orientation: 'horizontal'
            size_hint_y: .08
            BoxLayout:
                Button:
                    on_release: app.root.current = "profile"
                    text: "Profile"
                    font_size: 15
                Button:
                    on_release: app.root.current = "roll"
                    text: "Rolls"
                    font_size: 15
                Button:
                    on_release: app.root.current = "modifier"
                    text: "Modifiers"
                    font_size: 15

<ModifierScreen>:
    name:"modifier"
    BoxLayout:
        orientation: 'vertical'
        BoxLayout:
            orientation: 'vertical'
            size_hint_y: .08
            Label:
                font_size: 20
                text: "Modifiers"
        BoxLayout:
            orientation: 'vertical'
            size_hint_y: .84
        BoxLayout:
            orientation: 'horizontal'
            size_hint_y: .08
            BoxLayout:
                Button:
                    on_release: app.root.current = "profile"
                    text: "Profile"
                    font_size: 15
                Button:
                    on_release: app.root.current = "roll"
                    text: "Rolls"
                    font_size: 15
                Button:
                    on_release: app.root.current = "variable"
                    text: "Variables"
                    font_size: 15

<PAddScreen>:
    name: "padd"
    BoxLayout:
        orientation: 'vertical'
        BoxLayout:
            size_hint_y: .1
        BoxLayout:
            size_hint_y: .1
            BoxLayout:
                size_hint_x: .1
                size_hint_y: None
            BoxLayout:
                TextInput:
                    id: apinput
                    hint_text: "Enter profile name"
                    pos: self.pos
                    size: self.size
                    text: ""
                    multiline: False
                    font_size: self.height*.5
            BoxLayout:
                size_hint_x: .1
        BoxLayout:
            orientation: 'horizontal'
            size_hint_y: .8
        BoxLayout:
            size_hint_y: .1
            orientation: 'horizontal'
            Button:
                on_press: root.addprofile(apinput.text)
                on_release:
                on_release: app.root.current = "profile"
                text: "Add"
                font_size: self.height *.8
            Button:
                on_release: app.root.current = "profile"
                text: "Cancel"
                font_size: self.height *.8

<IAddScreen>:
    name: "iadd"

profile.py

import pickle


class PickleLoadProfile:
    try:
        with open('main.kv.pkl', 'rb') as f:
            zip1 = pickle.load(f)

    except:
        zip1 = ""
        pass


class Profile:
    proList = ['']
    proCount = ['']

    def add(name):

        pl = Profile.proList
        pc = Profile.proCount

        try:
            with open('main.kv.pkl', 'rb') as f:
                zip1 = pickle.load(f)

        except:
            pass

        if name == '':
            pass

        else:
            try:
                pl = list(zip1.keys())
                pc = list(zip1.values())
                (pl, pc) = zip(*zip1.items())
                pl = list(pl)
                pc = list(pc)
            except:
                print("Try 1 failed")
                print(pl, pc)
                pass
            if pl[0] == '':
                pl[0] = name
                pc[0] = str((len(pl)))
            else:
                pl.append(name)
                # pl.append(input("Enter profile name: "))
                pc.append(str((len(pl))))
            Profile.proList = pl
            Profile.proCount = pc
            zip1 = dict(zip(pl, pc))
            print(zip1)
            with open('main.kv.pkl', 'wb') as f:
                pickle.dump(zip1, f)



    def remove():

        pl = Profile.proList
        pc = Profile.proCount

        try:
            with open('main.kv.pkl', 'rb') as f:
                zip1 = pickle.load(f)

                pl = list(zip1.keys())
                (pl, pc) = zip(*zip1.items())
                pl = list(pl)

        except pickle.UnpicklingError as e:
            pass

        except (AttributeError, EOFError, ImportError, IndexError) as e:
            pass

        except Exception as e:
            return

        if pl[0] == '':
            return print("No profiles have been made.")

        else:
            print(pl)
            r = input("Who would you like to remove: ")

            if r == "":
                print("You have to type a name: ")
                Profile.remove()

            else:
                try:
                    del zip1[r]
                except:
                    print("Profile does not exist")
                    pass

        pl = list(zip1.keys())
        pc = list(zip1.values())
        (pl, pc) = zip(*zip1.items())
        pl = list(pl)
        pc = list(pc)
        for x in range(len(pc)):
            pc[x] = x+1

        zip1 = dict(zip(pl, pc))
        print(zip1)
        with open('main.kv.pkl', 'wb') as f:
            pickle.dump(zip1, f)

    def show():

        try:
            with open('main.kv.pkl', 'rb') as f:
                zip1 = pickle.load(f)

        except pickle.UnpicklingError as e:
            pass

        except (AttributeError, EOFError, ImportError, IndexError) as e:
            pass

        except Exception as e:
            return
        print(zip1)


if __name__ == '__main__':
    do = input("Would you like to add, remove, or show: ")

    if do == "add":
        Profile.add()
    elif do == "remove":
        Profile.remove()
    elif do == "show":
        Profile.show()

0 个答案:

没有答案