|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 hynet1024 于 2023-6-29 23:07 编辑
我在Python代码的开头定义了一个全局变量,但在引用时总提示未定义,请求指点
见代码:定义在第10行,引用在第47行(第32行没问题)
- import sys
- import datetime
- import openpyxl
- from PySide6.QtWidgets import QApplication, QWidget
- from PySide6.QtCore import Slot
- from IDcheck_ui import Ui_Form
- global code_data
- weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
- check = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
- class MyWidget(QWidget):
- def __init__(self):
- super().__init__()
- self.ui = Ui_Form()
- self.ui.setupUi(self)
- @Slot()
- def on_select_clicked(self):
- import tkinter as tk
- from tkinter import filedialog as fd
- root = tk.Tk()
- root.withdraw()
- filename = fd.askopenfilename(filetypes=[('Excel Files', '*.xlsx')])
- self.ui.excelfile.setPlaceholderText(filename.replace('/','\\'))
- ws = openpyxl.load_workbook(filename)['Sheet1']
- code_data = dict(list(ws.iter_rows(values_only=True)))
- @Slot()
- def on_check_clicked(self):
- ID = self.ui.ID.text()
- if len(ID) == 18: # 身份证号长度是否为18位
- if ID[0:17].isdigit(): # 前17位是否为数字
- id17 = list(map(int, list(ID[0:17]))) # 将前17位转换为数字列表
- if int(ID[6:14]) in range(19000101, int(datetime.datetime.now().strftime("%Y%m%d")) + 1):
- try:
- datetime.date.fromisoformat(ID[6:14])
- mod = sum(list(map(lambda x, y: x * y, id17, weight))) % 11
- if str(check[mod]) == ID[-1]: # 判断余数与对应的校验码是否匹配
- # print(len(code_data))
- if len(code_data) == 0:
- address = '户籍地址不详'
- else:
- address = code_data.get(ID[0:6], "户籍地址不详")
- self.ui.infor.setPlainText(f'校验无误:性别[{"女" if int(ID[-2]) % 2 == 0 else "男"}],户籍地址为:{address}')
- else:
- self.ui.infor.setPlainText(f'身份证末位校验码不正确(应为[{check[mod]}])')
- except ValueError:
- self.ui.infor.setPlainText(f'出生日期[{ID[6:10]}年{ID[10:12]}月{ID[12:14]}日]不是合法的日期')
- else:
- self.ui.infor.setPlainText(f'出生日期[{ID[6:14]}]不正确,应介于[19000101--{datetime.datetime.now().strftime("%Y%m%d")}]之间')
- else:
- self.ui.infor.setPlainText('身份证前17位应全部为数字')
- else:
- # self.ui.infor.textCursor().insertText('身份证号长度应为18位\n')
- self.ui.infor.setPlainText('身份证号长度应为18位')
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- window = MyWidget()
- window.setWindowTitle('身份证合法性校验')
- window.show()
- sys.exit(app.exec())
-
复制代码
代码中定义了一个全局变量`code_data`,但在`on_check_clicked`方法中的引用提示未定义的错误。这是因为在`on_select_clicked`方法中定义的局部变量`code_data`与全局变量`code_data`命名相同,导致在`on_check_clicked`方法中无法访问到全局变量。
要解决这个问题,你可以在`on_select_clicked`方法内将`code_data`声明为全局变量,使用`global`关键字进行声明,这样就可以在其他方法中正常引用了。
修改代码如下:
- @Slot()
- def on_select_clicked(self):
- import tkinter as tk
- from tkinter import filedialog as fd
- root = tk.Tk()
- root.withdraw()
- filename = fd.askopenfilename(filetypes=[('Excel Files', '*.xlsx')])
- self.ui.excelfile.setPlaceholderText(filename.replace('/','\\'))
- ws = openpyxl.load_workbook(filename)['Sheet1']
- global code_data # 将局部变量声明为全局变量
- code_data = dict(list(ws.iter_rows(values_only=True)))
复制代码
通过添加`global code_data`语句,将`code_data`声明为全局变量,就可以在其他方法中正常引用了。
|
|