在 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 文件,请假设有一些相同的问题和答案。
如果您希望所有 ToggleButtons
的 state
在打开问题时为 normal
,则添加代码以将它们的状态设置为 normal
openquestion()
方法。另请注意,只要单击 ToggleButton
,就会触发 on_press
。如果您希望操作取决于 state
是 down
还是 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):
在我的测验应用程序中,切换按钮用作从用户那里获取答案的选项。但是每当单击切换按钮时,下一个问题都处于 '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 文件,请假设有一些相同的问题和答案。
如果您希望所有 ToggleButtons
的 state
在打开问题时为 normal
,则添加代码以将它们的状态设置为 normal
openquestion()
方法。另请注意,只要单击 ToggleButton
,就会触发 on_press
。如果您希望操作取决于 state
是 down
还是 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):