gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:00:52 26 4
gpt4 key购买 nike

我正在创建一个与服务器交互的程序,这个程序是供员工在移动设备上使用的,所以我使用的是 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. 将“from kivy import app”更改为“from kivy.app import App”
  2. 添加“从 kivy.properties 导入 BooleanProperty”
  3. 将“shift = False”替换为“shift = BooleanProperty(False)”
  4. 删除所有对“全局转移”的引用

我把程序分成了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()

真实.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))

关于python - 在 Kivy 中使用变量和函数时未定义名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45786909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com