обновление экрана в диспетчере экрана - PullRequest
0 голосов
/ 18 января 2019

Я использую Kivy для создания экрана приложения с 3 экранами. мой основной экран (класс Base) показывает данные из запроса SQL. Я хотел бы, чтобы пользователь мог обновить эти данные с помощью кнопки. Сначала этот класс Base вызывается в диспетчере экрана, который сам вызывается в моем корневом классе. Итак, мой вопрос: как мне очистить данные в моем классе Base и обновить их новыми данными?

Я пытался очистить данные в моем диспетчере экрана класса. функция обновления вызывается из корневого класса. у меня есть ошибка ниже: 'ScreenManager использует remove_widget только для удаления экранов'

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from sql import runsql2
from kivy.core.window import Window

    class Manager(ScreenManager):
        def __init__(self):
            super(Manager, self).__init__()

            for i in range(2):
                txt = 'Screen {}'.format(i)
                lbl = Label(text=txt)
                screen = Screen(name=txt)
                screen.add_widget(lbl)
                self.add_widget(screen)

            base=Base('main')
            self.add_widget(base)

        def refresh(self):
            self.clear_widgets(screens='main')
            base=Base('main')
            self.add_widget(base)


    class Nav(GridLayout):

        def __init__(self,sm=None):
            super(Nav, self).__init__()

            self.sm = sm
            self.cols =3
            self.size_hint = (1,0.1)
            self.add_widget(Button(text="Clearing Screen", on_release=self.change))
            self.add_widget(Button(text="Go screen 2", on_release=self.goscreen))
            self.add_widget(Button(text="Quit", on_release=self.quit))

        def change(self, btn):
            #self.sm.current = btn.text
            self.sm.current='main'

        def quit(self,ins):
            exit()

        def goscreen(self,ins):
            self.sm.current='Screen 1'

    class Base(Screen):
        def __init__(self,name):
            super(Base, self).__init__()
            self.lay=GridLayout()
            self.name=name
            self.bout=['[color=33ff99]Refresh[/color]','',"","","","","","","","",""]
            self.data=runsql2()
            self.lay.cols = 11
            self.titre=['[color=ff9900]Market[/color]', '[color=ff9900]B/S[/color]', '[color=ff9900]Volume[/color]', '[color=ff9900]Contract[/color]',
                        '[color=ff9900]C/P[/color]', '[color=ff9900]Expiry[/color]', '[color=ff9900]Strike[/color]', '[color=ff9900]Price[/color]',
                        '[color=ff9900]Account[/color]', '[color=ff9900]Give up Member[/color]', '[color=ff9900]Allocation Account[/color]']

            #self.lay.add_widget(Button(text='[color=33ff99]Refresh[/color]', size_hint=(1, 0.15), markup=True,on_release=self.do))
            for i in range(11):
                self.lay.add_widget(Label(text='', size_hint=(1, 0.15)))
            for j in range(11):
                self.lay.add_widget(Label(text=str(self.titre[j]),size_hint=(0.2,0.2),markup=True))
            long = len(self.data)
            for i in range(long):
                for j in range(11):
                    self.lay.add_widget(Label(text=str(self.data[i][j])))
            self.add_widget(self.lay)

    class Root(BoxLayout):

        def __init__(self):
            super(Root, self).__init__()
            self.orientation = "vertical"
            #Window.clearcolor = (0.6, 0.6, 0.6,1)
            sm = Manager()

            self.add_widget(Nav(sm=sm))
            self.add_widget(sm)
            self.add_widget(Button(text='refresh',size_hint=(0.2,0.2),on_release=self.refresh))
            Window.size = (1500, 900)

        def refresh(self,ins):
            sm=Manager()
            sm.refresh()

    class TestApp(App):
        def build(App):
            return Root()

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

1 Ответ

0 голосов
/ 19 января 2019

Две проблемы с вашим кодом. Во-первых, в вашем refresh() методе self.clear_widgets(screens='main') неверен. Аргумент screens должен быть списком экранов. Так и должно быть

def refresh(self):
    self.clear_widgets(screens=[self.get_screen('main')])
    base=Base('main')
    self.add_widget(base)

Поскольку вы удаляете только один экран, вы можете использовать self.remove_widget(self.get_screen('main')).

И, во-вторых, ваш метод refresh() в классе Root создает новый класс Manager и вызывает метод refresh() этого нового Manager, а не того, который вы отобразили. Чтобы исправить это, вы можете сохранить ссылку на исходный Manager и использовать эту ссылку в методе refresh():

class Root(BoxLayout):

    def __init__(self):
        super(Root, self).__init__()
        self.orientation = "vertical"
        #Window.clearcolor = (0.6, 0.6, 0.6,1)
        sm = Manager()

        self.sm = sm   # keep a reference for later use
        self.add_widget(Nav(sm=sm))
        self.add_widget(sm)
        self.add_widget(Button(text='refresh',size_hint=(0.2,0.2),on_release=self.refresh))
        Window.size = (1500, 900)

    def refresh(self,ins):
        self.sm.refresh()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...