用于打印文本输入的按钮不起作用

时间:2016-07-07 07:24:37

标签: python kivy

整个代码运行良好。但是当你去:

student > Add New student > > Fill all columns of new student > then submit
它没有工作,我无法弄清楚这个问题。以下是代码。任何帮助将不胜感激

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen ,FadeTransition
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
import csv
from kivy.uix.textinput import TextInput

Builder.load_string("""
<MenuScreen>:
    BoxLayout:
        Button:
            text: 'Teacher'
            on_press: root.manager.current = 'screen1'
        Button:
            text: 'Student '
            on_press:root.manager.current = 'screen2'
        Button:
            text: 'Quit'

<Screen1>:
    BoxLayout:

    Button:
        text: 'Teacher Info'
        #on_press:root.manager.current = 'login'
    Button:
        text: 'Teacher Attandance'
    Button:
        text: 'Add New Teacher'
        on_press:root.manager.current = 'add_teacher'
    Button:
        text: 'Back'
        on_press:root.manager.current ='menu'


<add_new_teacher>:
    GridLayout:
        cols:2

    Label:
        text:'Name'
    TextInput:
        id: name_input
        multiline: False

    Label:
        text:'Father Name'
    TextInput:
        id: name_input
        multiline: False

    Label:
        text: 'Mother Name'
    TextInput:
        id: name_input
        multiline: False

    Label:
        text: 'Class'
    TextInput:
        id: name_input
        multine: False

    Label:
        text:'Roll no.'
            text: 'Student Info'
            on_press:root.csv_std()
        Button:
            text: 'Student Attandance'
            # on_press:root.manager.current ='login'
        Button:
            text: 'Add New Student'
            on_press:root.manager.current = 'add_student'

        Button
            text: 'Back'
            on_press:root.manager.current = 'menu'

<add_new_student>:
    GridLayout:
        cols:2

        Label:
            text:'Name'
        TextInput:
            id: self.name
            multiline: False

        Label:
            text:'Father Name'
        TextInput:
            id: self.fname
            multiline: False

        Label:
            text: 'Mother Name'
        TextInput:
            id: self.mname
            multiline: False

        Label:
            text: 'Class'
        TextInput:
            id: self.c
            multine: False

        Label:
            text:'Roll no.'
        TextInput:
            id: self.r
            multiline:False


        Button:
            text:'Print'


        Button:
            text:'Submit'
            on_press:root.print_text()

        Button:
            text:'Back'
            on_press:root.manager.current= 'screen2'

""")

# Declare both screens
class MenuScreen(Screen):
    pass
class add_new_teacher(Screen):

    pass 
class Screen1(Screen):
    pass
class Screen2(Screen):
    def csv_std(self):
        f = open("a.csv", 'r')
        reader = csv.reader(f)
        for row in reader:
            print(" ".join(row))
    pass
class add_new_student(Screen):
    def print_text(self):
        for child in reversed(self.children):
            if isinstance(child, TextInput):
                print child.text
    pass


# Create the screen manager
sm = ScreenManager()
sm.add_widget(MenuScreen(name='menu'))
sm.add_widget(add_new_teacher(name='add_teacher'))
sm.add_widget(add_new_student(name='add_student'))
sm.add_widget(Screen1(name='screen1'))
sm.add_widget(Screen2(name='screen2'))

class TestApp(App):

    def build(self):
        return sm

if __name__ == '__main__':
    TestApp().run()

1 个答案:

答案 0 :(得分:2)

您的代码格式很糟糕,但至少您没有使用反引号。对于将来的情况,请复制并粘贴您要在此处显示的整个示例,然后选择该示例(整个)并按Ctrl + K,这将缩进所有选定的行,以便它看起来不错。

代码完全适用于它应该如何工作,因为root.print_text()定位了add_new_student类及其children - 而非GridLayout您想要访问的内容。

使用for修改此行:for child in reversed(self.children[0].children):,您就可以了。 :)

或者更高效的解决方案是让Screen表现为布局,您可以从Screen和某些布局继承,但确保布局

class add_new_student(GridLayout, Screen):
    def print_text(self):
        for child in reversed(self.children):
            if isinstance(child, TextInput):
                print child.text

<强> KV:

<add_new_student>:
    cols:2

    Label:
        text:'Name'