簡體   English   中英

Kivy在.py文件中選擇屏幕並在.kv文件中使用

[英]Kivy select screen in .py-file and use in .kv-file

我正在嘗試制作一個屏幕列表,並在此python文件中隨機選擇其中一個屏幕(此處未包括其他代碼,例如builder等):

class selectionScreen
    testScreen = StringProperty('Screen1')

    def screenSelector(self)
        screenList = ['Screen1', 'Screen2']
        testNumber = random.randint(0, 1)
        testScreen = screenList[testNumber]
        return testscreen

然后,我想在我的.kv文件中選擇此屏幕,該文件看起來有點像這樣,但還包括屏幕1和2

ScreenManager:
    SelectionScreen:
        name: 'SelectionScreen'
    Screen0:
        name: 'Screen0'
    Screen1:
        name: 'Screen1'

<SelectionScreen>:
     BoxLayout:
        Button:
            text: "Click when ready"
            size_hint: .6, .5
            font_size: 10
            on_press: root.screenSelector()
            on_release: root.manager.current = 'Screen0'
<Screen0>:
    BoxLayout:
        orientation: 'vertical'
        Button:
            text: "Next"
            on_release: root.manager.current = str(root.testScreen)

SelectionScreen運行正常,但現在無法到達screen0。 刪除線時

on_press: root.screenSelector()

但是,我可以這樣做。

預先感謝您的任何幫助!

問題

  1. 您無法到達screen0,因為它不在screenList中
  2. 在方法screenSelector中定義的變量testScreen是局部變量,它與在類selectionScreen中定義的類變量testScreen不同
  3. 未定義變量,由於輸入錯誤而返回 testscreen
  4. Screen0處 ,代碼on_release:root.manager.current = str(root.testScreen)將導致AttributeError:'Screen0'對象沒有屬性'testScreen'

為了到達Screen0,您必須執行以下操作:

Python腳本

  1. Screen0添加到變量screenList中
  2. random.randint(0,2)替換random.randint(0,1
  3. self.testScreen的方法screenSelector更換testScreen

KV文件

  1. 定義一個ID,例如ID:selection_screen
  2. 引用它,例如root.manager.ids.selection_screen.testScreen
  3. 在其他屏幕中將on_press調用添加到screenSelector ,例如on_press:root.manager.ids.selection_screen.screenSelector()

main.py

from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.properties import StringProperty
import random


class ScreenManager(ScreenManager):
    pass


class SelectionScreen(Screen):
    testScreen = StringProperty('Screen1')

    def screenSelector(self):
        screenList = ['Screen0', 'Screen1', 'Screen2']
        testNumber = random.randint(0, 2)
        self.testScreen = screenList[testNumber]
        return self.testScreen


class Screen0(Screen):
    pass


class Screen1(Screen):
    pass


class Screen2(Screen):
    pass


class Test(App):

    def build(self):
        return ScreenManager()


if __name__ == "__main__":
    Test().run()

測試文件

#:kivy 1.10.0

<ScreenManager>:
    SelectionScreen:
        id: selection_screen
        name: 'SelectionScreen'
    Screen0:
        name: 'Screen0'
    Screen1:
        name: 'Screen1'
    Screen2:
        name: 'Screen2'

<SelectionScreen>:
    BoxLayout:
        Button:
            text: "Click when ready"
            size_hint: .6, .5
            font_size: 10
            on_press: root.screenSelector()
            on_release:
                root.manager.current = str(root.manager.ids.selection_screen.testScreen)

<Screen0>:
    BoxLayout:
        orientation: 'vertical'
        Button:
            text: "Screen 0"
            on_press: root.manager.ids.selection_screen.screenSelector()
            on_release:
                root.manager.current = str(root.manager.ids.selection_screen.testScreen)

<Screen1>:
    BoxLayout:
        orientation: 'vertical'
        Button:
            text: "Screen 1"
            on_press: root.manager.ids.selection_screen.screenSelector()
            on_release:
                root.manager.current = str(root.manager.ids.selection_screen.testScreen)

<Screen2>:
    BoxLayout:
        orientation: 'vertical'
        Button:
            text: "Screen 2"
            on_press: root.manager.ids.selection_screen.screenSelector()
            on_release:
                root.manager.current = str(root.manager.ids.selection_screen.testScreen)

輸出量

Img01-應用啟動 Img02-屏幕2顯示 Img03-屏幕0顯示 Img04-屏幕1顯示 Img05-屏幕2顯示 Img06-屏幕0顯示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM