在Kivy中使用变量和函数时,未定义名称

时间:2017-08-20 21:20:46

标签: python python-3.x runtime-error kivy nameerror

我正在创建一个与服务器交互的程序,该程序供员工在移动设备上使用,所以我使用的是Kivy,我首先使用GUI。我按照文档中的说明进行了最好的理解,但似乎无法解决这个问题。我的代码引用变量和函数,但是,无论何时它运行它崩溃并给我和错误代码,说明变量或函数的名称(无论哪个被称为第一个)未定义

这是我的代码:

import sqlalchemy
import os
import kivy
import datetime
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy import app
from kivy.uix import button
from kivy.uix.textinput import TextInput
from kivy.uix.label import Label
from kivy.lang import Builder

admincode = "..."
# SQL Functions
# Incomplete as of now
# shift will be pulled from database
shift = False

def UserLogin(id = 'unfilled', password = 'unfilled'):
    global user
    global localhost_enabled
    if id == "localtest" and password == admincode:
        user = id
        localhost_enabled = True
        return True
    elif id == "servertest" and password == admincode:
        user = id
        localhost_enabled = False
        return True
def UserLogout():
    user = ''

def ShiftIn():
    global shift
    shift = True
def ShiftOut():
    global shift
    shift = False
def submitform(StartCash=0, EndCash=0):
    NetCash = EndCash - StartCash
    print("NetCash = {0}".format(NetCash))
def ShiftGetter():
    if shift == True:
        return "Shift Out"
    else:
        return "Shift In"
# Kivy Building

Builder.load_string("""
<LoginScreen>:
    BoxLayout:
        Label:
            text: 'ID:'
        TextInput:
            id: LoginInputUser
            text: ''
            multiline: False
        Label:
            text: "Password:"
        TextInput:
            id: LoginInputPassword
            text: ''
            password: True
            multiline: False
        Button:
            text: 'login'
            on_press:
                if UserLogin(LoginInputUser.text, LoginInputPassword.text): LoginValidationText.text = ''
                if UserLogin(LoginInputUser.text, LoginInputPassword.text): root.manager.current = 'Home'
                else: LoginValidationText.text = 'Invalid Username or Password'
        Label:
            text: ''
            id: 'LoginValidationText'


<HomeScreen>:
    BoxLayout:
        Button:
            text: 'Logout'
            on_press:
                UserLogout()
                root.manager.current = 'Login'
        Button:
            text: 'Open Submission Form'
            on_press: root.manager.current = 'Form'
        Button:
            text: 'Shift Out' if shift == True else 'Shift In'
            on_press:
                if shift: ShiftOut()
                else: ShiftIn()


<FormScreen>:
    BoxLayout:
        Button:
            text: 'Back to menu'
            on_press: root.manager.current = 'Home'
        Label:
            text: 'Start Money:'
        TextInput:
            id: StartCash
            text: ''
            multiline: False
        Label:
            text: 'End Money:'
        TextInput:
            id: EndCash
            text: ''
            multiline: False
        Button:
            text: 'Submit'
            on_press: submitform(StartCash = int(StartCash.text), EndCash = int(EndCash.text))

""")
class LoginScreen(Screen):
    pass

class HomeScreen(Screen):
    pass

class FormScreen(Screen):
    pass

sm = ScreenManager()
sm.add_widget(LoginScreen(name='Login'))
sm.add_widget(HomeScreen(name='Home'))
sm.add_widget(FormScreen(name='Form'))
class RealApp(App):
    def build(self):
        return sm

RealApp().run()

错误信息:

