从另一个 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()
我试图在单击按钮后调用另一个 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()