python pysimplegui inputtext() window[key].update()

我是一名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)的值了。请尝试并告诉我结果。如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^