tkinter - 使用 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')
解决方案
推荐阅读
- angular-material - 我选择了复选框,我运行了一个函数并更新了一些东西。执行后,我想在 UI 中取消选择这些复选框
- c++ - AllocatorAwareContainer 的 Hello World 示例
- javascript - 使用 onclick 目标删除多个 DOM
- ios - Flutter Doctor CocoaPods 未安装
- python - SQLAlchemy 不使用 db.create_all() 创建表
- privileges - Greenplum 中的权限不确定性
- python - 在使用 LIME 进行模型解释时处理类别、浮点和整数类型特征
- javascript - 删除服务器中的所有角色 | 不和谐.js
- python - 循环浏览 CSV 文件以提取特定列
- reactjs - 在 MS Edge 中反应 DatePicker 问题