[INFO   ] [Logger      ] Record log in C:\Users\sherl\.kivy\logs\kivy_17-08-20_28.txt
[INFO   ] [Kivy        ] v1.10.0
[INFO   ] [Python      ] v3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:14:34) [MSC v.1900 32 bit (Intel)]
[INFO   ] [Factory     ] 194 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_gif (img_pil, img_ffpyplayer ignored)
[INFO   ] [Text        ] Provider: sdl2
[INFO   ] [OSC         ] using <thread> for socket
[INFO   ] [Window      ] Provider: sdl2
[INFO   ] [GL          ] Using the "OpenGL" graphics system
[INFO   ] [GL          ] GLEW initialization succeeded
[INFO   ] [GL          ] Backend used <glew>
[INFO   ] [GL          ] OpenGL version <b'4.4.0 - Build 20.19.15.4531'>
[INFO   ] [GL          ] OpenGL vendor <b'Intel'>
[INFO   ] [GL          ] OpenGL renderer <b'Intel(R) HD Graphics 5500'>
[INFO   ] [GL          ] OpenGL parsed version: 4, 4
[INFO   ] [GL          ] Shading version <b'4.40 - Build 20.19.15.4531'>
[INFO   ] [GL          ] Texture max size <16384>
[INFO   ] [GL          ] Texture max units <32>
[INFO   ] [Shader      ] fragment shader: <b"WARNING: 0:7: '' :  #version directive missing">
[INFO   ] [Shader      ] vertex shader: <b"WARNING: 0:7: '' :  #version directive missing">
[INFO   ] [Window      ] auto add sdl2 input provider
[INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
 Traceback (most recent call last):
   File "C:\Users\sherl\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\lang\builder.py", line 249, in create_handler
     return eval(value, idmap), bound_list
   File "<string>", line 39, in <module>
 NameError: name 'shift' is not defined

 During handling of the above exception, another exception occurred:

 Traceback (most recent call last):
   File "C:\Users\sherl\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\lang\builder.py", line 597, in _apply_rule
     rctx['ids'])
   File "C:\Users\sherl\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\lang\builder.py", line 254, in create_handler
     cause=tb)
 kivy.lang.builder.BuilderException: Parser: File "<inline>", line 39:
 ...
      37:            on_press: root.manager.current = 'Form'
      38:        Button:
 >>   39:            text: 'Shift Out' if shift == True else 'Shift In'
      40:            on_press:
      41:                if shift: ShiftOut()
 ...
 NameError: name 'shift' is not defined
   File "C:\Users\sherl\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\lang\builder.py", line 249, in create_handler
     return eval(value, idmap), bound_list
   File "<string>", line 39, in <module>


 During handling of the above exception, another exception occurred:

 Traceback (most recent call last):
   File "C:\Users\sherl\PycharmProjects\PokerRoomSQL\User\UserDepreciated.py", line 126, in <module>
     sm.add_widget(HomeScreen(name='Home'))
   File "C:\Users\sherl\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\uix\relativelayout.py", line 265, in __init__
     super(RelativeLayout, self).__init__(**kw)
   File "C:\Users\sherl\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\uix\floatlayout.py", line 65, in __init__
     super(FloatLayout, self).__init__(**kwargs)
   File "C:\Users\sherl\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\uix\layout.py", line 76, in __init__
     super(Layout, self).__init__(**kwargs)
   File "C:\Users\sherl\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\uix\widget.py", line 345, in __init__
     Builder.apply(self, ignored_consts=self._kwargs_applied_init)
   File "C:\Users\sherl\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\lang\builder.py", line 451, in apply
     self._apply_rule(widget, rule, rule, ignored_consts=ignored_consts)
   File "C:\Users\sherl\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\lang\builder.py", line 612, in _apply_rule
     e), cause=tb)
 kivy.lang.builder.BuilderException: Parser: File "<inline>", line 39:
 ...
      37:            on_press: root.manager.current = 'Form'
      38:        Button:
 >>   39:            text: 'Shift Out' if shift == True else 'Shift In'
      40:            on_press:
      41:                if shift: ShiftOut()
 ...
 BuilderException: Parser: File "<inline>", line 39:
 ...
      37:            on_press: root.manager.current = 'Form'
      38:        Button:
 >>   39:            text: 'Shift Out' if shift == True else 'Shift In'
      40:            on_press:
      41:                if shift: ShiftOut()
 ...
 NameError: name 'shift' is not defined
   File "C:\Users\sherl\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\lang\builder.py", line 249, in create_handler
     return eval(value, idmap), bound_list
   File "<string>", line 39, in <module>

   File "C:\Users\sherl\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\lang\builder.py", line 597, in _apply_rule
     rctx['ids'])
   File "C:\Users\sherl\AppData\Local\Programs\Python\Python36-32\lib\site-packages\kivy\lang\builder.py", line 254, in create_handler
     cause=tb)

