python - 使用 tkinter 组合框选定值作为 sql 查询中的参数来影响另一个组合框中的选项
问题描述
我对每个客户都有多个参与,所以我想做的是让选择合适的参与变得更容易。我试图通过有 2 个组合框来做到这一点,一个显示客户列表,一个显示参与列表。但是,我希望无论选择哪个客户,都可以缩小参与列表的范围。我知道我为参与下拉菜单正确传递了参数,但是当我尝试设置参与度1['values'] =engagement_dropdown() 时。我收到 TypeError:engagement_dropdown() 缺少 1 个必需的位置参数:'client_dropdown'。当我尝试在engagement_dropdown 中添加client_dropdown 时,我得到pyodbc.ProgrammingError:('SQL 包含1 个参数标记,但提供了72 个参数','HY000')。我错过了什么?
提前致谢!
from tkinter import *
from tkinter import ttk
import sys
import os
import backend
import pyodbc
from functools import partial
global conn
conn = pyodbc.connect(
Driver = '{ODBC Driver 17 for SQL Server}',
Server = 'server',
Database = 'db',
Trusted_Connection = 'Yes')
def client_dropdown():
cur = conn.cursor()
cur.execute("SELECT [ClientName] FROM TimeEntryDB.dbo.DimClientEngagements GROUP BY [ClientName] ORDER BY [ClientName] ASC")
data = []
for client_list in cur.fetchall():
data.append(client_list[0])
return data
def engagement_dropdown(client_dropdown):
cur = conn.cursor()
cur.execute("SELECT [EngagementName] FROM TimeEntryDB.dbo.DimClientEngagements WHERE [ClientName] = ?", (client_dropdown()))
data = []
for engagement_list in cur.fetchall():
data.append(engagement_list[0])
return data
screen = Tk()
screen.geometry("500x300")
screen.title("Time Entry Application")
heading = Label(text = "Review and Approve Time Entries and Timesheets", bg = "blue", fg = "white", width = "500", height = "2")
heading.pack()
#Client field
engagement_label = Label(text = "Client",)
engagement_label.place(x = 15, y = 50)
selected_client = StringVar()
client1 = ttk.Combobox(screen, width = 20, textvariable = selected_client, state = 'readonly')
client1['values'] = client_dropdown()
client1.place(x= 15, y = 70)
#Engagement field
engagement_label = Label(text = "Engagement",)
engagement_label.place(x = 200, y = 50)
selected_engagement = StringVar()
engagement1 = ttk.Combobox(screen, width = 40, textvariable = selected_engagement, state = 'readonly')
engagement1['values'] = engagement_dropdown()
engagement1.place(x= 200, y = 70)
screen.mainloop()
解决方案
我认为您的问题是您将参数传递给函数以供您在函数中使用并在函数内部使用变量感到困惑。你写你问你的函数的方式需要一个参数,你没有在你的帖子中传递一个参数。我修改了函数调用以在声明的参数中传递一个值并在函数中使用它。这应该可以解决您的问题。
from tkinter import *
from tkinter import ttk
import sys
import os
import backend
import pyodbc
from functools import partial
global conn
conn = pyodbc.connect(
Driver = '{ODBC Driver 17 for SQL Server}',
Server = 'server',
Database = 'db',
Trusted_Connection = 'Yes')
def client_dropdown():
cur = conn.cursor()
cur.execute("SELECT [ClientName] FROM TimeEntryDB.dbo.DimClientEngagements GROUP BY [ClientName] ORDER BY [ClientName] ASC")
data = []
for client_list in cur.fetchall():
data.append(client_list[0])
return data
def engagement_dropdown(client_val):
cur = conn.cursor()
sql_val = "SELECT [EngagementName] FROM TimeEntryDB.dbo.DimClientEngagements WHERE [ClientName] = " + str(client_val)
cur.execute(sql_val)
data = []
for engagement_list in cur.fetchall():
data.append(engagement_list[0])
return data
screen = Tk()
screen.geometry("500x300")
screen.title("Time Entry Application")
heading = Label(text = "Review and Approve Time Entries and Timesheets", bg = "blue", fg = "white", width = "500", height = "2")
heading.pack()
#Client field
engagement_label = Label(text = "Client",)
engagement_label.place(x = 15, y = 50)
selected_client = StringVar()
client1 = ttk.Combobox(screen, width = 20, textvariable = selected_client, state = 'readonly')
client1['values'] = client_dropdown()
client1.place(x= 15, y = 70)
#Engagement field
engagement_label = Label(text = "Engagement",)
engagement_label.place(x = 200, y = 50)
selected_engagement = StringVar()
engagement1 = ttk.Combobox(screen, width = 40, textvariable = selected_engagement, state = 'readonly')
engagement1['values'] = engagement_dropdown(selected_client)
engagement1.place(x= 200, y = 70)
screen.mainloop()
推荐阅读
- android - 无法使用 BitmapFactory.decodeFile 读取图像
- javascript - 防止 iPhone / Safari 上的后退按钮刷新 - Vue JS
- perl - Perl NFS 锁的奇怪行为
- c++ - “'operator<<' 不匹配(操作数类型是 '__FILE*' {aka '__sFILE64*'} 和 'MyObject' )错误 C++”
- python - 将基于函数的视图转换为基于类的视图
- signalr - 后端服务可以有多个 SignalR 连接吗?
- javascript - 我可以使用表单输入来过滤猫鼬数据吗?
- excel - Sub跳到第二个Sub,为什么
- php - PHP:我如何知道变量是否是“::class”?
- python - Matplotlib 谢尔宾斯基三角形