python kivy特效大全_屏幕上的Kivy参考

这篇博客探讨了在 Kivy 框架中如何在不同屏幕间切换,并实现屏幕间的 Widget 引用。作者展示了如何通过 ScreenManager 和 kv 语言创建多个屏幕,并尝试在屏幕之间建立引用,以便从一个屏幕的按钮更新另一个屏幕的文本。主要问题是如何正确设置引用,使得‘更改上面的文本…’按钮能够获取并修改‘widgets 之间的引用测试’的文本。
摘要由CSDN通过智能技术生成

我想从其他rootwidgets访问根widgets id,但是我似乎不能完全理解Kivy中引用的工作原理,而且使用不同屏幕的屏幕管理器会让我更加困难。在

我想实现以下目标:

编辑:单文件版本

(这段代码假设您要构建一个复杂的应用程序,所以我不想在启动时加载所有代码。因此,在切换屏幕时,kv_串被加载,而不是放入屏幕管理器的kv代码中。代码基于Kivy Showcase。)

代码主.py,编辑2:工作代码(参见答案为什么)#!/usr/bin/kivy

# -*- coding: utf-8 -*-

from kivy.app import App

from kivy.uix.screenmanager import Screen

from kivy.uix.boxlayout import BoxLayout

from kivy.lang import Builder

from kivy.clock import Clock

from kivy.properties import StringProperty, ObjectProperty

kv_foo = '''

:

id: fooscreen_id

BoxLayout:

id: content

orientation: 'vertical'

spacing: '20dp'

padding: '8dp'

size_hint: (1, 1)

BoxLayout:

orientation: 'vertical'

Label:

id: important_text

size_hint_y: 0.3

text: app.imp_text

Button:

id: magic_change

size_hint_y: 0.3

text: "Change text above to text below (after screen switch)"

on_press: app.change_text()

ScreenManager:

id: sm

on_current_screen:

idx = app.screen_names.index(args[1].name)

'''

class FooScreen(Screen):

# 'content' refers to the id of the BoxLayout in FooScreen in foo.kv

def add_widget(self, *args):

if 'content' in self.ids:

return self.ids.content.add_widget(*args)

return super(FooScreen, self).add_widget(*args)

class FooApp(App):

imp_text = StringProperty("Should change to text from id: magic_text")

screen_magic = ObjectProperty()

magic_layout = ObjectProperty()

def build(self):

self.title = 'Foo'

self.root = root = Builder.load_string(kv_foo)

# Trying stuff with References

self.sm = self.root.ids.sm # ScreenManager

# Setting up screens for screen manager

self.screens = {}

self.available_screens = [kv_mainmenu, kv_magic]

self.screen_names = ['MainMenu', 'Magic']

self.go_screen(0)

# Go to other screen

def go_screen(self, idx):

print("Change MainScreen to: {}".format(idx))

self.index = idx

# Go to not main menu

if idx == 0:

self.root.ids.sm.switch_to(self.load_screen(idx), direction='right')

# Go to main menu

else:

self.root.ids.sm.switch_to(self.load_screen(idx), direction='left')

# Load kv files

def load_screen(self, index):

if index in self.screens:

return self.screens[index]

screen = Builder.load_string(self.available_screens[index])

self.screens[index] = screen

# if index refers to 'Magic' (kv_magic), create reference

if index == 1:

Clock.schedule_once(lambda dt: self.create_reference())

return screen

# Trying to get id's

def create_reference(self):

print("\nrefs:")

# Get screen from ScreenManager

self.screen_magic = self.sm.get_screen(self.screen_names[1])

# screen.boxlayout.magiclayout

self.magic_layout = self.screen_magic.children[0].children[0]

def change_text(self):

# Get text from id: magic_text

if self.magic_layout:

self.imp_text = self.magic_layout.ids['magic_text'].text

kv_mainmenu = '''

FooScreen:

id: mainm

name: 'MainMenu'

Button:

text: 'Magic'

on_release: app.go_screen(1)

'''

kv_magic = '''

id: magic_layout

orientation: 'vertical'

Label:

id: magic_text

text: root.m_text

FooScreen:

id: magic_screen

name: 'Magic'

MagicLayout:

id: testmagic

'''

class MagicLayout(BoxLayout):

m_text = StringProperty("Reference between widgets test")

if __name__ == '__main__':

FooApp().run()

问题

如何设置适当的引用,使按钮“更改上面的文本…”可以检索magic_text.text(“widgets之间的引用测试”)并将self.imp_text更改为{}?在

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值