如何将参数传递给屏幕类

时间:2019-02-24 00:08:59

标签: python-3.x class kivy

等效于

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

2 个答案:

答案 0 :(得分:1)

解决方案

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

示例

main.py

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 ScreenManager

答案 1 :(得分:0)

使用类时,这似乎是非常基本的东西,通常在__init__方法内部完成。那里有很多例子说明了它是如何工作的,所以我认为在这里更详细地说明这一点真的没有用。

以下是适合您情况的摘要:

class Account(Screen):
    def __init__(self, acc):        
        self.coord = somedict[acc]["coordinate_x"]

主要思想不是使coord成为类属性,而是使实例初始化期间分配的实例属性成为可能,因此对于同一类的每个实例而言,该属性可以是单独的。