python - Python Tkinter:在帧之间传递日历选择
问题描述
我正在使用 tkinter 设置一个 GUI,并希望设置一个日期选择器,然后可以将用户选择的日期传递到下一帧。我尝试过使用全局变量,但从来没有做到这一点。我最接近的是使用控制器创建每个框架的页面实例,然后使用该对象访问其他框架属性。在“存款”框架中,我创建了“DateSelect”框架的一个实例,以便访问日历对象并使用 get_date() 函数。但是,它总是返回创建日历对象时的默认日期,而不是用户选择的日期。
我的代码包含一个用于访问 API 的登录初始框架。在我解决此问题时,应用程序会忽略此框架并直接转到 DateSelect 框架,并且 API 端点 url 和凭据已被删除。
我的代码:
import tkinter as tk
from tkinter import ttk
import tessitura
from tkcalendar import *
import datetime
from datetime import date
LARGEFONT = ("Verdana", 15)
endpoint=""
class tkinterApp(tk.Tk):
# __init__ function for class tkinterApp
def __init__(self, *args, **kwargs):
# __init__ function for class Tk
tk.Tk.__init__(self, *args, **kwargs)
self.title("Box Office Deposit")
self.geometry("1200x800")
# creating a container
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
# initializing frames to an empty array
self.frames = {}
# iterating through a tuple consisting
# of the different page layouts
for F in (Login, DateSelect, Deposit):
frame = F(container, self)
# initializing frame of that object from
# login, dateselect, deposit respectively with
# for loop
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(DateSelect)
# to display the current frame passed as
# parameter
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
def get_page(self, page_class):
return self.frames[page_class]
# first window frame Login
class Login(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
# label of frame Layout 2
label = ttk.Label(self, text="RAMP Credentials", font=LARGEFONT)
invalid = ttk.Label(self)
# putting the grid in its place by using
# grid
label.grid(row=0, column=0, padx=10, pady=10)
invalid.grid(row=4, column=0)
ttk.Label(self, text="Username").grid(row=1, column=0)
ttk.Label(self, text="Password").grid(row=2, column=0)
e1 = ttk.Entry(self)
e2 = ttk.Entry(self, show="*")
e1.grid(row=1, column=1)
e2.grid(row=2, column=1)
def validate_login():
invalid.config(text="")
global username, password, credentials
username = e1.get()
password = e2.get()
method = ""
request_type = "GET"
params = {}
data = {}
credentials =
login = tessitura.rest_call(endpoint, credentials, request_type, method, params=params, data=data,
timeout=10)
if "ActiveDirectoryUserName" in login:
return controller.show_frame(DateSelect)
e1.delete(0, 'end')
e2.delete(0, 'end')
else:
return invalid.config(text="Invalid Login")
e2.delete(0, 'end')
button1 = ttk.Button(self, text="Login",
command=lambda: validate_login())
# putting the button in its place by
# using grid
button1.grid(row=3, column=1, padx=10, pady=10)
## button to show frame 2 with text layout2
#button2 = ttk.Button(self, text="Page 2",
# command=lambda: controller.show_frame(Page2))
# putting the button in its place by
# using grid
#button2.grid(row=2, column=1, padx=10, pady=10)
# second window frame page1
class DateSelect(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
label = ttk.Label(self, text="Please Select Deposit Date", font=LARGEFONT)
label.grid(row=0, column=4, padx=10, pady=10)
self.cal = Calendar(self, selectmode="day", year=2021, month=5, day=13)
self.cal.grid(row=3, column=4, padx=10, pady=10)
# button to show frame 2 with text
# layout2
button1 = ttk.Button(self, text="Logout",
command=lambda: controller.show_frame(Login))
# putting the button in its place
# by using grid
button1.grid(row=1, column=1, padx=10, pady=10)
# button to show frame 2 with text
# layout2
button2 = ttk.Button(self, text="Get Deposit",
command=lambda: controller.show_frame(Deposit))
# putting the button in its place by
# using grid
button2.grid(row=2, column=1, padx=10, pady=10)
# third window frame page2
class Deposit(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
date_select = self.controller.get_page(DateSelect)
date_label = ttk.Label(self, text=date_select.cal.get_date())
date_label.grid(row=3, column=4, padx=10, pady=10)
label = ttk.Label(self, text="Deposit", font=LARGEFONT)
label.grid(row=0, column=4, padx=10, pady=10)
# button to show frame 2 with text
# layout2
button1 = ttk.Button(self, text="Return To Date Select",
command=lambda: controller.show_frame(DateSelect))
# putting the button in its place by
# using grid
button1.grid(row=1, column=1, padx=10, pady=10)
# button to show frame 3 with text
# layout3
button2 = ttk.Button(self, text="Logout",
command=lambda: controller.show_frame(Login))
# putting the button in its place by
# using grid
button2.grid(row=2, column=1, padx=10, pady=10)
# Driver Code
app = tkinterApp()
app.mainloop()
解决方案
推荐阅读
- delphi - 使用主键移动到 TFDQuery 中的特定记录
- python - 结合 OpenCV、Python、Tkinter 和 PiCamera
- sql - 如何提取不满足条件的记录?
- javascript - 非常简单的 vue.js 组件生成超出最大调用堆栈大小
- http - json.decode() 输入意外结束(在字符 1 处)
- data-structures - 现实生活中的数据结构示例
- python - 如何使用 Sphinx autodoc 记录单个私有属性?
- kubernetes - 如何使用 kubectl --server-dry-run 输出申请的最终响应正文?
- wordpress - 永久 301 重定向规则在 WordPress 网站的 .htaccess 文件中不起作用
- javascript - 复选框事件侦听器未触发