我试图将代码.py转录为.py-.kv,但尝试失败,我最大的收获是看屏幕和组件,但没有执行我所需的基本功能。我已经在互联网上搜索了数周,但发现对我没有帮助,感谢您对将代码投入使用的支持。
原始代码来自此网站(代码#7“复选框列表”的示例):
https://www.reddit.com/r/kivy/wiki/snippets#wiki_checkbox_list
在控件中显示的是带有功能“ on_press”的四个“ TextCheckBox”:
“请选择。”
“您选择了:软件”(如果您仅选择一项)
“您选择了:软件,硬件”(如果同时选择了两个项目)
我澄清说,Ninja IDE不接受.py和.kv中使用的原始代码的“活动”一词,因此我不得不将其更改为“ on_press”一词。
我只设法看到了Widget,我可以在两个TextCheckBox中进行选择,但是无法显示所选内容。
Código.py:
from kivy.app import App
from kivy.lang import Builder
from kivy.clock import Clock
from kivy.factory import Factory
Builder.load_file('ejemplo.kv')
class CheckBoxList(Factory.BoxLayout):
values = Factory.ListProperty()
def __init__(self, **kwargs):
self._trigger = Clock.create_trigger(self._do_update)
super(CheckBoxList, self).__init__(**kwargs)
self.bind(x=self._trigger, y=self._trigger)
def add_widget(self, widget, index=0):
super(CheckBoxList, self).add_widget(widget, index=index)
widget.bind(on_press=self._trigger)
def remove_widget(self, widget):
super(CheckBoxList, self).remove_widget(widget)
widget.unbind(on_press=self._trigger)
def _do_update(self, *largs):
self.values = [tcb.text for tcb in self.children if tcb.on_press]
class TextCheckBox(Factory.ButtonBehavior, Factory.BoxLayout):
text = Factory.StringProperty()
on_press = Factory.BooleanProperty(False)
class MyApp(App):
def build(self):
return CheckBoxList()
if __name__ == '__main__':
MyApp().run()
...........................
código.kv:
<CheckBoxList>:
id: cblist
TextCheckBox:
text: 'Software'
TextCheckBox:
text: 'Hardware'
BoxLayout:
orientation: 'horizontal'
width: 500
size_hint: None, None
pos_hint:{'center_x':.1,'center_y':.50}
Label:
text: cblist.values and 'You Selected: {}'.format( ', '.join(cblist.values)) or 'Please make selection.'
<TextCheckBox>:
orientation: 'horizontal'
on_press: cb.on_press
on_press: root.on_press= not root.on_press
CheckBox:
id: cb
on_press: root.on_press
Label:
id: lbl
text: root.text
预期结果是.py-.kv代码显示了从一个或两个TextCheckBox选项进行的选择。
答案 0 :(得分:0)
目前我还没有收到关于此问题的答案,但是我找到了另一种可能的解决方案,尽管它是一个很好的局部解决方案,但是它是所需代码的一部分。
我有两个屏幕:在“ MainScreen”中,有一个直接指向“ Screen2”的按钮,我已经可以在其中选择四个“ CheckBox”中的一个或几个选项,然后将按钮按到“选择“ Aceptar”,然后立即将其打印在同一屏幕上,然后按第二个按钮“ Volver”返回到初始屏幕“ MainScreen”。
缺少的是在第一个“ MainScreen”中所做的选择也被更新。
我已经搜索了好几个星期,但我找到并实现的所有代码对我来说都不起作用;按班级父母和孩子之间的属性,我总是遇到错误问题。
如果我没有得到答案,我想我将尝试在一个类中实现我的项目,并将功能集中于.kv文件,以便能够执行我需要的操作,而不会使之间的属性访问权限变得复杂课程。
接下来,我将分享我已经编写的.py和.kv代码,并已经对他们进行了评论,以便他们在个人计算机中进行验证,以防有人输入可能的解决方案。
非常感谢您。
.py
from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.properties import StringProperty
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import ScreenManager
Window.size = (600, 325)
class MainScreen(Screen):
manager = ObjectProperty(None)
def __init__(self, *args, **kwargs):
super(MainScreen, self).__init__(*args, **kwargs)
def on_pre_enter(self):
Window.size = (600, 400)
class Screen2(Screen):
def __init__(self, *args, **kwargs):
super(Screen2, self).__init__(**kwargs)
def on_pre_enter(self):
Window.size = (380, 280)
gender1 = StringProperty("")
gender2 = StringProperty("")
gender3 = StringProperty("")
gender4 = StringProperty("")
gender5 = StringProperty("")
def insert_data(self):
print("Gender1={}".format(self.gender1))
print("Gender2={}".format(self.gender2))
print("Gender3={}".format(self.gender3))
print("Gender4={}".format(self.gender4))
self.ids['label_9'].text = format(self.gender1)
self.ids['label_10'].text = format(self.gender2)
self.ids['label_11'].text = format(self.gender3)
self.ids['label_12'].text = format(self.gender4)
class WidMounts(BoxLayout):
None
class ScreenManagement(ScreenManager):
pass
presentation = Builder.load_file("CheckBox 7.kv")
class MyApp(App):
def build(self):
return presentation
if __name__ == '__main__':
MyApp().run()
.kv
#:kivy 1.10.0
#:import FadeTransition kivy.uix.screenmanager.FadeTransition
# File name: CheckBox 7.kv
ScreenManagement:
id: screen_manager
transition: FadeTransition()
MainScreen:
name: "star1"
Screen2:
name: "star2"
<MainScreen>:
id: principal
name: "star1"
padding: 1
spacing: 1
orientation: "horizontal"
canvas:
Color:
rgb: 0, 0, 1
Rectangle:
size: self.size
pos: self.pos
Button:
id: play
text: "Play"
font_size:30
text_size: None, None
halign:'center'
size_hint: .2, .14
color:0,1,1,1
pos_hint:{'center_x':.50,'y':.30}
on_release: root.manager.current = "star2"
Label:
id:label_13
text:"?..."
text_size: (110, 40)
halign:'left'
font_size:30
size_hint:1, .15
pos_hint:{'center_x':.57,'y':.80}
color:1,1,1,1
Label:
id:label_14
text:"?.."
text_size: (110, 40)
halign:'left'
font_size:30
size_hint:1, .15
pos_hint:{'center_x':.57,'y':.70}
color:1,1,1,1
Label:
id:label_15
text:"?.."
text_size: (110, 40)
halign:'left'
font_size:30
size_hint:1, .15
pos_hint:{'center_x':.57,'y':.60}
color:1,1,1,1
Label:
id:label_16
text:"?.."
text_size: (110, 40)
halign:'left'
font_size:30
size_hint:1, .15
pos_hint:{'center_x':.57,'y':.50}
color:1,1,1,1
<Screen2>:
name: "star2"
GridLayout:
size:self.size
cols: 2
size_hint:.9, .99
padding : 100,20
spacing: 20, 20
row_default_height: '10dp'
Label:
id:label_r
text: "R"
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
id : chk
text: "R"
on_active:
root.gender1 = self.text
Label:
text: 'F'
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
text: "F"
on_active:
root.gender2 = self.text
Label:
text: 'C'
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
text: "C"
on_active:
root.gender3 = self.text
Label:
text: 'T'
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
text: "T"
on_active:
root.gender4 = self.text
Button:
text: 'Aceptar'
on_press: root.insert_data()
Button:
text: 'Volver'
on_release: root.manager.current = "star1"
Label:
id:label_9
text:"?"
text_size: (110, 40)
halign:'center'
font_size:30
size_hint:1, .15
pos_hint:{'center_x':.30,'y':.90}
color:1,0,0,1
Label:
id:label_10
text:"?"
text_size: (110, 40)
halign:'center'
font_size:30
size_hint:1, .15
pos_hint:{'center_x':.30,'y':.80}
color:1,0,0,1
Label:
id:label_11
text:"?"
text_size: (110, 40)
halign:'center'
font_size:30
size_hint:1, .15
pos_hint:{'center_x':.30,'y':.70}
color:1,0,0,1
Label:
id:label_12
text:"?"
text_size: (110, 40)
halign:'center'
font_size:30
size_hint:1, .15
pos_hint:{'center_x':.30,'y':.60}
color:1,0,0,1
答案 1 :(得分:0)
还没有人回答我的问题,但是我仍在推进项目,如前所述,我修改了代码以使用更多的.kv文件,现在我有了主屏幕和辅助屏幕。
该项目大约是一本12个月的年鉴,每个月30天,其目的是使用户对自己的活动进行一年一次的全局跟踪。
在屏幕“主”中,日历的每个按钮代表一天(365个按钮),每个按钮都指向另一个屏幕(1、2、3,...,365),其中有四个“复选框”显示活动用字母(R,F,C,T)标识,可以分别或以任何顺序和数量选择组中的字母,例如:R,RC,RFT,RFCT。
我们还有三个按钮(接受,清除,返回);通过“接受”,内部将选择的“复选框”发送到屏幕“主”,然后通过按钮“返回”,返回“主”,我可以看到所做选择的数据;使用“清洁”按钮,我可以删除先前所做的选择,当我按下“返回”按钮时,我会发现那天没有任何数据,完全干净,如果需要,我可以再次输入并进行其他选择。 / p>
所缺少的是所做的选择,并且我已经在主屏幕或“主”中拥有该选择,因此可以将其保存在备份中,以便在关闭应用程序时不会删除数据,因此我再次打开它,它们将在我使用该应用程序时选择的每一天都在那里。
另一方面,缺少所选日期中字母根据复选框的每个选择而具有颜色的信息。
接下来,我分享我已经意识到的代码.py和.kv,并且我已经对它们进行了注释,以便您可以在PC上进行验证,以防有人想找到可能的解决方案。我必须指出,接下来的代码至少要表达一个月(一月)和四天(1、2、3、4),因为整整一年都是很多要直接在此处发布的代码网站。
在向您展示最小化代码之前,我会给您留下一整年的图像,以便您对该项目有所了解:
Screen "1" with the four options selected and other three examples.
Screen "main" with the selections made shown on days 1, 2, 3 and 4.
非常感谢您。
我用过基维版。 1.11.1
代码.py
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import StringProperty
from kivy.uix.checkbox import CheckBox
Builder.load_file('anuario Ver minima.kv')
class Anuario(FloatLayout):
def __init__(self, **kwargs):
super(Anuario, self).__init__(**kwargs)
def reset_checkbox_1(self):
for child in reversed(self.ids.grid_1.children):
if isinstance(child, CheckBox):
child.active = False
def limpiar_1(self, text):
self.ids['button_1'].text = ""
self.gender1 = ''
self.gender2 = ''
self.gender3 = ''
self.gender4 = ''
def reset_checkbox_2(self):
for child in reversed(self.ids.grid_2.children):
if isinstance(child, CheckBox):
child.active = False
def limpiar_2(self, text):
self.ids['button_2'].text = ""
self.gender5 = ''
self.gender6 = ''
self.gender7 = ''
self.gender8 = ''
def reset_checkbox_3(self):
for child in reversed(self.ids.grid_3.children):
if isinstance(child, CheckBox):
child.active = False
def limpiar_3(self, text):
self.ids['button_3'].text = ""
self.gender9 = ''
self.gender10 = ''
self.gender11 = ''
self.gender12 = ''
def reset_checkbox_4(self):
for child in reversed(self.ids.grid_4.children):
if isinstance(child, CheckBox):
child.active = False
def limpiar_4(self, text):
self.ids['button_4'].text = ""
self.gender13 = ''
self.gender14 = ''
self.gender15 = ''
self.gender16 = ''
gender1 = StringProperty("")
gender2 = StringProperty("")
gender3 = StringProperty("")
gender4 = StringProperty("")
gender5 = StringProperty("")
gender6 = StringProperty("")
gender7 = StringProperty("")
gender8 = StringProperty("")
gender9 = StringProperty("")
gender10 = StringProperty("")
gender11 = StringProperty("")
gender12 = StringProperty("")
gender13 = StringProperty("")
gender14 = StringProperty("")
gender15 = StringProperty("")
gender16 = StringProperty("")
def insert_data(self):
self.ids['button_1'].text = format(self.gender1)+(self.gender2)+(self.gender3)+(self.gender4)
self.ids['button_2'].text = format(self.gender5)+(self.gender6)+(self.gender7)+(self.gender8)
self.ids['button_3'].text = format(self.gender9)+(self.gender10)+(self.gender11)+(self.gender12)
self.ids['button_4'].text = format(self.gender13)+(self.gender14)+(self.gender15)+(self.gender16)
class MyAppApp(App):
def build(self):
return Anuario()
if __name__ == '__main__':
MyAppApp().run()
代码.kv
<Anuario>:
ScreenManager:
id: manager
size_hint: 1, .9999
Screen:
name: 'main'
BoxLayout:
padding: 1
spacing: 1
orientation: 'vertical'
size_hint: 0.075, 0.947 #ancho y alto bloque meses
pos_hint:{'center_x':.04,'y':.00} #alineación izquierda bloque meses
canvas:
Color:
rgb: 1, 0, 0
Rectangle:
size: self.size
pos: self.pos
Button:
text:"Enero"
font_size:15
halign:'left'
color:1,.5,0,1
BoxLayout:
canvas:
Color:
rgb: 0, 1, 0
Rectangle:
size: self.size
pos: self.pos
orientation: "horizontal"
size_hint: 0.92, 0.05 #ancho y alto bloque encabezado 31 días
pos_hint:{'center_x':.540,'y':.95} #alineación izquierda bloque encabezado 31 días
Button:
text:"1"
font_size:20
size_hint: .12, 0.99
halign:'left'
color:1,.5,0,1
pos_hint:{'center_x':.06,'y':.01}
Button:
text:"2"
font_size:20
size_hint: .12, 0.99
halign:'left'
color:1,.5,0,1
pos_hint:{'center_x':.06,'y':.01}
Button:
text:"3"
font_size:20
size_hint: .12, 0.99
halign:'left'
color:1,.5,0,1
pos_hint:{'center_x':.06,'y':.01}
Button:
text:"4"
font_size:20
size_hint: .12, 0.99
halign:'left'
color:1,.5,0,1
pos_hint:{'center_x':.06,'y':.01}
BoxLayout:
padding: 1
spacing: 1
orientation: "vertical"
size_hint: 0.92, 0.948 #ancho y alto bloque días
pos_hint:{'center_x':.540,'y':0.0} #alineación izquierda bloque días
canvas:
Color:
rgb: 0, 0, 1
Rectangle:
size: self.size
pos: self.pos
GridLayout:
size:self.size
rows: 12
cols: 31
Button:
id: button_1
text: ""
font_size:14
on_press: root.ids.manager.current = '1'
Button:
id: button_2
text: ""
font_size:14
on_press: root.ids.manager.current = '2'
Button:
id: button_3
text: ""
font_size:14
on_press: root.ids.manager.current = '3'
Button:
id: button_4
text: ""
font_size:14
on_press: root.ids.manager.current = '4'
Screen:
name: '1'
on_leave: root.reset_checkbox_1()
BoxLayout:
padding: 1
spacing: 1
orientation: "vertical"
size_hint: 0.55, 0.55 #ancho y alto screen de seleción
pos_hint:{'center_x':.50,'y':.30} #alineación izquierda screen de seleción
canvas:
Color:
rgb: 0, 0, .2 #color fondo del screen de selección
Rectangle:
size: self.size
pos: self.pos
GridLayout:
id: grid_1
size:self.size
cols: 2
size_hint:.9, .99
padding : 100,20
spacing: 20, 20
row_default_height: '10dp'
Label:
text: "R"
color:1,0,0,1
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
id : chk
text: "R"
on_active:
root.gender1 = self.text
Label:
text: 'F'
color:1,1,0,1
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
text: "F"
on_active:
root.gender2 = self.text
Label:
text: 'C'
color:0,1,0,1
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
text: "C"
on_active:
root.gender3 = self.text
Label:
text: 'T'
color:0,0,1,1
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
text: "T"
on_active:
root.gender4 = self.text
Button:
id: Button1_Aceptar
text: 'Aceptar'
on_press: root.insert_data()
Button:
id: Button1_Limpiar
text: 'Limpiar'
on_press: root.limpiar_1(button_1.text)
BoxLayout:
orientation: "vertical"
Button:
size_hint: 1.5, 0.99
pos_hint:{'center_x':1.06,'y':.00}
text: 'Volver'
on_press: root.ids.manager.current = 'main'
Screen:
name: '2'
on_leave: root.reset_checkbox_2()
BoxLayout:
padding: 1
spacing: 1
orientation: "vertical"
size_hint: 0.55, 0.55 #ancho y alto screen de seleción
pos_hint:{'center_x':.50,'y':.30} #alineación izquierda screen de seleción
canvas:
Color:
rgb: 0, 0, .2 #color fondo del screen de selección
Rectangle:
size: self.size
pos: self.pos
GridLayout:
id: grid_2
size:self.size
cols: 2
size_hint:.9, .99
padding : 100,20
spacing: 20, 20
row_default_height: '10dp'
Label:
text: "R"
color:1,0,0,1
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
id : chk
text: "R"
on_active:
root.gender5 = self.text
Label:
text: 'F'
color:1,1,0,1
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
text: "F"
on_active:
root.gender6 = self.text
Label:
text: 'C'
color:0,1,0,1
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
text: "C"
on_active:
root.gender7 = self.text
Label:
text: 'T'
color:0,0,1,1
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
text: "T"
on_active:
root.gender8 = self.text
Button:
id: Button2_Aceptar
text: 'Aceptar'
on_press: root.insert_data()
Button:
id: Button2_Limpiar
text: 'Limpiar'
on_press: root.limpiar_2(button_2.text)
BoxLayout:
orientation: "vertical"
Button:
size_hint: 1.5, 0.99
pos_hint:{'center_x':1.06,'y':.00}
text: 'Volver'
on_press: root.ids.manager.current = 'main'
Screen:
name: '3'
on_leave: root.reset_checkbox_3()
BoxLayout:
padding: 1
spacing: 1
orientation: "vertical"
size_hint: 0.55, 0.55 #ancho y alto screen de seleción
pos_hint:{'center_x':.50,'y':.30} #alineación izquierda screen de seleción
canvas:
Color:
rgb: 0, 0, .2 #color fondo del screen de selección
Rectangle:
size: self.size
pos: self.pos
GridLayout:
id: grid_3
size:self.size
cols: 2
size_hint:.9, .99
padding : 100,20
spacing: 20, 20
row_default_height: '10dp'
Label:
text: "R"
color:1,0,0,1
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
id : chk
text: "R"
on_active:
root.gender9 = self.text
Label:
text: 'F'
color:1,1,0,1
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
text: "F"
on_active:
root.gender10 = self.text
Label:
text: 'C'
color:0,1,0,1
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
text: "C"
on_active:
root.gender11 = self.text
Label:
text: 'T'
color:0,0,1,1
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
text: "T"
on_active:
root.gender12 = self.text
Button:
id: Button3_Aceptar
text: 'Aceptar'
on_press: root.insert_data()
Button:
id: Button3_Limpiar
text: 'Limpiar'
on_press: root.limpiar_3(button_3.text)
BoxLayout:
orientation: "vertical"
Button:
size_hint: 1.5, 0.99
pos_hint:{'center_x':1.06,'y':.00}
text: 'Volver'
on_press: root.ids.manager.current = 'main'
Screen:
name: '4'
on_leave: root.reset_checkbox_4()
BoxLayout:
padding: 1
spacing: 1
orientation: "vertical"
size_hint: 0.55, 0.55 #ancho y alto screen de seleción
pos_hint:{'center_x':.50,'y':.30} #alineación izquierda screen de seleción
canvas:
Color:
rgb: 0, 0, .2 #color fondo del screen de selección
Rectangle:
size: self.size
pos: self.pos
GridLayout:
id: grid_4
size:self.size
cols: 2
size_hint:.9, .99
padding : 100,20
spacing: 20, 20
row_default_height: '10dp'
Label:
text: "R"
color:1,0,0,1
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
id : chk
text: "R"
on_active:
root.gender13 = self.text
Label:
text: 'F'
color:1,1,0,1
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
text: "F"
on_active:
root.gender14 = self.text
Label:
text: 'C'
color:0,1,0,1
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
text: "C"
on_active:
root.gender15 = self.text
Label:
text: 'T'
color:0,0,1,1
text_size: self.size
halign:'center'
valign: 'middle'
CheckBox:
text: "T"
on_active:
root.gender16 = self.text
Button:
id: Button4_Aceptar
text: 'Aceptar'
on_press: root.insert_data()
Button:
id: Button4_Limpiar
text: 'Limpiar'
on_press: root.limpiar_4(button_4.text)
BoxLayout:
orientation: "vertical"
Button:
size_hint: 1.5, 0.99
pos_hint:{'center_x':1.06,'y':.00}
text: 'Volver'
on_press: root.ids.manager.current = 'main'