【问题标题】:How can each Combobox get its own SQL?每个 Combobox 如何获得自己的 SQL?
【发布时间】:2021-10-11 12:16:02
【问题描述】:

我正在使用 Python 3 和 TKinter。我需要第二个组合来加载基于第一个组合选择的信息。在第一个组合框中选择后,第二个组合框为空。

第一个组合做正确的事,但第二个组合没有得到任何信息,即使我使用的是相同类型的代码。

我尝试过组合 sql 语句,但这也无济于事。

谁能告诉我我做错了什么。不用说我是新手。

这是我的代码:

from os import name
import tkinter as tk
from tkinter import *
import sqlite3
import random
#======= IMPORTS COMBOBOX =============
from tkinter import ttk
from sqlite3 import Error
from tkinter.font import BOLD
    

def Clear(event):

    usernameLabel.config(textvariable=' ')
    passwordLabel.config(textvariable=' ')
    
    print('It worked')

def Str3f(event):
    global Str3
    Str3 = Person_Combo.get()
    print(Str3)
    
    #   SQL CONNECTION TO TABLE "NAMES"
    sqlName = sqlite3.connect('Pass.db')
    c2 = sqlName.cursor()
    c2.execute('SELECT Name FROM Passwords WHERE Person= ?', (Str3, ))
    # WHERE Person= ?', (Str3, ))

    global mydata2
    mydata2 = c2.fetchall()

    # global Namers2
    # Namers2 = [mydata2]
    c2.close()
    sqlName.close()


def EnterClick():

    global Str1
    global Str2
    global UName
    global UPass
    
    Str1 = Person_Combo.get()
    Str2 = Name_Combo.get()
    print(Str2)

    UName = StringVar()
    UPass = StringVar()

    connection = sqlite3.connect('Pass.db')
    cursor = connection.cursor()
    cursor.execute('SELECT * FROM Passwords WHERE Person= ? AND Name= ?', (Str1, Str2, ))
    record = cursor.fetchone()
    
    UName.set('Username:  ' + record[4])
    UPass.set('Password:  ' + record[5])

    usernameLabel.config(textvariable=UName, font=("Halvetica", 16))
    passwordLabel.config(textvariable=UPass, font=("Halvetica", 16))

    cursor.close()
    connection.close()

#   ---------------------------------------------------------------------------------

#=========== MAIN WINDOW ===============

root = Tk()

root.geometry('500x700')
root.title('Password Saver')
my_menu = Menu(root)



#   CREATE LABELS AND TEXT ENTRY TO DISPLAY RESULTS
TopLabel = Label(root, text='PASSWORD SAVER', font=('Halvetica 20'))
TopLabel.pack(pady=30)

#     SQL CONNECTION TO TABLE "PERSON"
sqlPerson = sqlite3.connect('Pass.db')
c1 = sqlPerson.cursor()
# c2 = sqlPerson.cursor()
c1.execute('SELECT DISTINCT Person FROM Passwords')
# c2.execute('SELECT Name From Passwords')
mydata1 = c1.fetchall()
# mydata2 = c2.fetchall()

Namers = [mydata1]
# Namers2 = [mydata2]
c1.close()
# c2.close()
sqlPerson.close()


    #     Create a person combobox
Person_Combo = ttk.Combobox(root, value=mydata1)
Person_Combo.pack(pady=20)
# Person_Combo.bind('<FocusIn>')

global Str3
Str3 = Person_Combo.get()
print(Str3)

#   SQL CONNECTION TO TABLE "NAMES"
sqlName = sqlite3.connect('Pass.db')
c2 = sqlName.cursor()
c2.execute('SELECT Name FROM Passwords WHERE Person= ?', (Str3, ))
# WHERE Person= ?', (Str3, ))

mydata2 = c2.fetchall()

c2.close()
sqlName.close()

#     Create a results combobox
Name_Combo = ttk.Combobox(root, value=mydata2)
Name_Combo.pack(pady=20)



Button1 = ttk.Button(root, text="Enter", command=EnterClick)
Button1.pack(pady=20)

usernameLabel = Label(root,)
usernameLabel.pack()

passwordLabel = Label(root, )
passwordLabel.pack()

Person_Combo.bind('<FocusIn>', Clear)

root.mainloop()
    

【问题讨论】:

    标签: python sql tkinter


    【解决方案1】:

    由于您尝试在创建 Person_Combo 后立即从其获取所选值,因此您应该得到空字符串,因此您不应该从数据库中获得任何结果。

    您需要在选择Person_Combo 的项目时触发的函数(很可能是Str3f())中执行上述操作。可以通过绑定虚拟事件&lt;&lt;ComboboxSelected&gt;&gt;来完成:

    def Str3f(event):
        #global Str3
        Str3 = Person_Combo.get()
        print(Str3)
    
        #   SQL CONNECTION TO TABLE "NAMES"
        sqlName = sqlite3.connect('Pass.db')
        c2 = sqlName.cursor()
        c2.execute('SELECT Name FROM Passwords WHERE Person = ?', (Str3, ))
    
        #global mydata2
        mydata2 = [row[0] for row in c2.fetchall()]
    
        Name_Combo["values"] = mydata2  # update Name_Combo
        Name_Combo.set("")  # clear selection of Name_Combo
    
        c2.close()
        sqlName.close()
    
    ...
    
    #     Create a person combobox
    Person_Combo = ttk.Combobox(root, value=mydata1)
    Person_Combo.pack(pady=20)
    # Person_Combo.bind('<FocusIn>')
    Person_Combo.bind("<<ComboboxSelected>>", Str3f)
    
    #     Create a results combobox
    Name_Combo = ttk.Combobox(root) # no values assigned initially
    Name_Combo.pack(pady=20)
    
    ...
    

    【讨论】:

    • 非常感谢您的回复。我试图在函数中使用它,但在 Name_Combo 中没有显示任何内容。我用它来集中注意力。今晚晚些时候我会尝试将它绑定到 ComboboxSelected 并告诉你是否成功。
    • 非常感谢...你太棒了。你解决了我无法思考的问题。
    猜你喜欢
    • 2017-01-20
    • 1970-01-01
    • 2019-10-20
    • 2014-04-11
    • 1970-01-01
    • 2014-05-01
    • 2011-07-13
    • 2010-09-07
    • 2011-03-18
    相关资源
    最近更新 更多