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