在 kivy 中使用切换按钮进行测验时遇到问题

Trouble using toggle button for quiz in kivy

在我的测验应用程序中,切换按钮用作从用户那里获取答案的选项。但是每当单击切换按钮时,下一个问题都处于 'down' 状态,但是每当我取消单击该按钮时,下一个问题就会出现,而我却没有回答那个问题。 我希望每当出现新问题时,所有切换按钮的状态都应为 'normal'。 这是主文件的代码:

import json
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App

a=0
score=0
sca=0
class MyLayout(BoxLayout):
    global data
    f=open('questions.json')
    data=json.load(f)
  
    def openquestion(self):
        global a
        try:
            self.ids.ques.text=data['category1']['question'][a]   
            self.ids.opt1.text=data['category1']['options'][a][0]
            self.ids.opt2.text=data['category1']['options'][a][1]
            self.ids.opt3.text=data['category1']['options'][a][2]
            self.ids.opt4.text=data['category1']['options'][a][3]
            a+=1
        except:
            print('all questions completed')

    
    def checkscore(self,bu_id):
        global score
        global sca
        answer=data['category1']['answer'][sca]
        if(bu_id==answer):
            score+=1
        print('score: ',score,'question: ',sca+1,'button pressed: ',bu_id,'answer no:',answer)
        sca+=1

class rough(App):
    def build(self):
        return MyLayout()

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

这是 .kv 文件:

#:kivy 2.1.0
<QLabel@Label>:
    halign:'center'
    text_size:self.width,None
<ToggleButton>:
    size:0.6,0.4
<MyLayout>:
    orientation:'vertical'
    size:root.width,root.height
    padding:20
    spacing:10
    BoxLayout:
        orientation:'vertical'
        size:root.width,root.height
        padding:20
        spacing:10
        BoxLayout:
            id:options
            orientation:'vertical'
            spacing:7
            QLabel:
                id:ques
                text:'Questions coming soon...'
            ToggleButton:
                group:options
                id:opt1
                text:'option01'
                on_press:
                    root.checkscore(1)
                    root.openquestion()

            ToggleButton:
                group:options
                id:opt2
                text:'option02'
                on_press:
                    root.checkscore(2)
                    root.openquestion()

            ToggleButton:
                group:options
                id:opt3
                text:'option03'
                on_press:
                    root.checkscore(3)
                    root.openquestion()

            ToggleButton:
                group:options
                id:opt4
                text:'option04'
                on_press:
                    root.openquestion()
                    root.checkscore(4)

            GridLayout:
                cols:2
                spacing:30
                Button:
                    text:'Next'
                    on_release:
                        root.openquestion()
                Button:
                    text:'Exit'
                    on_release:
                        exit()

我认为不需要 JSON 文件,请假设有一些相同的问题和答案。

如果您希望所有 ToggleButtonsstate 在打开问题时为 normal,则添加代码以将它们的状态设置为 normal openquestion() 方法。另请注意,只要单击 ToggleButton,就会触发 on_press。如果您希望操作取决于 statedown 还是 normal,那么您需要将该逻辑放入触发的代码中。因此,在您的 openquestion() 方法中,您可以为每个 ToggleButton 添加一行,例如:

self.ids.opt1.state = 'normal'

然后从 ToggleButtons 的每个 on_press: 中删除 root.openquestion()

然后可以将打开新问题的逻辑添加到 checkscore() 方法中。类似于:

def checkscore(self, bu_id):
    global score
    global sca
    answer = data['category1']['answer'][sca]
    if (bu_id == answer):
        score += 1
    print('score: ', score, 'question: ', sca + 1, 'button pressed: ', bu_id, 'answer no:', answer)
    sca += 1
    Clock.schedule_once(self.openquestion, 1)

我使用 Clock.schedule_once() 添加了延迟,以便用户会注意到更改。您还可以添加 Popup 或其他内容来通知用户问题是否已正确回答。使用 Clock.schedule_once() 需要对 openquestion() 签名进行小的更改:

def openquestion(self, *args):