问题描述
我在 TokenScreen 中有一个字段,在 ListScreen 中有一个 MDList。问题是,我找不到从 TokenScreen 字段中获取值并将其传递给 ListScreen 类的方法,以便用小部件填充容器。我尝试使用 init ,但这是不可能的。
它应该从 MDField 获取文本值并将其传递给 g = Github(TOKEN)
py 文件:
class passVarClass():
def __init__(self):
self.tokenPassVar = ""
class MainApp(MDApp):
screen = Screen()
def build(self):
self.theme_cls.primary_palette = 'Blue'
screen = Builder.load_file('layout.kv')
return screen
def set_screen(self,screen):
self.root.current = screen
print("switching screen to tokenscreen")
class TokenScreen(Screen):
def on_pre_leave(self,*args):
objectPass = passVarClass()
objectPass.tokenPassVar = self.ids.tokenFieldID.text
print(objectPass.tokenPassVar + "test_tokenClass")
# pass
class ListScreen(Screen):
def on_pre_enter(self,*args):
objectPass = passVarClass()
g = Github(objectPass.tokenPassVar)
user = g.get_user()
repos = user.get_repos()
for x in repos:
if x.language is not None:
self.ids.container.add_widget(
TwoLineListItem(text=x.name,secondary_text=x.language)
)
pass
class RepoScreen(Screen):
pass
sm = ScreenManager()
sm.add_widget(TokenScreen(name='tokenscreen'))
sm.add_widget(ListScreen(name='listscreen'))
sm.add_widget(RepoScreen(name='reposcreen'))
if __name__ == '__main__':
MainApp().run()
kv 文件:
ScreenManager:
id:scr_mngr
TokenScreen:
ListScreen:
RepoScreen:
<TokenScreen>:
id:tokenscreenID
name:'tokenscreen'
MDToolbar:
id:toolbarID
title:"TokenScreen"
md_bg_color: app.theme_cls.primary_color
elevation : 10
left_action_items : [["arrow-left",lambda x: x]]
pos_hint:{"top":1}
MDTextFieldRound:
id:tokenFieldID
name:"tokenFieldName"
hint_text:"token"
mode:"rectangle"
pos_hint: {'center_x':0.5,'center_y':0.6}
size_hint_x:None
width:250
MDRectangleFlatButton:
text:"test"
pos_hint:{'center_x':0.5,'center_y':0.5}
on_press: root.manager.current = 'listscreen'
on_press:print("Switching to listscreen")
<ListScreen>:
id:listScreenID
name:'listscreen'
BoxLayout:
orientation: 'vertical'
MDToolbar:
id:toolbarID
title:"ListScreen"
md_bg_color: app.theme_cls.primary_color
elevation : 10
left_action_items : [["arrow-left",lambda x: app.set_screen("tokenscreen")]]
pos_hint:{"top":1}
ScrollView:
y: -toolbarID.height
MDList:
id:container
<RepoScreen>:
id:repoScreenID
name:'reposcreen'
解决方法
您必须定义一个属性。首先阅读此来源:
https://kivy.org/doc/stable/api-kivy.properties.html
这是一个简单的属性定义示例:
.kv
Manager:
mgr: sc_mgr
Main:
id: sc_mgr
About:
<MyPaintWidget>:
on_touch_down: self.on_touch_down
on_touch_move: self.on_touch_move
<Main>:
name: "main"
draw: main_draw
BoxLayout:
orientation: "vertical"
MyPaintWidget:
id: main_draw
size_hint: 1,0.9
GridLayout:
size_hint: 1,0.1
cols: 3
padding: 10
Button:
text: "About"
on_press:
root.manager.current= "about"
root.manager.transition.direction= "left"
Label:
Button:
text: "Clear"
on_release: app.root.cleaner()
<About>:
name: "about"
BoxLayout:
orientation: "vertical"
padding: 10
Label:
size_hint: 1,0.9
text: "This is a test app."
Button:
size_hint: 1,0.9
text:"Back to Main"
on_press:
root.manager.current= "main"
root.manager.transition.direction= "right"
.py
from random import random
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Ellipse,Color,Line
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.lang import Builder
from kivy.properties import ObjectProperty
class Main(Screen):
draw = ObjectProperty(None)
class About(Screen):
pass
class Manager(ScreenManager):
mgr = ObjectProperty(None)
def cleaner(self):
self.mgr.draw.clean()
class MyPaintWidget(Widget):
def clean(self):
self.canvas.clear()
def on_touch_down(self,touch):
# self.rect.pos = touch.pos
color = (random(),random(),random())
with self.canvas:
Color(*color)
Ellipse(pos=(touch.x,touch.y),size=(20,20))
touch.ud['line'] = Line(points=(touch.x,touch.y))
def on_touch_move(self,touch):
# self.rect.pos = touch.pos
touch.ud['line'].points += [touch.x,touch.y]
main_style = Builder.load_file("ms_paint.kv")
class MyPaintApp(App):
def build(self):
return main_style
if __name__ == '__main__':
MyPaintApp().run()