如何多次运行一个函数,但指令列表只运行一次?

问题描述 投票:-1回答:1

我做了一个有几个按钮的程序,我希望当我多次按下按钮时,指令列表只启动一次。

我试着用全局变量来实现,但是当我想在两个屏幕上使用同一个变量时,我做不到。

我知道我可以用两个全局变量来做,但我想在两个屏幕上使用同一个变量。

如何,当我们到第二个屏幕时,u取值为 "True"?还是有一个更简单的解决方案,用一个装饰器?

这是我的代码。

import kivy
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
import random
from kivy.properties import ObjectProperty
from kivy.properties import ListProperty, StringProperty
kivy.uix.screenmanager.FadeTransition


kv = """

#: import NoTransition kivy.uix.screenmanager.NoTransition     
#:import Clock kivy.clock.Clock
#: import FadeTransition kivy.uix.screenmanager.FadeTransition
#: import RiseInTransition kivy.uix.screenmanager.RiseInTransition
#: import CardTransition kivy.uix.screenmanager.CardTransition

MyScreenManager:
    transition: RiseInTransition()
    Question1:
        name: "question1"
    Question2:
        name: "question2"


<Question1>:

    label_wid : ratio

    FloatLayout:

        Button:
            text: "+1"
            pos: 270, 300
            size_hint: .30, .10
            background_color: 0,1,0,0.75
            on_press:
                root.mauvais()
        Button:
            text: "following"
            pos: 270, 240
            size_hint: .30, .10
            background_color: 0,1,0,0.75
            on_press: 
                Clock.schedule_once(root.suite, 0.75)

        Label:
            id: ratio
            text: root.manager.theText 
            pos: 280,270
            font_size: 17
            color: 0,0,1,0.65

<Question2>:
    label_wid2: ratio
    FloatLayout:
        Button:
            text: "+1"
            pos: 270, 300
            size_hint: .30, .10
            background_color: 0,1,0,0.75
            on_press:
                root.mauvais()

        Label:
            id: ratio
            text: root.manager.theText
            pos: 280,270
            font_size: 17
            color: 0,0,1,0.65


"""

t=0 
m=True



class MyScreenManager(ScreenManager):
    theText = StringProperty('')  


class Question1(Screen):

    m= True
    def mauvais(self):
        global m
        if  m==True:
            global t
            t=t+1
            self.manager.theText = str(t)
            m=False        

    def suite(root,text):
        root.manager.current = "question2"

    pass 

class Question2(Screen):    

    global m
    m= True
    def mauvais(self):
        global m
        if  m==True:
            global t
            t=t+1
            self.manager.theText = t
            m=False     
    pass



class Quizz(App):
    def build(self):
        self.title = 'Quizz'
        Window.clearcolor = (0, 1, 1, 0.25)

        return Builder.load_string(kv)


if __name__ == '__main__':
    Quizz().run()

python python-3.x kivy kivy-language
1个回答
0
投票

所以,既然我的问题没有得到答案,我有一个建议的解决方案,可以实现两种可能性。

import kivy
from kivy.app import App
from kivy.clock import Clock
from kivy.uix.button import Button
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import StringProperty, BooleanProperty, NumericProperty
kivy.uix.screenmanager.FadeTransition


kv = """

#: import NoTransition kivy.uix.screenmanager.NoTransition     
#:import Clock kivy.clock.Clock
#: import FadeTransition kivy.uix.screenmanager.FadeTransition
#: import RiseInTransition kivy.uix.screenmanager.RiseInTransition
#: import CardTransition kivy.uix.screenmanager.CardTransition

MyScreenManager:
    transition: RiseInTransition()
    Question1:
        name: "question1"
    Question2:
        name: "question2"


<Question1>:

    label_wid : ratio

    FloatLayout:

        Button:
            text: "+1"
            pos: 270, 300
            size_hint: .30, .10
            background_color: 0,1,0,0.75
            on_press:
                root.manager.mauvais()  # method is now in MyScreenManager
        Button:
            text: "following"
            pos: 270, 240
            size_hint: .30, .10
            background_color: 0,1,0,0.75
            on_press: 
                Clock.schedule_once(root.suite, 0.75)

        Label:
            id: ratio
            text: root.manager.theText
            pos: 280,270
            font_size: 17
            color: 0,0,1,0.65

<Question2>:
    label_wid2: ratio
    FloatLayout:
        Button:
            text: "+1"
            pos: 270, 300
            size_hint: .30, .10
            background_color: 0,1,0,0.75
            on_press:
                root.manager.mauvais()  # method is now in MyScreenManager

        Label:
            id: ratio
            text: root.manager.theText
            pos: 280,270
            font_size: 17
            color: 0,0,1,0.65
"""

#  time to ignore additional clicks
#  if this is zero, ignore all additional clicks
CLICK_IGNORE_TIME = 3

class MyScreenManager(ScreenManager):
    theText = StringProperty('')
    m = BooleanProperty(True)
    t = NumericProperty(0)

    def mauvais(self):
        if  self.m==True:
            self.t += 1
            self.theText = str(self.t)
            self.m=False
            if CLICK_IGNORE_TIME > 0:
                Clock.schedule_once(self.reset_m, CLICK_IGNORE_TIME)
        else:
            print('ignored click')

    def reset_m(self, dt):
        print('reset m')
        self.m = True


class Question1(Screen):
    def suite(root,text):
        root.manager.current = "question2"


class Question2(Screen):
    pass


class Quizz(App):
    def build(self):
        self.title = 'Quizz'
        Window.clearcolor = (0, 1, 1, 0.25)

        return Builder.load_string(kv)


if __name__ == '__main__':
    Quizz().run()

这段代码可以移动... mauvais() 的方法。MyScreenManager 类,因为这两个版本是相同的。

的,因为两个版本都是相同的。CLICK_IGNORE_TIME 是忽略额外点击的时间。如果为零,所有额外的点击都将被忽略。

© www.soinside.com 2019 - 2024. All rights reserved.