1 个答案:

答案 0 :(得分:1)

您有以下错误:

  1. 改变&#34;来自kivy导入应用&#34;来自kivy.app导入App&#34;来自&#34;
  2. 从kivy.properties导入BooleanProperty&#34;添加&#34;
  3. 替换&#34; shift = False&#34; to&#34; shift = BooleanProperty(False)&#34;
  4. 删除对&#34;全球转移&#34;
  5. 的所有引用

    我已将程序分成Python程序和kv文件,如下所示。

    修改了main.py

    import sqlalchemy
    import os
    import datetime
    
    from kivy.app import App
    from kivy.properties import BooleanProperty
    from kivy.uix.screenmanager import ScreenManager, Screen
    
    admincode = "..."
    # SQL Functions
    # Incomplete as of now
    # shift will be pulled from database
    shift = BooleanProperty(False)
    
    
    def UserLogin(id='unfilled', password='unfilled'):
        global user
        global localhost_enabled
        if id == "localtest" and password == admincode:
            user = id
            localhost_enabled = True
            return True
        elif id == "servertest" and password == admincode:
            user = id
            localhost_enabled = False
            return True
    
    
    def UserLogout():
        user = ''
    
    
    def ShiftIn():
        shift = True
    
    
    def ShiftOut():
        shift = False
    
    
    def submitform(StartCash=0, EndCash=0):
        NetCash = EndCash - StartCash
        print("NetCash = {0}".format(NetCash))
    
    
    def ShiftGetter():
        if shift:
            return "Shift Out"
        else:
            return "Shift In"
    
    
    class LoginScreen(Screen):
        pass
    
    
    class HomeScreen(Screen):
        pass
    
    
    class FormScreen(Screen):
        pass
    
    
    sm = ScreenManager()
    sm.add_widget(LoginScreen(name='Login'))
    sm.add_widget(HomeScreen(name='Home'))
    sm.add_widget(FormScreen(name='Form'))
    
    
    class RealApp(App):
        def build(self):
            return sm
    
    if __name__ == '__main__':
        RealApp().run()
    

    real.kv

    #:kivy 1.10.0
    
    <LoginScreen>:
        BoxLayout:
            Label:
                text: 'ID:'
            TextInput:
                id: LoginInputUser
                text: ''
                multiline: False
            Label:
                text: "Password:"
            TextInput:
                id: LoginInputPassword
                text: ''
                password: True
                multiline: False
            Button:
                text: 'login'
                on_press:
                    if UserLogin(LoginInputUser.text, LoginInputPassword.text): LoginValidationText.text = ''
                    if UserLogin(LoginInputUser.text, LoginInputPassword.text): root.manager.current = 'Home'
                    else: LoginValidationText.text = 'Invalid Username or Password'
            Label:
                text: ''
                id: 'LoginValidationText'
    
    
    <HomeScreen>:
        BoxLayout:
            Button:
                text: 'Logout'
                on_press:
                    UserLogout()
                    root.manager.current = 'Login'
            Button:
                text: 'Open Submission Form'
                on_press: root.manager.current = 'Form'
            Button:
                text: 'Shift Out' if shift == True else 'Shift In'
                on_press:
                    if shift: ShiftOut()
                    else: ShiftIn()
    
    
    <FormScreen>:
        BoxLayout:
            Button:
                text: 'Back to menu'
                on_press: root.manager.current = 'Home'
            Label:
                text: 'Start Money:'
            TextInput:
                id: StartCash
                text: ''
                multiline: False
            Label:
                text: 'End Money:'
            TextInput:
                id: EndCash
                text: ''
                multiline: False
            Button:
                text: 'Submit'
                on_press: submitform(StartCash = int(StartCash.text), EndCash = int(EndCash.text))