【问题标题】:screen update in screen manager屏幕管理器中的屏幕更新
【发布时间】:2019-01-18 08:54:27
【问题描述】:

我正在使用 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()

【问题讨论】:

    标签: python kivy


    【解决方案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'))

    其次,您在Root 类中的refresh() 方法正在创建一个新的Manager 类并调用该新Managerrefresh() 方法,而不是您显示的那个。要更正此问题,您可以保存对原始 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()
    

    【讨论】:

    • 感谢约翰的帮助。我根据您的 cmets 进行了更正,它有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多