gpt4 book ai didi

python - 屏幕管理器中的屏幕更新

转载 作者:行者123 更新时间:2023-12-01 08:26:00 25 4
gpt4 key购买 nike

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

我尝试清除类(class)屏幕管理器中的数据。刷新函数是从根类调用的。我有以下错误:'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()

最佳答案

您的代码有两个问题。首先,在您的 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')) 代替。

其次,Root 类中的 refresh() 方法正在创建一个新的 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()

关于python - 屏幕管理器中的屏幕更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54250462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com