繁体   English   中英

如何从不同的屏幕访问 kivy python 类中的值?

[英]How to access values in kivy python classes from different screens?

我有以下基本的 python 文件,它使用一个数字并返回数字 * 10。

class SomeOperation:
    
    def __init__(self, input_num=100):
        self.input_num = input_num
    
    def do_something(self):
        print(self.input_num * 10)
        return self.input_num * 10

if __name__ == '__main__':
    q = SomeOperation()
    q.do_something()

我想在以下应用程序的PlaySetUp屏幕中调用此脚本。 这里的 slider 将确定input_num并且还有一个播放按钮,可以将我带到应用程序的PlayScreen

from kivy.app import App

from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.slider import Slider
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen

from someoperation import SomeOperation

class WindowManager(ScreenManager):
    def __init__(self, **kwargs):
        super(WindowManager, self).__init__(**kwargs)

class MainWindow(Screen):
    def __init__(self, **kwargs):
        super(MainWindow, self).__init__(**kwargs)

class PlaySetUp(Screen):
    def __init__(self, *args, **kwargs):
        super(PlaySetUp, self).__init__(*args, **kwargs)
        
class PlayScreen(Screen, SomeOperation):
    def __init__(self, *args, **kwargs):
        super(PlayScreen, self).__init__(*args, **kwargs)

class NumberSelection(BoxLayout):
     
    def __init__(self, *args, **kwargs):
        super(NumberSelection, self).__init__(*args, **kwargs)
        self.orientation = 'vertical'
        self.input_num = 10
        
        self.input_num_value = Label(text='10')
        self.add_widget(self.input_num_value)
        
        self.number_slider = Slider(min=10, max=100, step=10)
        self.number_slider.bind(value = self.on_value)        
        self.add_widget(self.number_slider)

    def on_value(self, widget, value):
        self.input_num = value
        self.input_num_value.text = str(value)

kv = Builder.load_file('sample.kv')

class SomeApp(App):
    def __init__(self, **kwargs):
        super(SomeApp, self).__init__(**kwargs)
    
    def build(self):
        return kv

.kv 文件:

WindowManager:
    MainWindow:
    PlaySetUp:
    PlayScreen:
        id: play_screen

<MainWindow>:
    name: "main"
    BoxLayout:
        orientation: "vertical"
        Button:
            text: "Play"
            on_release: 
                app.root.current = "play_set_up"
                root.manager.transition.direction = "left"

<PlaySetUp>:
    name: "play_set_up"
    BoxLayout:
        orientation: "vertical"
        NumberSelection:
        Button:
            text: "Go!"
            on_release: 
                app.root.current = "play_screen"
                root.manager.transition.direction = "left"
        Button:
            text: "Back!"
            on_release: 
                app.root.current = "main"
                root.manager.transition.direction = "right"        
        
                
<PlayScreen>:
    name: "play_screen"
    BoxLayout:
        orientation: "vertical"
        Label:
            text: #TODO: show the output of SomeOperation
        Button:
            text: "Run"
            on_release: #TODO: re-run SomeOperation with same set up as in the PlaySetUp screen
        Button:
            text: "Back!"
            on_release: 
                app.root.current = "play_set_up"
                root.manager.transition.direction = "right"  

我想在PlayScreen中自动运行SomeOperation脚本,并且每次按下Run按钮时都重新运行它。 结果应该总是相同的,除非我按下back按钮并在PlaySetUp屏幕中更改 slider 值。

提前致谢!

发现可以在App的build function中设置变量名。

class SomeApp(App):
    def __init__(self, **kwargs):
        super(SomeApp, self).__init__(**kwargs)
        
    def build(self):
        self.my_int = None
        return kv

然后 slider 的 function 可以设置值:

def on_value(self, widget, value):
    self.input_num = value
    self.input_num_value.text = str(value)
    App.get_running_app().my_int = value

这样所有其他函数都可以随后调用这个新值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM