Использование выбранного поля со списком tkinter в качестве параметра в запросе sql для изменения параметров в другом поле со списком - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть несколько заданий для каждого клиента, поэтому я пытаюсь сделать выбор подходящего задания проще. Я пытаюсь сделать это, имея 2 комбинированных списка, один, который отображает список клиентов, и один, который отображает список вовлечения. Однако я хочу, чтобы список обязательств был сужен в зависимости от того, какой клиент был выбран. Я знаю, что правильно передаю параметр для раскрывающегося списка, но когда я пытаюсь установить engagement1 ['values'] = engagement_dropdown (). Я получаю TypeError: engagement_dropdown (), пропускающий 1 обязательный позиционный аргумент: 'client_dropdown'. Когда я пытаюсь добавить client_dropdown в engagement_dropdown, я получаю pyodb c .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()

1 Ответ

0 голосов
/ 04 мая 2020

Я думаю, что ваша проблема в том, что вы путаете передачу аргументов в функции для использования внутри функции и использования переменных внутри функции. То, как вы написали функцию, которую вы спрашиваете, требует аргумента, а вы не передаете его в своем посте. Я изменил вызов функции, чтобы передать значение в объявленном аргументе и использовать его внутри функции. Это должно решить вашу проблему.

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