python - 如何从另一个屏幕获取字段值?
问题描述
我在 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()
推荐阅读
- reactjs - 参数问题
- javascript - 我在 JavaScript 中创建了一个时钟类,但导入时它无法正常工作。我只能得到秒数,而且间隔似乎也不起作用
- python - tkinter - 取消停靠框架并处理窗口关闭事件
- c++ - C++;有没有办法让我的 Switch 功能同时拒绝有效和无效的答案?
- python - 向 CVRP 中的弧添加约束
- c# - 在 Winform 中的 Web 查看器中为 XSLT 模板中的 href 分配可访问名称
- sql - 带有空格和分隔符的正则表达式
- java - 如何在页面上显示包含数据库内容的表格?rest ajax spring boot 应用程序
- flutter - List.generate 中的 Flutter RadioListTile 不起作用
- reactjs - 你如何在 React 中订阅 Recurly.js 结帐定价事件?