屏幕管理器中的屏幕更新

时间:2019-01-18 08:54:28

标签: python kivy

我正在使用kivy构建具有3个屏幕的应用程序屏幕。 我的主屏幕(Base类)显示来自SQL请求的数据。 我希望用户能够使用一个按钮来更新这些数据。 首先,该类在屏幕管理器中调用,它本身在我的根类中调用。 所以我的问题是,如何清除我的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 :(得分:1)

您的代码有两个问题。首先,在您的refresh()方法中,self.clear_widgets(screens='main')是错误的。 screens arg必须是屏幕列表。所以应该是

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()的{​​{1}}方法而不是您显示的那一个。要解决此问题,您可以保存对原始Manager的引用,并在Manager方法中使用该引用:

refresh()
相关问题