当第一个脚本运行第二个脚本方法时,第二个脚本无法识别第一个脚本的变量

Posted

技术标签:

【中文标题】当第一个脚本运行第二个脚本方法时,第二个脚本无法识别第一个脚本的变量【英文标题】:Second script does not recognize variables of first script when first script runs second script method 【发布时间】:2021-01-15 23:33:52 【问题描述】:

我有这个脚本MainGUI.py,它从另一个脚本Main2.py 调用一个方法。 MainGUI.py 脚本与名为gui.kv.kv 文件链接,其中调用了方法submitbutton()。这是Main2.py中定义的函数,最终会遇到sm.current = "main"这一行,这是我在我的母文件MainGUI.py中定义的,其中sm是ScreenManager类,“main”是我在gui.kv 文件中定义的Screen 类。当函数执行时,我希望 ScreenManager sm 转到“主”屏幕。但不知何故,我收到以下错误:

NameError: name 'sm' is not defined

所以我假设我在文件之间链接变量时做错了,但我找不到什么。这是(相关的)代码:

MainGUI.py

# importing functionality
from kivy.app import App
from kivy.lang import Builder

from kivy.uix.floatlayout import FloatLayout
from kivy.core.window import Window
from kivy.uix.screenmanager import ScreenManager, Screen
from Logini.Main.Main2 import LoginWindow
from Logini.Main.Main2 import RegisterWindow

# defining screenmanager and screens
class sm(ScreenManager):
    pass
class LoginWindow(LoginWindow):
    pass
class RegisterWindow(RegisterWindow):
    pass
class MainWindow(Screen):
    pass
class PreferencesWindow(Screen):
    pass

# linking .py with .kv
kv = Builder.load_file('gui.kv')

# creating application class that returns variable kv
class MyApp(App):
    def build(self):
        return (kv)

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

Main2.py

from kivy.uix.screenmanager import Screen
from kivy.properties import ObjectProperty
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from GUI.MainGUI import sm

class LoginWindow(Screen):
    username = ObjectProperty(None)
    password = ObjectProperty(None)

    def submitbutton(self):
        username = self.username.text
        password = self.password.text
        with open("users.txt", 'r') as ff:
            for i in ff:
                usernamee, passwordd = i.split(';')
                print(usernamee, passwordd)
                print(username, password)
                if username == usernamee and password == passwordd.strip():
                    sm.current = "main"

gui.kv

sm:
    LoginWindow:
    MainWindow:
    PreferencesWindow:
    RegisterWindow:

<LoginWindow>:
    name: "login"
    username: username
    password: password

    FloatLayout:
        Button:
            pos_hint:"x":0.3,"y":0.375
            size_hint: 0.4, 0.1
            text: "Submit"
            font_size: 30
            on_release:
                root.manager.transition.direction = "down"
            root.submitbutton()
            background_normal: ''
            background_color: 1, .3, .4, .85

一些帮助会很棒!我已经尝试使用from GUI.MainGUI import smMain2.py 中导入sm,但这只会引入更多错误。

编辑:我的文件夹结构如下,项目根文件夹:project/GUI/MainGUI.py, gui.kv project/Logini/Main/Main2.py。调用类是有效的,所以我假设导入类没有错误。

【问题讨论】:

显示你的文件夹结构.. @adirabargil 我已将文件夹结构添加为帖子底部的“编辑”。 【参考方案1】:

尝试:

from project.GUI.MainGUI import sm

【讨论】:

这又会产生另一个错误:Error: cannot import name 'LoginWindow' from 'Logini.Main.Main2' (C:\Users\timda\PycharmProjects\group-31\project\Logini\Main\Main2.py) 所以不知何故我的MainGUI.py 脚本无法从Main2.py 导入LoginWindow 类,当我没有该行时它可以.

以上是关于当第一个脚本运行第二个脚本方法时,第二个脚本无法识别第一个脚本的变量的主要内容,如果未能解决你的问题,请参考以下文章

尝试运行第二个命令时,在 bash 脚本中运行 AWS 服务会产生错误,我做错了吗?

为啥“使用严格”导致函数未定义

使用脚本中的参数调用第二个脚本

使用 QPushbutton 将变量传递到第二个脚本并执行它

如何从单独的 php 脚本执行 php 脚本而不会丢失第二个脚本的输出?

脚本不适用于引用组件的第二个实例