Python kivy 在 kivy 中重写 python 的问题

Python kivy Problems with rewriting python in kivy

我在用 kivy 格式重写 python 代码时遇到了一些问题

这里是class“设置”,它有改变屏幕的方法。

class SettingsMenu(Screen):
def on_touch_down(self, touch):
    if touch.button == 'right':
        self.parent.transition.direction = "right"
        self.parent.transition.duration = 0.6
        self.parent.current = "MainMenu"

我想用这种方式(或类似的方式)用 kivy 重写它:

<SettingsMenu>
name: "SettingsMenu"
on_touch_down:
    if button == "right":
        root.parent.transition.direction = "right"
        root.parent.transition.duration = 0.6
        root.parent.current = "MainMenu"

如何正确操作?

(编辑)这是完整的代码。我只是创建了两个屏幕,当我们在 SettingsMenu 屏幕上时,我想用 鼠标右键

切换回 MainMenu 屏幕

(在 SettingsMenu python class 中评论 on_touch_down 工作正常,但是当我尝试以 kivy 方式制作它时,我用任何鼠标按钮切换屏幕,但需要的是鼠标右键)

Python:

from kivy.app import App
from kivy.lang import Builder

from kivy.uix.screenmanager import ScreenManager, Screen

from kivy.config import Config

Config.set('input', 'mouse', 'mouse,multitouch_on_demand')


class MainMenu(Screen):
    pass

class SettingsMenu(Screen):
    pass
    # def on_touch_down(self, touch):
    #     if touch.button == 'right':
    #         self.parent.transition.direction = "right"
    #         self.parent.transition.duration = 0.6
    #         self.parent.current = "MainMenu"


class MenuManager(ScreenManager):
    pass


main_kv = Builder.load_file("test.kv")


class THEApp(App):
    def build(self):
        return main_kv


THEApp().run()

这是 Kivy 文件(在复制粘贴过程中缩进可能会被破坏,但语法没有问题):

MenuManager:
   MainMenu:
   SettingsMenu:

<MainMenu>
    name: "MainMenu"
    FloatLayout:
        size: root.width, root.height
    Button:
        text: "Button 1 on Main Menu Screen"
        on_release:
            root.manager.transition.direction = 'left'
            root.manager.transition.duration = 0.6
            root.manager.current = "SettingsMenu"
<SettingsMenu>
    name: "SettingsMenu"
    button: "right"
    on_touch_down:
        if root.button == "right": \
        root.parent.transition.direction = "right"; \
        root.parent.transition.duration = 0.6; \
        root.parent.current = "MainMenu"
    FloatLayout:
        size: root.width, root.height
        Label:
            text: "Label 1 on SettingsMenu"

您可以对 kv 文件中的 on_touch_down: 属性执行 python code/logic,但这有点愚蠢。我认为您的 kv 文件将像这样工作:

<SettingsMenu>
    name: "SettingsMenu"
    on_touch_down:
        if args[1].button == "right": \
        root.parent.transition.direction = "right"; \
        root.parent.transition.duration = 0.6; \
        root.parent.current = "MainMenu"

kivy 语言中,您可以访问 on_<action> 方法的 args(参见 documentation)。所以上面的代码检查 touch 参数的 button 属性。

注意 kv 文件中的 if 语句必须在一行上。这就是 \ 字符(转义尾行)和 ;(分隔代码行)的原因。