Python 如何写进kivy';动态地从文件中删除标签?

Python 如何写进kivy';动态地从文件中删除标签?,python,kivy,kivy-language,Python,Kivy,Kivy Language,我是Python UI编程新手。我想构建一个GUI,当您输入一个字母时,您将获得代码,以使用星形模式或任何其他字符模式打印该字母。我将所有字母的图案代码存储在单独的文本文件中,如a.txt、b.txt等。。 我还为一些特殊角色编写了代码,比如爱情符号或蛋糕。但现在,我正在努力显示字母的模式代码。 我必须从用户那里读取输入,比如说'm',然后从m.txt文件中读取文本。我现在要做的就是使用标签标签在GUI上显示这些内容。我的代码不会在屏幕上打印任何内容 请有人给我腾出时间,看看我的代码。 提前谢谢

我是Python UI编程新手。我想构建一个GUI,当您输入一个字母时,您将获得代码,以使用星形模式或任何其他字符模式打印该字母。我将所有字母的图案代码存储在单独的文本文件中,如a.txt、b.txt等。。 我还为一些特殊角色编写了代码,比如爱情符号或蛋糕。但现在,我正在努力显示字母的模式代码。 我必须从用户那里读取输入,比如说'm',然后从m.txt文件中读取文本。我现在要做的就是使用标签标签在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
类中,行:

        main_label = Label()
创建一个新的
标签
,该标签不在GUI中,因此设置该新
标签的文本对GUI没有任何影响。因此,您可以通过访问
code
屏幕中的实际
标签来更正此问题:

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(@,*,&)
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()
为此,您需要在
kv
中添加
id
main\u标签

<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
类中存在类似错误,您正在创建
code
的新实例,而不是访问已经是GUI一部分的实例。可通过使用
屏幕管理器
访问
代码
屏幕
来纠正此问题:

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(@,*,&)
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()

请注意,无论何时使用紧跟
()
的类名,您都在创建该类的新实例,该实例可能与应用程序中已存在的该类的任何实例都没有关系。

代码中存在两个类似的问题:

首先,在
code
类中,行:

        main_label = Label()
创建一个新的
标签
,该标签不在GUI中,因此设置该新
标签的文本对GUI没有任何影响。因此,您可以通过访问
code
屏幕中的实际
标签来更正此问题:

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(@,*,&)
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()
为此,您需要在
kv
中添加
id
main\u标签

<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
类中存在类似错误,您正在创建
code
的新实例,而不是访问已经是GUI一部分的实例。可通过使用
屏幕管理器
访问
代码
屏幕
来纠正此问题:

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(@,*,&)
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()
请注意,无论何时使用类名称后跟
()
,您都在创建该类的新实例,该实例可能与应用程序中已存在的该类的任何实例都没有关系