首页 > 解决方案 > 如何将参数传递给屏幕类

问题描述

什么等价于这个

def name(first):
    print(first)

name(first = "hello")

以课堂形式?

我正在处理一个kivy screen(s)在循环中创建的脚本。由于屏幕不是硬编码的,而是从同一个类调用的,所以它们最终都是同一个屏幕。

我所拥有的是

class Account(Screen):
    coord = somedict["account_1"]["coordinate_x"]

for i in range(2):
    screenmanager.add_widget(Account())

我想做的是,

class Account(Screen, acc):
    coord = somedict[acc]["coordinate_x"]

for i in range(2):
    screenmanager.add_widget(Account(acc=str(i)))

标签: python-3.xclasskivy

解决方案


解决方案

  1. 在类级别定义一个 Kivy 属性,例如 StringProperty。
  2. 添加一个构造函数来接收参数并将其分配给该实例属性。

片段

class Account(Screen):
    coord = StringProperty('')

    def __init__(self, acc, **kwargs)
        super(Account, self).__init__(**kwargs)
        self.coord = somedict[acc]["coordinate_x"]

...

for i in range(2):
    screenmanager.add_widget(Account(acc=str(i)))

例子

主文件

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import StringProperty
from morsecode import morse

# Create both screens. Please note the root.manager.current: this is how
# you can control the ScreenManager from kv. Each screen has by default a
# property manager that gives you the instance of the ScreenManager used.
Builder.load_string("""
#:import choice random.choice
<MorseCode>:
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: root.code
        Button:
            text: 'Random Morsecode'
            on_release:
                root.manager.current = choice(root.manager.screen_names)
""")


class MorseCode(Screen):
    code = StringProperty('')

    def __init__(self, acc, **kwargs):
        super(MorseCode, self).__init__(**kwargs)
        self.code = morse[acc]


# Create the screen manager
sm = ScreenManager()

for i in range(1, 9):
    sm.add_widget(MorseCode(str(i), name='morsecode'+str(i)))


class TestApp(App):

    def build(self):
        return sm


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

输出

Kivy 屏幕管理器


推荐阅读