簡體   English   中英

使用 tkinter combobox 選定值作為 sql 查詢中的參數來影響另一個 ZA8284521647349D6ECBBZ0038A 中的選項

[英]Using tkinter combobox selected value as a parameter in a sql query to effect the options in another combobox

我對每個客戶都有多個參與,所以我想做的是讓 select 更容易獲得適當的參與。 我試圖通過有 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()

我認為您的問題是您混淆了將 arguments 傳遞給您在 function 中使用的函數並在 function 中使用變量。 您編寫 function 的方式是您問您它需要一個參數,而您沒有在帖子中傳遞一個參數。 我修改了 function 調用以在聲明的參數中傳遞一個值,並在 function 中使用它。 這應該可以解決您的問題。

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM