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()