Tkinter程序SQL查询结果无法显示在Label组件求助
解决方案
核心问题修正与优化
原代码存在三个关键问题:控制台输出未关联界面、Label组件绑定错误、数据库连接参数格式错误,同时针对表头翻译和数据显示体验做了优化。
修改后的完整代码
from __future__ import print_function import sqlalchemy as sa import pandas as pd import tkinter as tk from tkinter import scrolledtext from PIL import ImageTk, Image # 数据库配置 server = 'ABQSQ03t' username = 'TECO//AAPWP' password = '*****@#' timeout = '60' database = 'NMGC_PIM_DEV' driver = 'ODBC+Driver+17+for+SQL+Server' # 修正数据库连接URL(参数用&分隔,原代码多?会导致连接失败) engine = sa.create_engine( f'mssql+pyodbc://{server}/{database}?username={username}&password={password}&timeout={timeout}&driver={driver}' ) cn = engine.connect() root = tk.Tk() root.title("合规性SQL后台报表") HEIGHT = 800 WIDTH = 1000 # 背景图片设置 canv = tk.Canvas(root, width=80, height=80, bg='white') canv.place(relwidth=1, relheight=1) img = ImageTk.PhotoImage(Image.open("NMGC_Emera_color240x75.png")) canv.create_image(20, 20, anchor='nw', image=img) background_label = tk.Label(root, image=img) background_label.place(x=0, y=0, relwidth=1, relheight=1) # 英文表头转中文映射 column_mapping = { 'APPGROUPID': '应用组ID', 'APPTITLE': '应用标题', 'DESCRIPTION': '描述', 'ORGAREANAME': '组织区域名称', 'CONGROUPNAME': '配置组名称', 'DISPLAYLEVELCOUNT': '显示层级数', 'CreatedDate': '创建日期', 'CreatedBy': '创建人', 'ModifiedDate': '修改日期', 'ModifiedBy': '修改人' } # 查询与界面更新函数 def test_function(entry): try: # 执行SQL查询并转为DataFrame df = pd.read_sql(f'Select * from [dbo].[{entry}]', con=cn) # 替换表头为中文 df.rename(columns=column_mapping, inplace=True) # 将数据转为格式化字符串(隐藏索引) result_text = df.to_string(index=False) # 清空结果框并插入新内容 result_box.delete(1.0, tk.END) result_box.insert(tk.INSERT, result_text) except Exception as e: # 捕获错误并显示在界面 result_box.delete(1.0, tk.END) result_box.insert(tk.INSERT, f"查询错误: {str(e)}") # 界面布局 canvas = tk.Canvas(root, height=HEIGHT, width=WIDTH) canvas.pack() # 输入框与按钮框架 frame = tk.Frame(root, bg='#7B94AD', bd=5) frame.place(relx=0.5, rely=0.1, relwidth=0.75, relheight=0.1, anchor='n') entry = tk.Entry(frame, bg='white') entry.place(relwidth=0.65, relheight=1) button = tk.Button(frame, text='生成报表', font=40, command=lambda: test_function(entry.get())) button.place(relx=0.7, relheight=1, relwidth=0.3) # 结果显示区域(用带滚动的Text替代Label,适配大量数据) lower_frame = tk.Frame(root, bg='#7B94AD', bd=10) lower_frame.place(relx=0.5, rely=0.25, relwidth=0.75, relheight=0.6, anchor='n') result_box = scrolledtext.ScrolledText(lower_frame, bg='white', font=('Arial', 10)) result_box.place(relwidth=1, relheight=1) root.mainloop()
关键修改说明
- 数据库连接修复:将URL中的多个
?替换为&,确保连接参数正确解析 - 表头翻译:通过
column_mapping字典实现中英文表头替换 - 数据显示优化:用
scrolledtext.ScrolledText替代Label,支持滚动查看大量数据,避免内容溢出 - 界面逻辑修正:直接在查询函数中操作Text组件,实现数据从数据库到界面的传递,替代原控制台输出逻辑
- 错误处理:添加异常捕获,将查询错误直接显示在界面,便于排查问题
内容的提问来源于stack exchange,提问作者user19512239
相关产品推荐
相关产品推荐

