Python 3.x 基维。用不同的数据刷新屏幕

Python 3.x 基维。用不同的数据刷新屏幕,python-3.x,kivy,Python 3.x,Kivy,当我点击按钮时,我需要代码中的数据显示在不同的屏幕上。下面的代码做了我需要的,尽管时钟每秒都会添加小部件。我希望TextInput是可编辑的,因此当我在“行”中键入一些值时,它将保持键入状态。我尝试过使用Clock.schedule\u once(),但是小部件没有出现。我甚至尝试过以下方法: clock = 1 def fill_with_data(self, dt) if clock == 1: for item ... clock +=1 witch锁定添加新的

当我点击按钮时,我需要代码中的数据显示在不同的屏幕上。下面的代码做了我需要的,尽管
时钟
每秒都会添加小部件。我希望
TextInput
是可编辑的,因此当我在“行”中键入一些值时,它将保持键入状态。我尝试过使用
Clock.schedule\u once()
,但是小部件没有出现。我甚至尝试过以下方法:

clock = 1
def fill_with_data(self, dt)
    if clock == 1: 
    for item ...
    clock +=1
witch锁定添加新的小部件(我知道这很可笑),但当我返回到
main屏幕显示另一个数据时,它就不会出现在屏幕上。下面是完整的代码

from kivy.config import Config
Config.set('graphics', 'multisamples', '0')
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import Screen
from kivy.clock import Clock


kv = """
#:import FadeTransition kivy.uix.screenmanager.FadeTransition

ScreenManager:
    MainScreen:
    ShowData:    

<DataSwitch>

    Button:
        text: 'Data 1'
        on_press: app.root.current = 'ShowData'
        on_press: root.show_data1()
    Button:
        text: 'Data 2'
        on_press: app.root.current = 'ShowData'
        on_press: root.show_data2()

<Row>
    TextInput:
        id: text_input
        size_hint_y: None
        height: 30

<Rows>        
    orientation: 'vertical'

<MainScreen>   
    name: 'MainScreen'
    DataSwitch:

<ShowData>:
    name: 'ShowData'
    Rows:
    Button:
        text: 'Go back'
        size_hint_y: None
        height: 20
        on_press: app.root.current = 'MainScreen'

"""

class Row(BoxLayout):
    text = ''
    def __init__(self, **kwargs):
        super(Row, self).__init__(**kwargs)
        self.set_text()

    def set_text(self):
        print('set', self.text)
        self.ids.text_input.text = self.text

class Rows(BoxLayout):

    data =[]

    def __init__(self, **kwargs):
        super(Rows, self).__init__(**kwargs)
        #self.fill_with_data()
        Clock.schedule_interval(self.fill_with_data, 1)
        #Clock.schedule_once(self.fill_with_data)
    def fill_with_data(self, dt):
        for item in self.data:
            Row.text = item
            row = Row()
            self.add_widget(row)
            #self._rows[str(self.row_id)] = weakref.ref(row)

class MainScreen(Screen):
    pass

class DataSwitch(BoxLayout):

    data1 = ['1', '2', '3', '4']
    data2 = ['5', '6', '7', '8']

    def __init__(self, **kwargs):
        super(DataSwitch, self).__init__(**kwargs)

    def show_data1(self):
        print('data1', self.data1)
        Rows.data = self.data1
        Rows()

    def show_data2(self):
        Rows.data = self.data2
        Rows()

class ShowData(Screen):
    pass

sm = Builder.load_string(kv)

class TestApp(App):
    def build(self):
        return sm

if __name__ == '__main__':
    TestApp().run()
