如何将变量作为字符串合并到代码中(在for循环的上下文中)



有没有一种方法可以用for循环来表达下面的代码?

def get_data(self):
global num_of_labels
num_of_labels = num_of_labels + 1
print(num_of_labels)
if num_of_labels == 1:
user_input = (self.root.get_screen("to_do_view").ids.data.text)
self.root.get_screen("to_do_view").ids.label_id1.text = user_input
self.root.get_screen("to_do_view").ids.data.text = ''
if num_of_labels == 2:
user_input = (self.root.get_screen("to_do_view").ids.data.text)
self.root.get_screen("to_do_view").ids.label_id2.text = user_input
self.root.get_screen("to_do_view").ids.data.text = ''
if num_of_labels == 3:
user_input = (self.root.get_screen("to_do_view").ids.data.text)
self.root.get_screen("to_do_view").ids.label_id3.text = user_input
self.root.get_screen("to_do_view").ids.data.text = ''

我在想这样的事情(我知道这里的语法是错误的(:

for i in range(3)
user_input = (self.root.get_screen("to_do_view").ids.data.text)
self.root.get_screen("to_do_view").ids.label_id+str(i).text = user_input
self.root.get_screen("to_do_view").ids.data.text = ''

其中label_id1label_id2label_id3对应于kivy文件中的标签id。我的问题是我不能用正确的语法表达label_id+str(i)

这是我的完整代码:

Python文件:

# Variables
global num_of_labels
num_of_labels = 0; # Counter for the number of task labels
global elapsed_time
elapsed_time = 0;
global starting_time
starting_time = 0;
class TodoLayout(MDScreen, MDFloatLayout):
pass

class CatLayout(Screen):
# Clock
your_time = StringProperty()
def __init__(self, **kwargs):
super(CatLayout, self).__init__(**kwargs)
self.orientation = "vertical"
self.padding = 10
Clock.schedule_interval(self.set_time, 0.1)
def set_time(self, dt):
self.your_time = time.strftime("%H:%M")
def countdown(self):
pass

number = NumericProperty()
def __init__(self, **kwargs):
super(CatLayout, self).__init__(**kwargs)
Clock.schedule_interval(self.increment_time, 1)
self.increment_time(0)
def increment_time(self, interval):
self.number += .1
def start(self):
Clock.unschedule(self.increment_time)
Clock.schedule_interval(self.increment_time, .1)
def stop(self):
Clock.unschedule(self.increment_time)
class WindowManager(ScreenManager):
pass

class BullyCat(MDApp, App):
def get_data(self):
global num_of_labels
num_of_labels = num_of_labels + 1
print(num_of_labels)
if num_of_labels == 1:
user_input = (self.root.get_screen("to_do_view").ids.data.text)
self.root.get_screen("to_do_view").ids.label_id1.text = user_input
self.root.get_screen("to_do_view").ids.data.text = ''
if num_of_labels == 2:
user_input = (self.root.get_screen("to_do_view").ids.data.text)
self.root.get_screen("to_do_view").ids.label_id2.text = user_input
self.root.get_screen("to_do_view").ids.data.text = ''
if num_of_labels == 3:
user_input = (self.root.get_screen("to_do_view").ids.data.text)
self.root.get_screen("to_do_view").ids.label_id3.text = user_input
self.root.get_screen("to_do_view").ids.data.text = ''

def build(self):
return Builder.load_file("kivyfile.kv")
def user_input(self):
global user_input
def add_todo(self):
global screen_manager
screen_manager = ScreenManager()
screen_manager.get_screen('main').todo_scroll.add_widget(TodoLayout())

if __name__ == "__main__":
BullyCat().run()

Kivy文件:

WindowManager:
TodoLayout:
CatLayout:
<TodoLayout>:
name: "to_do_view"
id: to_do_view
MDScreen:
id: main
name: 'main'
MDFloatLayout:
md_bg_color: 0, 1, 0, .1
MDLabel:
text: "MyTasks"
pos_hint: {"center_x": .9, "center_y": .95}
font_size: "35sp"
#           id: date
#           text: ""
#          pos_hint: {"center_x": .885, "center_y": .89}
#         font_size: "18sp"
#        MDIconButton:
#            icon: "plus"
#            pos_hint: {"center_x": .92, "center_y": .925}
#            user_font_size: "30sp"
#            md_bg_color: 30/255, 1, 30/255, 0.8
#            theme_text_color: "Custom"
#            text_color: 1, 1, 1, 1
#            on_release: app.add_todo()
MDIconButton:
icon: "cat"
pos_hint: {"center_x": .075, "center_y": .925}
user_font_size: "30sp"
md_bg_color: 30/255, 1, 30/255, 0.8
theme_text_color: "Custom"
text_color: 1, 1, 1, 1
on_release:
app.root.current = "cat_view"
root.manager.transition.direction = "left"
MDTextField:
id: data
hint_text: "Write a task"
pos_hint: {"center_x": .5, "center_y": .1}
size_hint: 0.5, None
MDRectangleFlatButton:
text: 'add'
pos_hint: {"center_x": .8, "center_y": .1}
on_release:
app.get_data()
#app.add_todo()
ScrollView:
do_scroll_x: False
do_scroll_y: True
pos_hint: {"center_x": .5, "center_y": .5}
size_hint_x: .8
size_hint_y: .7
MDFloatLayout:
cols: 1
MDTextField:
id: label_id1
text: ''
hint_text: 'Task 1'
pos_hint: {"center_x": .44, "center_y": .95}
size_hint_x: .5
size_hint_y: .15
font_size: 18
background_color: 0, 1, 0, 0
MDTextField:
id: label_id2
text: ''
hint_text: 'Task 2'
pos_hint: {"center_x": .44, "center_y": .85}
size_hint_x: 0.5
size_hint_y: 0.15
font_size: 18
background_color: 0, 1, 0, 0
MDTextField:
id: label_id3
text: ''
hint_text: 'Task 3'
pos_hint: {"center_x": .44, "center_y": .75}
size_hint_x: 0.5
size_hint_y: 0.15
font_size: 18
background_color: 0, 1, 0, 0
MDTextField:
id: label_id4
text: ''
hint_text: 'Task 4'
pos_hint: {"center_x": .44, "center_y": .65}
size_hint_x: 0.5
size_hint_y: 0.15
font_size: 18
background_color: 0, 1, 0, 0
MDTextField:
id: label_id5
text: ''
hint_text: 'Task 5'
pos_hint: {"center_x": .44, "center_y": .55}
size_hint_x: 0.5
size_hint_y: 0.15
font_size: 18
background_color: 0, 1, 0, 0
MDTextField:
id: label_id6
text: ''
hint_text: 'Task 6'
pos_hint: {"center_x": .44, "center_y": .45}
size_hint_x: 0.5
size_hint_y: 0.15
font_size: 18
background_color: 0, 1, 0, 0
MDCheckbox:
pos_hint: {"center_x": .9, "center_y": .95}
size_hint_y: 0.1
size_hint_x: 0.1
MDCheckbox:
pos_hint: {"center_x": .9, "center_y": .85}
size_hint_y: 0.1
size_hint_x: 0.1
MDCheckbox:
pos_hint: {"center_x": .9, "center_y": .75}
size_hint_y: 0.1
size_hint_x: 0.1
MDCheckbox:
pos_hint: {"center_x": .9, "center_y": .65}
size_hint_y: 0.1
size_hint_x: 0.1
MDCheckbox:
pos_hint: {"center_x": .9, "center_y": .55}
size_hint_y: 0.1
size_hint_x: 0.1
MDCheckbox:
pos_hint: {"center_x": .9, "center_y": .45}
size_hint_y: 0.1
size_hint_x: 0.1



<CatLayout>:
name: 'cat_view'
MDScreen:
id: second
name: 'second'
MDFloatLayout:
md_bg_color: 0, 1, 0, .1
MDIconButton:
icon: "pencil"
pos_hint: {"center_x": .075, "center_y": .925}
user_font_size: "30sp"
md_bg_color: 30/255, 1, 30/255, 0.8
theme_text_color: "Custom"
text_color: 1, 1, 1, 1
on_release:
app.root.current = "to_do_view"
root.manager.transition.direction = "right"
MDTextField:
hint_text: "Time limit (min)"
pos_hint: {"center_x": .5, "center_y": .1}
size_hint: 0.5, None
MDRectangleFlatButton: # Button to start timer
id: start
text: 'start'
pos_hint: {"center_x": .3, "center_y": .2}
on_press: root.start()
MDRectangleFlatButton: # Button to stop timer
text: 'stop'
pos_hint: {"center_x": .5, "center_y": .2}
on_press:
root.stop()
MDRectangleFlatButton: # Button to reset timer
text: 'reset'
pos_hint: {"center_x": .7, "center_y": .2}
on_press: root.number = 0
MDLabel:
text: root.your_time
pos_hint: {"center_x": .96, "center_y": .95}
font_size: 15
Image:
source: 'cat.png'
size_hint_x: 0.3
size_hint_y: 0.3
pos_hint: {"center_x": .5, "center_y": .6}
MDLabel:
text: str(round(root.number))
pos_hint: {"center_x": .96, "center_y": .8}
font_size: 60
Kivy允许使用.ids["name"]而不是.ids.name

这允许使用字符串格式

.ids[f"label_id{i}"].text
.ids["label_id{}".format(i)].text
.ids["label_id%s" % i].text

编辑:

在Python代码中Kv lang中定义的文档访问小部件中,您可以看到注释为"alternative syntax"的示例代码

self.ids.hulk.text = "hulk: puny god!"
self.ids["loki"].text = "loki: >_<!!!"  # alternative syntax

您可以使用getattr进行以下操作:

for i in range(3)
user_input = (self.root.get_screen("to_do_view").ids.data.text)
ids = self.root.get_screen("to_do_view").ids
getattr(ids, f"label_id{i}").text = user_input
self.root.get_screen("to_do_view").ids.data.text = ''

最新更新