我是一名python初学者,请教各位:我用pysimplegui,查询数据库的返回数据想用window[key].pudate() 更新 inputtext(key)。但是只要调用查询函数后就更新失败,不调用查询函数就可以更新,不知为什么?期待各位能给予解答,万分感 谢!以下是代码,数据库我是用的access的accdb文件
#定义按员工姓名查询函数
def xmcx(ygxm):
# 连接数据库(不需要配置数据源),connect()函数创建并返回一个 Connection 对象
DBfile = r"K:\learpython\数据库.accdb" # 数据库文件需要带路径
cnxn = pyodbc.connect(r"DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + DBfile + ";Uid=;Pwd=;")
# cursor()使用该连接创建(并返回)一个游标或类游标的对象
crsr = cnxn.cursor()
# str(value)#将数值转换为字符串
sql2="""SELECT * from 员工信息 WHERE 员工姓名='%s'""" %(ygxm)
nums = crsr.execute(sql2) # 返回的是一个元组
values2=['','','','','','']
for item in nums:
print(item)
print(item[1])
values2[0] = item[0]
values2[1] = item[1]
values2[2] = item[2]
values2[3] = item[3]
values2[4] = item[4]
values2[5] = item[5]
print("执行到这了")
return (values2)
crsr.commit()
crsr.close()
cnxn.close()
import PySimpleGUI as sg
sg.theme('DarkAmber') # 设置当前主题
# 界面布局,将会按照列表顺序从上往下依次排列,二级列表中,从左往右依此排列
values1= ['a','b','c','d','e','f']
layout = [[sg.Text('Some text on Row 1')],
[sg.Text('员工姓名'), sg.InputText(key='--input1--')],
[sg.Text('部门'), sg.InputText(key='input2')],
[sg.Text('岗位'), sg.InputText(key='input3')],
[sg.Text('身份证号'), sg.InputText(key='input4')],
[sg.Text('工行账号'), sg.InputText(key='input5')],
[sg.Text('建行账号'), sg.InputText(key='input6')],
[sg.Button('查询'), sg.Button('修改'), sg.Button('新增'), sg.Button('删除'), sg.Button('返回主界面'), sg.Button('退出软件')]]
# 创造窗口
window = sg.Window('Window Title', layout,keep_on_top=True)
# 事件循环并获取输入值
while True:
event, values = window.read(timeout=100)
if event in (None, '退出软件'): # 如果用户关闭窗口或点击`Cancel`
print('You entered ', '退出软件')
break
elif event in ('查询'):
print('You entered ', '查询')
print('values的值是 ', values)
print('values的类型是 ', type(values))
#print('values1[0]的值是 ', values1[0])
values1=xmcx(values['--input1--'])#注释掉此行可以更新单行输入枉内容,运行此行不能更新单行输入框内容(想把查询结果显示在对应的单行输入框没反映)
print('values1[0]的值是 ', values1[0])
print('values1[1]的值是 ', values1[1])
print('values1[2]的值是 ', values1[2])
print('values1[3]的值是 ', values1[3])
print('values1[4]的值是 ', values1[4])
print('values1[5]的值是 ', values1[5])
values['--input1--'] = str(values1[0])
values['input2'] = str(values1[1])
values['input3'] = str(values1[2])
values['input4'] = str(values1[3])
values['input5'] = str(values1[4])
values['input6'] = str(values1[5])
window['--input1--'].update('我能更新') #调用查询数据库后不能把结果更新显示到单行文本输入框,达到查询的目的
window['input2'].update(values1[1]) #调用查询数据库后不能把结果更新显示到单行文本输入框,达到查询的目的
window['input3'].update(str(values1[2])) #调用查询数据库后不能把结果更新显示到单行文本输入框,达到查询的目的
window['input4'].update(str(values1[3])) #调用查询数据库后不能把结果更新显示到单行文本输入框,达到查询的目的
window['input5'].update(str(values1[4])) #调用查询数据库后不能把结果更新显示到单行文本输入框,达到查询的目的
window['input6'].update(str(values1[5])) #调用查询数据库后不能把结果更新显示到单行文本输入框,达到查询的目的
print('values1的类型是 ', type(values1)) #调用查询数据库后不能把结果更新显示到单行文本输入框,达到查询的目的
print('values的值是 ', values)
print('values的类型是 ', type(values))
print('str(values1[4])的类型是 ', type(values1[4]))
print('str(values1[4])的值是 ', str(values1[4]))
#print('返回的input1的值是 ',values['input1'])
#print('返回的values1的0元素的值是 ', values1[0])
#print('values最后的值是 ', values)
elif event in ('修改'):
print('You entered ', '修改')
elif event in ('新增'):
print('You entered ', '新增')
elif event in ('删除'):
print('You entered ', '删除')
elif event in ('返回主界面'):
print('You entered ', "返回主界面")
elif event in ('__TIMEOUT__'):
pass
else:
pass
window.close()
把这几个换在return之前呢
crsr.commit()
crsr.close()
cnxn.close()
感谢解答!按答 复调整return行顺序后也还是一样。但是我发现我上传的代码前还有一些其他的我认为无关的代码,原来认为应该是不相关的,但是刚才偿试把我认为不相关的代码删除后,发现竟然可以了。在此感谢高手回复!我的return语句确实顺序也是错的,但是不能更新的问题与那个顺序应该相关不大,主要是我前面还有一些代码影响了。不过还是万分感谢!
参考gpt:
结合自己分析给你如下建议:
根据您提供的代码,我发现您在调用 xmcx 函数后没有关闭数据库的连接,这可能导致 inputtext 无法更新。您可以尝试在 return (values2) 之前加上以下三行代码:
crsr.commit()
crsr.close()
cnxn.close()
这样可以确保每次查询后都释放数据库的资源,避免出现冲突或占用。
另外,我还发现您在更新 inputtext 时使用了 str() 函数来转换 values1 中的元素。这可能是多余的,因为 values1 中的元素应该已经是字符串类型了。您可以用 type() 函数来检查 values1 中的元素类型,如果已经是字符串,就不需要再转换了。
【以下回答由 GPT 生成】
你的代码中有一个问题导致了无法更新inputtext(key)的值。在查询函数xmcx()
中,查询完成后,你立即返回了values2
的值并关闭了游标和连接,而接下来的crsr.commit()
语句和window[key].update()
语句没有执行。
为了解决这个问题,你可以将crsr.commit()
和关闭游标和连接的代码移动到crsr.close()
和cnxn.close()
的前面。这样,你就可以在查询后关闭相关资源之前将结果返回并更新inputtext(key)
的值。
下面是修改过的代码:
# 定义按员工姓名查询函数
def xmcx(ygxm):
# 连接数据库(不需要配置数据源),connect()函数创建并返回一个Connection对象
DBfile = r"K:\learpython\数据库.accdb" # 数据库文件需要带路径
cnxn = pyodbc.connect(r"DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + DBfile + ";Uid=;Pwd=;")
# cursor()使用该连接创建(并返回)一个游标或类游标的对象
crsr = cnxn.cursor()
sql2 = "SELECT * from 员工信息 WHERE 员工姓名='%s'" %(ygxm)
nums = crsr.execute(sql2) # 返回的是一个元组
values2 = ['', '', '', '', '', '']
for item in nums:
print(item)
print(item[1])
values2[0] = item[0]
values2[1] = item[1]
values2[2] = item[2]
values2[3] = item[3]
values2[4] = item[4]
values2[5] = item[5]
print("执行到这了")
# 在关闭游标和连接之前提交事务并返回结果
crsr.commit()
crsr.close()
cnxn.close()
return values2
import PySimpleGUI as sg
sg.theme('DarkAmber') # 设置当前主题
# 界面布局,将会按照列表顺序从上往下依次排列,二级列表中,从左往右依此排列
values1 = ['a', 'b', 'c', 'd', 'e', 'f']
layout = [
[sg.Text('Some text on Row 1')],
[sg.Text('员工姓名'), sg.InputText(key='--input1--')],
[sg.Text('部门'), sg.InputText(key='input2')],
[sg.Text('岗位'), sg.InputText(key='input3')],
[sg.Button('查询'), sg.Button('更新')],
]
window = sg.Window('Window Title', layout)
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED:
break
elif event == '查询':
ygxm = values['--input1--']
result = xmcx(ygxm)
window['input2'].update(result[2]) # 更新部门
window['input3'].update(result[3]) # 更新岗位
elif event == '更新':
# 完成更新操作
pass
window.close()
现在你应该能够正常更新inputtext(key)的值了。请尝试并告诉我结果。如果还有其他问题,请随时提问。