从kivy.config导入配置
Config.set('graphics','multisamples','0')
从kivy.app导入应用程序
从kivy.lang导入生成器
从kivy.uix.boxlayout导入boxlayout
从kivy.uix.screenmanager导入屏幕
从kivy.clock导入时钟
kv=”“”
#:导入FadeTransition kivy.uix.screenmanager.FadeTransition
屏幕管理器:
主屏幕:
展示数据:
按钮:
文本:“数据1”
按:app.root.current='ShowData'
按:root.show_data1()
按钮:
文本:“数据2”
按:app.root.current='ShowData'
按:root.show_data2()
文本输入:
id:文本输入
尺寸提示:无
身高:30
方向:“垂直”
名称:“主屏幕”
数据开关:
:
名称:“ShowData”
排:
按钮:
文本:“返回”
尺寸提示:无
身高:20
按:app.root.current='MainScreen'
"""
类行(BoxLayout):
文本=“”
定义初始(自我,**kwargs):
超级(行,自).\uuuu初始值(**kwargs)
self.set_text()
def set_文本(自身):
打印('set',self.text)
self.ids.text\u input.text=self.text
类行(BoxLayout):
数据=[]
定义初始(自我,**kwargs):
超级(行,自).\uuuuu初始化(**kwargs)
#self.fill_与_数据()
时钟。计划时间间隔(使用时间数据自填充时间间隔,1)
#时钟。计划一次(用数据自行填充)
def用_数据填充_(自身,dt):
对于self.data中的项目:
Row.text=项目
行=行()
self.add_小部件(行)
#self.\u行[str(self.row\u id)]=weakref.ref(row)
类主屏幕(屏幕):
通过
类数据开关(BoxLayout):
数据1=['1','2','3','4']
数据2=['5','6','7','8']
定义初始(自我,**kwargs):
超级(数据开关,自我)。\uuuuu初始化(**kwargs)
def显示_数据1(自身):
打印('data1',self.data1)
Rows.data=self.data1
行()
def显示_数据2(自身):
Rows.data=self.data2
行()
类别显示数据(屏幕):
通过
sm=建筑商荷载(kv)
类TestApp(应用程序):
def生成(自):
返回sm
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
TestApp().run()

运行应用程序将产生以下结果:

问题1-实例化的行太多
  • 行:
    根据kv文件
  • Rows()
    按照方法
    show_data1()
    show_data2()
    中的Python脚本。创建的这些
    实例没有关联的
    ModalView
问题2-填充列表、数据前切换屏幕 解决方案 下面的示例只是一个示例

kv文件-添加
id:rows
id:rows
添加到类规则中的
行:
。这将用于引用
类行()
中的属性或方法

kv文件-调用
用数据填充
使用\u pre\u上的
输入
屏幕的事件
时钟。调度一次()
函数调用方法
用数据填充()

注意
将在每次显示屏幕时添加。换句话说,
小部件每次都会加倍。为了防止出现这种情况,可能需要删除在离开前事件中添加的小部件

代码片段-kv文件 例子 main.py
从kivy.config导入配置
Config.set('graphics','multisamples','0')
从kivy.app导入应用程序
从kivy.lang导入生成器
从kivy.uix.boxlayout导入boxlayout
从kivy.uix.screenmanager导入屏幕
kv=”“”
#:导入FadeTransition kivy.uix.screenmanager.FadeTransition
#:导入Clock kivy.Clock.Clock
屏幕管理器:
主屏幕:
展示数据:
按钮:
文本:“数据1”
按:root.show_data1()
按:app.root.current='ShowData'
按钮:
文本:“数据2”
按:root.show_data2()
按:app.root.current='ShowData'
:
文本输入:
id:文本输入
尺寸提示:无
身高:30
:   
方向:“垂直”
:
名称:“主屏幕”
数据开关:
:
名称:“ShowData”
在预输入时输入:
Clock.schedule_一次(self.ids.rows.fill_与_数据,0.1)
排:
id:行
按钮:
文本:“返回”
尺寸提示:无
身高:20
按:app.root.current='MainScreen'
"""
类行(BoxLayout):
定义初始化(self,text,**kwargs):
超级(行,自).\uuuu初始值(**kwargs)
self.ids.text\u input.text=text
类行(BoxLayout):
数据=[]
def用_数据填充_(自身,dt):
对于self.data中的项目:
行=行(文本=str(项目))
self.add_小部件(行)
类主屏幕(屏幕):
通过
类数据开关(BoxLayout):
数据1=['1','2','3','4']
数据2=['5','6','7','8']
def显示_数据1(自身):
App.get_running_App().root.get_screen('ShowData').ids.rows.data=self.data1
def显示_数据2(自身):
App.get_running_App().root.get_screen('ShowData').ids.rows.data=self.data2
类别显示数据(屏幕):
休假前的def(自我):
self.ids.rows.clear_widgets()
sm=建筑商荷载(kv)
类TestApp(应用程序):
def生成(自):
返回sm
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
TestApp().run()
Button:
    text: 'Data 1'
    on_press: app.root.current = 'ShowData'
    on_press: root.show_data1()
Button:
    text: 'Data 2'
    on_press: app.root.current = 'ShowData'
    on_press: root.show_data2()
<ShowData>:
    name: 'ShowData'
    on_pre_enter:
        Clock.schedule_once(self.ids.rows.fill_with_data, 0.1)
    Rows:
        id: rows
def show_data1(self):
    App.get_running_app().root.get_screen('ShowData').ids.rows.data = self.data1

def show_data2(self):
    App.get_running_app().root.get_screen('ShowData').ids.rows.data = self.data2
from kivy.config import Config

Config.set('graphics', 'multisamples', '0')
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import Screen

kv = """
#:import FadeTransition kivy.uix.screenmanager.FadeTransition
#:import Clock kivy.clock.Clock

ScreenManager:
    MainScreen:
    ShowData:    

<DataSwitch>

    Button:
        text: 'Data 1'
        on_press: root.show_data1()
        on_press: app.root.current = 'ShowData'
    Button:
        text: 'Data 2'
        on_press: root.show_data2()
        on_press: app.root.current = 'ShowData'

<Row>:
    TextInput:
        id: text_input
        size_hint_y: None
        height: 30

<Rows>:   
    orientation: 'vertical'

<MainScreen>:
    name: 'MainScreen'
    DataSwitch:

<ShowData>:
    name: 'ShowData'
    on_pre_enter:
        Clock.schedule_once(self.ids.rows.fill_with_data, 0.1)
    Rows:
        id: rows
    Button:
        text: 'Go back'
        size_hint_y: None
        height: 20
        on_press: app.root.current = 'MainScreen'

"""


class Row(BoxLayout):

    def __init__(self, text, **kwargs):
        super(Row, self).__init__(**kwargs)
        self.ids.text_input.text = text


class Rows(BoxLayout):
    data = []

    def fill_with_data(self, dt):
        for item in self.data:
            row = Row(text=str(item))
            self.add_widget(row)


class MainScreen(Screen):
    pass


class DataSwitch(BoxLayout):
    data1 = ['1', '2', '3', '4']
    data2 = ['5', '6', '7', '8']

    def show_data1(self):
        App.get_running_app().root.get_screen('ShowData').ids.rows.data = self.data1

    def show_data2(self):
        App.get_running_app().root.get_screen('ShowData').ids.rows.data = self.data2


class ShowData(Screen):
    def on_pre_leave(self):
        self.ids.rows.clear_widgets()


sm = Builder.load_string(kv)


class TestApp(App):
    def build(self):
        return sm


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