我是Python和Kivy的新手。在取得一些进展后,我遇到了一堵砖墙,没有多少互联网搜索可以找到答案。
我有一个python / kivy脚本,它以GridLayout选择菜单开头。然后我想“单击下一步”并用BoxLayout替换GridLayout以显示输出。 Python脚本是:
import sys
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.checkbox import CheckBox
from kivy.uix.gridlayout import GridLayout
from kivy.uix.pagelayout import PageLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.properties import StringProperty, ListProperty, DictProperty
from kivy.uix.widget import Widget
from brp_stats import *
from dice_roller import *
#from display import *
race = ''
statblock = ''
class Test(GridLayout):
def printcharacter(self,my_sb,my_cr,my_scm,my_scb):
printable_stats = print_stats(my_sb)
printable_rolls = print_rolls(my_cr)
printable_scm = print_scm(my_scm)
printable_scb = print_scb(my_scb)
self.clear_widgets()
self.add_widget(Label(text_size=(300, None),
text='Stats\n' + str(printable_stats)))
self.add_widget(Label(text_size=(300, None),
text='Rolls\n' + str(printable_rolls)))
self.add_widget(Label(text_size=(300, None),
text='SCM\n' + str(printable_scm)))
self.add_widget(Label(text_size=(300, None),
text='SCB\n' + str(printable_scb)))
wayout = Button(text='Way Out')
self.add_widget(wayout)
wayout.bind(on_press=self.canvas.clear)
# def bar():
# print ("BAR")
def human(self,a,b):
if b==True:
self.Status="human"
race=self.Status
statblock = human()
characteristic_rolls = rolls(statblock)
skill_category_modifiers = scm(statblock)
skill_category_bonuses = scb(statblock)
# TestApp.foo()
# Test.bar()
Test.printcharacter( \ self,statblock,characteristic_rolls,skill_category_modifiers,skill_category_bonuses)
class TestApp(App):
# def foo():
# print ("FOO")
def build(self):
self.title="BRP Character Generator"
return Test()
#### MAIN CODE ####
if __name__ == '__main__':
TestApp().run()
KV脚本是
<Test>:
cols: 2
canvas:
Color:
rgb: .2,.2,.2
Rectangle:
pos: self.pos
size: self.size
Label:
text: 'Human'
CheckBox:
group: 'race_group'
on_active: root.human(*args)
Button:
text: 'Next'
on_press: printcharacter()
我发生的事情是选择一个选项(本例中为Human)。它应该等到我在显示结果之前单击Next。但是,只要我选择Human,它就会立即在GridLayout中打印结果。我想到两个问题,我希望这里的专家可以提供帮助:
1)为什么选择屏幕不等到我在显示结果之前点击了下一步? 2)当我显示第二个屏幕时,如何将布局从Grid换成Box?
我们将非常感激地收到任何指示或建议。
此致 科林
答案 0 :(得分:0)
当您的复选框处于活动状态(已按下/已选中)时会调用Test.human(*args)
,并且Test.human()
调用Test.printcharacter()
的最后一行会在您点击“下一步”之前解释其打印原因按钮。
由于您的Test
类继承自GridLayout
,因此您添加到根Test
布局的小部件将被添加为GridLayout。有几种方法可以处理将布局切换到BoxLayout
,其中一种方法是不直接从特定的布局类继承,而是根据需要添加/删除不同的布局小部件到Test
。
例如,Test
可以从GridLayout
子窗口小部件开始,该窗口小部件是Label
,CheckBox
和Button
窗口小部件的父级。然后,当您想要切换布局以打印结果时,清除这些小部件并首先向BoxLayout
添加Test
。