从另一个 Python 文件调用函数

Calling function from another Python file

我试图在单击按钮后调用另一个 Python 文件中的函数。我已经导入文件并使用 FileName.fuctionName() 到 运行 函数。问题是我的异常不断出现。我猜被调用函数的数据不是 grabbed.What 我想做的是让用户填写一个 Tkinter gui 然后单击一个按钮。单击按钮后,将要求用户扫描他们的标签 (rfid),然后该数据将被发送到 firebase 实时数据库,该数据库将存储用户输入的信息以及 card_id 和 user_id 扫描标签时创建的。

我有点不知所措,因为除了捕获异常之外我没有收到任何其他错误,有什么想法吗?我已经发布了下面的代码和评论。

错误: 赋值前引用了局部变量'user_id'

from tkinter import *
#Second File
import Write
from tkcalendar import DateEntry
from firebase import firebase

data = {}

global user_id

# Firebase 
firebase= firebase.FirebaseApplication("https://xxxxxxx.firebaseio.com/",None)

# button click
def sub ():
    global user_id

    #setting Variables from user input
    name = entry_1.get()
    last = entry_2.get()
    number = phone.get()
 
    try:
        #Calling Function from other file
        Write.scan()
        if Write.scan():
            #getting the New User Id
            user_id= new_id

        
            #User Info being sent to the Database 
            data = {
            'Name #': name,
            'Last': last,
            'Number': number,
            'Card #':user_id
            }
        results = firebase.post('xxxxxxxx/User',data)
               
    except Exception as e:
        print(e)    

# setting main frame
root = Tk()
root.geometry('850x750')
root.title("Registration Form")

label_0 = Label(root, text="Registration form",width=20,font=("bold", 20))
label_0.place(x=280,y=10)

label_1 = Label(root, text="First Name",width=20,font=("bold", 10))
label_1.place(x=80,y=65)

entry_1 = Entry(root)
entry_1.place(x=240,y=65)

label_2 = Label(root, text="Last Name",width=20,font=("bold", 10))
label_2.place(x=68,y=95)

entry_2 = Entry(root)
entry_2.place(x=240,y=95)

phoneLabel = Label(root, text="Contact Number : ",width=20,font=("bold", 10))
phoneLabel.place(x=400,y=65)

phone = Entry(root)
phone.place(x=550,y=65)

Button(root, text='Submit',command = sub,width=20,bg='brown',fg='white').place(x=180,y=600)

root.mainloop()

Write.py 正在导入文件

import string
from random import*
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
reader = SimpleMFRC522()

#Function being called
def scan():
    try:
        #Creating user hash
        c = string.digits + string.ascii_letters
        new_id = "".join(choice(c) for x in range(randint(25,25)))
        print("Please Scan tag")
    
        #Writing to tag
        reader.write(new_id)
        if reader.write(new_id):
            print("Tag Scanned")
        
        else:
            print("Scan Tag First")
        print("Scanning Complete")
    
    finally:
        GPIO.cleanup()

无法判断您的问题是什么,因为您的代码中没有地方引用 user_id,因此您引用的错误消息不可能来自您提供的代码。但是,我看到一个非常常见的错误,您的代码似乎正在犯这个错误,这很可能解释了为什么您希望 user_id 在您的代码中的某处定义,但它不是...

在您的第一个代码块中,sub 函数未设置全局 user_id。相反,当 sub 函数调用 user_id=new_id 时,它正在创建和设置该函数的局部变量。当该函数结束时,该调用的结果将丢失并且全局 user_id 仍未定义。

您想要的是将 user_id 定义为 sub() 函数内部的全局变量。只需在函数定义顶部附近的任何位置添加 global user_id

这是我正在谈论的例子:

global x

def sub():
    x = 3
    
sub()
print(x)

结果:

Traceback (most recent call last):
  File "t", line 7, in <module>
    print(x)
NameError: global name 'x' is not defined

鉴于:

global x

def sub():
    global x
    x = 3
    
sub()
print(x)

结果:

3

我发现一个文件中的值 new_id 不会影响另一个文件中同名的值,原因与第一个问题类似。在这两个地方都出现了,new_id 是一个只存在于封闭函数中的局部变量。

我看到的另一个问题是您连续两次调用 Write.scan()。你的意思是要调用它两次?我预计不会。

此外,您正在测试 Write.scan() 的 return 值,但该函数没有 return 值。所以我认为第一个文件中 if 块中的代码永远不会 运行.

全局变量通常不是一个好主意,因为它们很容易出错,而且往往会掩盖代码的真正作用。 “永不言败”,但我会说我很少发现 Python 中需要全局变量。在您的情况下,我认为使用 Write.scan() return 新用户 ID 的值而不是将其作为全局传回会更好。由于您正在测试 Write.scan() 的值,也许这就是您已经考虑过的事情。以下是我为解决这三个问题所做的更改,并希望让您的代码按您想要的方式工作...

...

def sub ():
    
    ...
    
    try:
        #Calling Function from other file
        new_id = Write.scan()
        if new_id:
            #getting the New User Id
            user_id= new_id
    
    ...

...

def scan():
    try:
        
        ...
        
        new_id = "".join(choice(c) for x in range(randint(25,25)))
        
        ...

        return new_id

    finally:
        GPIO.cleanup()