【问题标题】:How to write into kivy's Label from a file Dynamically?如何从文件动态写入kivy的标签?
【发布时间】:2020-10-02 00:42:45
【问题描述】:

我是 Python UI 编程的新手。我想构建一个 GUI,当您输入一个字母时,您将获得 code 以使用星形图案或任何其他字符图案打印该字母。我将所有字母的模式代码的代码存储在一个单独的文本文件中,如 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}    

    


【问题讨论】:

    标签: python kivy kivy-language


    【解决方案1】:

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

    首先,在您的 Code 类中,行:

            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 类中出现类似错误,您正在创建 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()
    

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

    【讨论】:

      猜你喜欢
      • 2017-10-08
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      相关资源
      最近更新 更多