Как мне передать строку из моего main.py в my .kv

#python #kivy #kivy-language

#python #kivy #kivy-language

Вопрос:

У меня есть большая строка, которую мне нужно передать в мой kv-файл, чтобы я мог распечатать ее в качестве метки в конечном приложении. Единственная проблема в том, что я не знаю как. Я искал в Интернете, но не могу найти рабочее решение, которое я мог бы интегрировать в свой код.

Вот класс, содержащий строку («Имена имен» — это то, что я хочу напечатать в качестве метки):

 class RecordData(Screen):
    with open("Lipo names.txt") as f:
        lineList = f.readlines()
    lipoNames = ("".join(map(str, lineList)))
  

Я уже открывал файл kv вне класса с помощью конструктора, поскольку я работаю с несколькими меню. Ниже вы найдете раздел моего файла kv, где будет размещена метка:

 <RecordData>
    name: "record"
    
    Label:
        text: ???
        font_size: (root.width**2   root.height**2) / 13**4
        pos_hint:{"x": 0.325, "y": 0.86}
        size_hint:0.35, 0.15
  

Это мой первый проект с kv, поэтому я все еще новичок в работе с файлом kv.
Спасибо за помощь!

Ответ №1:

Вы можете вызвать root.ваша переменная на языке kv (она действует как self.yourvariable), а затем в вашей функции относительного класса вызовите тип Kivy StringProperty для вашей переменной, поэтому приведение типа не требуется, и Kivy знает, как обращаться с переменной.

Попробуйте эту функцию ниже, которая обновляет текст каждый раз, когда вы нажимаете на метку:

 from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.app import App
from kivy.properties import StringProperty
from kivy.lang import Builder
a = """
<RecordData>
    Label:
        text: root.variabletext
        font_size: (root.width**2   root.height**2) / 13**4
        size_hint:0.35, 0.15
        pos_hint:{"x": 0.325, "y": 0.86}
""" 
Builder.load_string(a)
class RecordData(FloatLayout):
    variabletext = StringProperty("example")
    num = 0
    
    def on_touch_down(self, touch):
        self.variabletext = "We changed " str(self.num) " many times"
        self.num  = 1

class ExampleApp(App):
    def build(self):
        return RecordData()
        
if __name__ == '__main__':
    ExampleApp().run()
  

Аналогичным образом вы могли бы присвоить метке идентификатор на языке KV, затем вызвать идентификатор и установить свойство text в вашей функции относительного класса python, пример ниже:

 from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.app import App
from kivy.lang import Builder
a = """
<RecordData>
    Label:
        id: variabletext
        text: "example"
        font_size: (root.width**2   root.height**2) / 13**4
        size_hint:0.35, 0.15
        pos_hint:{"x": 0.325, "y": 0.86}
""" 
Builder.load_string(a)
class RecordData(FloatLayout):
    num = 0
    
    def on_touch_down(self, touch):
        self.ids.variabletext.text = "We changed " str(self.num) " many times"
        self.num  = 1

class ExampleApp(App):
    def build(self):
        return RecordData()
        
if __name__ == '__main__':
    ExampleApp().run()
  

Ответ №2:

В этом случае вы можете записать свой файл .kv в переменную в вашем файле python, и вы можете просто использовать f «{}» для передачи вашего примера строки

 text = ""

a = f"""
<RecordData>
    name: {text}    
    Label:
        text: ???
        font_size: (root.width**2   root.height**2) / 13**4
        pos_hint:{"x": 0.325, "y": 0.86}
        size_hint:0.35, 0.15

"""
  

надеюсь, это было бы полезно