【问题标题】:how to pass arguments to screen class如何将参数传递给屏幕类
【发布时间】:2019-07-17 18:05:14
【问题描述】:

这个等价物是什么

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.x class kivy


    【解决方案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()
    

    输出

    【讨论】:

      【解决方案2】:

      在使用类时,这似乎是非常基本的东西,通常在 __init__ 方法中完成。有很多例子可以说明它是如何工作的,所以我认为在这里更详细地解释它并没有什么用处。

      这是一个适合您的情况的 sn-p:

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

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

      【讨论】:

      • 感谢您的回答。我已经尝试过了,问题是,我似乎无法在我的 .kv 文件中引用实例属性。例如,如果没有 init 函数,如果我想在我的 .kv 文件上设置等于 coord 的文本,我会做 text: root.coord 但在 init 下分配 coord 时,我得到一个属性错误。
      • 一个更好的问题是,如何在 init 函数之外使用acc 属性?
      猜你喜欢
      • 2022-08-21
      • 2022-11-27
      • 1970-01-01
      • 2013-07-27
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      相关资源
      最近更新 更多