首页 > 解决方案 > 使用 Tkinter,如何从数据库中填充子窗口中的组合框?

问题描述

我有一个基于 Tkinter 的程序,其主窗口包含一个菜单。在主窗口中,我有一个从 SQLite3 中的数据库表填充的组合框。如果在主窗口菜单中进行了选择,则会弹出一个子(顶层)窗口(DateWindow),其中包含一个组合框和两个 DateEntry 小部件。(请参阅:按类别和日期范围运行费用报告)。现在,我的

是在主窗口中填充组合框没有问题,但我无法让 DateWindow 中的组合框从 SQLite DB 中的同一源填充。我的

是在两个 DateEntry 小部件中选择开始日期和结束日期后,如何将它们的值“传输”到主窗口以运行报告?我只显示问题的相关代码。

我们将不胜感激您通常的善意帮助。

import tkinter as tk
from tkinter import ttk
from tkinter import Tk, Frame, Menu
from tkcalendar import Calendar, DateEntry
import sqlite3
import datetime as dt
import time
from tkinter import messagebox as msgbox
from prettytable import PrettyTable
from prettytable import MSWORD_FRIENDLY
import subprocess, sys

"""Create a child window to get the category and dates"""

class DateWindow(tk.Toplevel):

    def __init__(self, parent):
        super(DateWindow,self).__init__()

        conn= sqlite3.connect(r'/home/bushbug/Databases/NedCard')
        cur=conn.cursor()

        query=cur.execute("SELECT IncCat from Analyse where Indicator ='E' ")
            
        data=[]

        for row in cur.fetchall():
            data.append(row[0])
            #print(row[0])
        #return data
            
        cur.close()
        conn.close()       

        # global tAnalysis

        # tAnalysis=tIncAnalyse
        
        self.geometry("500x150")
        self.title("Get  dates for report: " )

        #global c_Category

        self.l_select_cat=tk.Label(self,text='Category',fg='blue')
        self.l_select_cat.grid(row=2, column=0,sticky='w',pady=3,padx=5)
        self.c_select_cat=ttk.Combobox(self,width=20)
        #self.c_select_cat['values']=data()
        
        self.c_select_cat.grid(row=2,column=1,sticky='news',pady=3)

        #self.c_Category=self.c_select_cat.get()
            

        self.l_Start_Date=tk.Label(self,text="Enter the start date for report", fg="blue")
        self.l_Start_Date.grid(row=4,column=0, sticky="w", padx=5, pady=10)
        self.d_Start_Date = DateEntry(self,width=10,fg="white",Locale='en_US',date_pattern='yyyy-mm-dd')
        self.d_Start_Date.grid(row = 4, column=1,sticky="w",pady=3)
        
        
        self.l_End_Date=tk.Label(self,text="Enter the end date for report", fg="blue")
        self.l_End_Date.grid(row=6,column=0, sticky="w", padx=5)
        self.d_End_Date = DateEntry(self,width=10,fg="white",Locale='en_US',date_pattern='yyyy-mm-dd')
        self.d_End_Date.grid(row = 6, column=1,sticky="w",pady=3)

        self.b_Run_Report=ttk.Button(self, text="Run Report", width=10,command=Run_Report_By_Spend_Cat)
        self.b_Run_Report.grid(row=7,column=2, sticky="e", pady=10) 

"""Create a Menu for making selections"""
class Menu_ex():

    def __init__(self,parent):    
        self.parent = parent
        self.initUI()

    def initUI(self):

        self.menubar=Menu(self.parent)
        self.parent.config(menu=self.menubar)

        fileMenu=Menu(self.menubar, tearoff=0)
        
        
        fileMenu.add_command(label='Exit', command=self.onExit)
        fileMenu.add_command(label='Add a new Item', command=self.open_window)
        self.menubar.add_cascade(label='File',menu=fileMenu)

        reportMenu=Menu(self.menubar,tearoff=0)
        
        
        reportMenu.add_command(label='Show all Income', command=Run_income_rpt)
        reportMenu.add_command(label='Income Analysis')
        reportMenu.add_separator()
        reportMenu.add_command(label='Show all Expenses', command=Run_expenses_rpt)
        reportMenu.add_separator()

        sub_menu=Menu(reportMenu,tearoff=0)
        sub_menu.add_command(label='Run expense spend by category',command=Run_Report_By_Spend_Cat)
        sub_menu.add_command(label='Run expense report by category and date range',command=self.Open_DateWindow)
        sub_menu.add_command(label='Run expense report by supplier')
        sub_menu.add_command(label='Run expense report by customer and date range')

        reportMenu.add_cascade(label='Expenses Analysis',menu=sub_menu)
        reportMenu.add_separator()
        reportMenu.add_command(label='Exit',command=self.onExit)

        self.menubar.add_cascade(label='Reports',menu=reportMenu)

    def onExit(self):

        self.parent.destroy()

    def open_window(self):
        self.window = Window(self)
        self.window.grab_set()


    def Open_DateWindow(self):

        self.window=DateWindow(self)
        self.window.grab_set()


"""Create main window"""

class MainWindow(tk.Tk):

    def __init__(self):    
        super().__init__()
        
        global format_date
        date = dt.datetime.now()
        format_date=f"{date:%Y-%m-%d}"
        print(format_date)
        self.title('My Nedbank Credit Card')
        self.geometry('1150x450')
        self.grid_rowconfigure(0,weight=1)
        self.grid_columnconfigure(0,weight=1)
        self.resizable(width=False,height=False)
        self.menu = Menu_ex(self)

def Expense_values_input(): 

    """ Populate the Expenses analysis combobox"""

    conn= sqlite3.connect(r'/home/bushbug/Databases/NedCard')
    cur=conn.cursor()

    query=cur.execute("SELECT IncCat from Analyse where Indicator ='E' ")
    
    data=[]

    for row in cur.fetchall():
        data.append(row[0])
        print(row[0])
    return data
    
    cur.close()
    conn.close()


self.e_ExpAnalyse_Exp=ttk.Combobox(self.l_Income, width=30)
    self.e_ExpAnalyse_Exp.grid(row=6, column=7, padx=5,pady=15, sticky='news')
    self.e_ExpAnalyse_Exp['values']=Expense_values_input()
    self.e_ExpAnalyse_Exp.current(newindex=None)
    self.e_ExpAnalyse_Exp.bind('<<ComboboxSelected>>',Comboclick)
    self.e_ExpAnalyse_Exp.bind('<FocusOut>',get_data_to_save)
    self.e_ExpAnalyse_Exp.config(state='disabled')

标签: tkintertoplevel

解决方案


推荐阅读