Kivy – 改变布局

2024-09-23 00:18:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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脚本是

^{pr2}$

我选择了一个选项(在本例中是人类)。它应该等到我单击Next之后再显示结果。但是,只要我选择了Human,它就会立即在GridLayout中打印结果。我想到了两个问题,我希望这里的专家能帮上忙:

1)为什么选择屏幕没有等到我单击“下一步”之后才显示结果? 2) 当我显示第二个屏幕时,如何将布局从网格交换到方框?在

如有任何建议或建议,我们将不胜感激。在

谨致问候, 科林


Tags: textfromimportselfmyscmwidgetprint
1条回答
网友
1楼 · 发布于 2024-09-23 00:18:19

当复选框处于活动状态(按下/选中)时,复选框将调用Test.human(*args),而Test.human()的最后一行调用Test.printcharacter(),这解释了为什么在您单击“下一步”按钮之前打印它。在

由于您的Test类从GridLayout继承,您添加到根Test布局的小部件将像添加到GridLayout一样被添加。有几种方法可以处理将布局切换到BoxLayout,其中之一是不直接从特定布局类继承,而是根据需要向Test添加/删除不同的布局小部件。在

例如,Test可以从GridLayout子小部件开始,它是LabelCheckBox和{}小部件的父部件。然后,当您想切换打印结果的布局时,您可以清除这些小部件,并通过在Test中添加BoxLayout开始。在

相关问题 更多 >