如何动态地从文件写入kivy的标签?

How to write into kivy's Label from a file Dynamically?

我是 Python UI 编程新手。我想构建一个 GUI,当您在其中输入一个字母时,您将获得 code 以使用星形图案或任何其他字符图案打印该字母。我将所有字母的模式代码存储在单独的文本文件中,如 a.txt、b.txt 等。 我还为一些特殊字符编写了代码,例如爱情符号或蛋糕。但是现在,我正在努力显示字母的模式代码。 我必须读取用户输入 'm' 并从 m.txt 文件中读取文本。我现在要做的就是使用 Label 标签将这些内容显示在 GUI 上。我的代码没有在屏幕上打印任何内容。

有人能抽出时间来研究一下我的代码吗? 提前致谢

这是我的 Python 文件

import kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.popup import Popup


def show_popup():
    show = P()
    popupWindow = Popup(title = "Error",content = show,size_hint = (None,None),size =(400,400))
    popupWindow.open()




class P(FloatLayout):
    pass

class Code(Screen):
    def display(self,char):
        try:
            with open("{}.txt".format(char),"r") as f:
                contents = f.read()
                # I am sure that the contents are read properly
                # bcoz I printed them on IDLE and it worked
            main_label = Label()
            main_label.txt = contents
        except:
            show_popup()#if it is an invalid letter like(@,*,&)

class SecondPage(Screen):
    #SecondPage asks the user to enter a letter
    letter = ObjectProperty(None)
    def Enter(self):
        #this method checks whether the user entered a valid letter or not
        if len(self.letter.text)==1:
            char = self.letter.text
            char = char.lower()
            c = Code()
            c.display(char)#passing this character display method
            
        else:
            show_popup()

            

class MainPage(Screen):
    #Main Page has two buttons asking the user whether
    #he want code for special character or a letter
    pass


class WindowManager(ScreenManager):
    pass




class Sowmya(App):
    def build(self):
        return WindowManager()
if __name__ == "__main__":
    Sowmya().run()

这是我的 .kv 文件

<P>:
    Label:
        text:"Please enter a valid letter"
        size_hint:0.6,0.2
        pos_hint:{"x":0.2,"top":1}

<WindowManager>:
    MainPage:
    SecondPage:
    Code:

<MainPage>:
    name:"main"

    Button:
        text: 'Letters'
        pos_hint : {'x':.4,'y':.2,'left':.3}
        on_release:
            app.root.current = "second"
            root.manager.transition.direction = "left"
        font_size: 20 
        background_color: (1, 1, 1, 1) 
        color: (1, 1, 1, 1)
        size_hint:.4,.3
    Button:
        text: 'Special'
        pos_hint : {'x':.4,'y':.5,'left':.3}
        font_size: 20 
        background_color: (1, 1, 1, 1) 
        color: (1, 1, 1, 1)
        size_hint:.4,.3


<SecondPage>:
    letter:letter
    name:"second"
    GridLayout:
        cols:1
        GridLayout:
            cols:2
            Label:
                text:"Enter Letter:"
            TextInput:
                id:letter
                multiline:False
        Button:
            text : "Enter"
            on_release:
                root.Enter()
                app.root.current = "code"
                
        Button:
            text:"Go Back"
            on_release:
                app.root.current = "main"
                root.manager.transition.direction = "right"


<Code>:
    name:"code"
    Label:
        size_hint:0.6,0.2
        pos_hint:{"x":0.2,"top":1}    

    


你的代码中有两个类似的问题:

首先,在您的 Code class 行中:

        main_label = Label()

创建一个新的 Label,它不在您的 GUI 中,因此设置新 Label 的文本不会对您的 GUI 产生任何影响。因此,您可以通过访问 Code Screen:

中的实际 Label 来更正此问题
class Code(Screen):
    def display(self, char):
        try:
            with open("{}.txt".format(char), "r") as f:
                contents = f.read()

            # don't create a new Label, use the one in this Screen
            self.ids.main_label.text = contents

            # switch to this Screen
            self.manager.current = 'code'
        except:
            show_popup()  # if it is an invalid letter like(@,*,&)

为此,您需要在 kv:

中添加 id main_label
<Code>:
    name:"code"
    Label:
        id: main_label  # id for accessing this Label
        size_hint:0.6,0.2
        pos_hint:{"x":0.2,"top":1}   

在您的 SecondPage class 中出现了类似的错误,您正在创建 Code 的新实例,而不是访问已经包含在您的 GUI 中的实例。这可以通过使用 ScreenManager 访问 Code Screen:

来纠正
class SecondPage(Screen):
    # SecondPage asks the user to enter a letter
    letter = ObjectProperty(None)

    def Enter(self):
        # this method checks whether the user entered a valid letter or not
        if len(self.letter.text) == 1:
            char = self.letter.text
            char = char.lower()
            # c = Code()
            c = self.manager.get_screen('code')  # get Code Screen that was created by the `kv`
            c.display(char)  # passing this character display method

        else:
            show_popup()

请注意,每当您使用 class 名称后跟 () 时,您正在创建该 class 的新实例,该实例可能与该 [=41] 的任何实例无关=] 已经在您的应用程序中。