我为每个客户安排了多个项目,因此我想做的就是使选择合适的项目更加容易。我正在尝试通过具有2个组合框来做到这一点,其中一个组合框显示客户列表,而另一个组合框显示参与度列表。我希望无论选择哪个客户,都能缩小参与度列表。我知道我已经正确地为参与度下拉列表传递了参数,但是当我尝试设置engagement1 ['values'] = activity_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(selected_client)
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()
engagement1.place(x= 200, y = 70)
screen.mainloop()