python - 即使定义了 Tkinter 中的帧,也无法识别
问题描述
我正在向我的 tkinter 应用程序添加一个滚动条。我的 Tkinter 应用程序已经包含多个可以在它们之间切换的帧。为了在 上添加滚动条HomePage
,我创建了一个main_frame
和一个canvas
,将滚动条添加到并在被调用canvas
的内部创建了另一个框架。滚动条出现了,但是我的应用程序的另一部分是在. 我的问题是,由于etc. 是唯一定义的,因此无法识别它,并且我收到一条错误消息,指出canvas
second_frame
Add_page
Home_page
second_frame
second_frame
HomePage
Add_page
name 'second_frame' is not defined
. 我需要以某种方式确保在所有帧中都能识别这些变量。另外,我删除了StartPage
,ToDoPage
并TimetablePage
从示例中减小了代码的大小。
import calendar
import tkinter as tk
from tkinter import ttk
from tkcalendar import *
from datetime import datetime
from datetime import date
from time import strftime
from datetime import timedelta, datetime, date
x = 200
y = 250
c = 460
d = 290
e = 325
f = 355
g = 390
h = 420
i = 460
j = 490
#calendar and display in label
#window = Tk()
#window.title("StudyFriendO")
IMAGE_PATH = 'apple.png'
LARGE_FONT= ("Verdana", 24)
SMALL_FONT=("Verdana", 12)
class StudyFriendO(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.title("StudyFriendO") #naming window title
self.geometry('850x830') #size of window
container = tk.Frame(self)
container.pack(side="top", fill="both", expand = True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
#### ADDED
self.shared_data = { # Variables shared by all pages.
'name': tk.StringVar(value=''),
'assessment': tk.StringVar(value=''),
'due_date': tk.StringVar(value='')
}
self.frames = {}
for F in (StartPage, HomePage, ToDoPage, TimetablePage, AddPage): #list of multiple frames of program
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(StartPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
def set_date(self, cont):
#frame: StartPage = self.frames[cont]
#frame.date_label.config(text="Today's date is " + datetime.today().strftime("%B %d, %Y")) #function to get date from
frame2: HomePage = self.frames[HomePage]
frame2.date_label.config(text= datetime.today().strftime("%B %d, %Y")) #function to get date from
def getname(self, cont): #FUNCTION WHICH GRABS NAME FROM TEXT ENTRY
frame2: HomePage = self.frames[HomePage]
#### frame2.name_label.configure(text=nameentry.get() + "'s Planner ")
frame2.name_label.configure(text=self.shared_data['name'].get() + "'s Planner ")
def step(self):
self.frames[HomePage].my_progress['value']+= 5
def display(self, cont):
frame2: HomePage = self.frames[HomePage]
#blue box
global x , y , c , d , e , f , g, h, i, j
box_image = tk.PhotoImage(file='apple.png')
frame2.panel2 = tk.Label(second_frame, image=box_image, bg='#f7f6f6')
frame2.panel2.image = box_image
frame2.panel2.place(x=x, y=y)
x=x
y = y+260
#assessment name
frame2.n = tk.Label(frame2, text="", bg="#e0f6fc", font=60)
frame2.n.place(x=c, y=d, anchor='center')
frame2.n.configure(text=self.shared_data['assessment'].get())
c=c
d=d+260
#due date
frame2.d = tk.Label(frame2, text="Due:", bg="#e0f6fc", font=SMALL_FONT)
frame2.d.place(x=c, y=e, anchor='center')
c=c
e=e+260
#cal date
frame2.c= tk.Label(frame2, text="", bg="#e0f6fc", font=SMALL_FONT)
frame2.c.place(x=c, y=f, anchor='center')
frame2.c.configure(text=self.shared_data['due_date'].get())
c=c
f=f+260
#no. of days
plum = datetime.today().strftime("%m/%d/%y")
date_format = "%m/%d/%y"
a = datetime.strptime(plum, date_format)
pear = self.shared_data['due_date'].get()
b = datetime.strptime(pear, date_format)
delta = b - a
frame2.days = tk.Label(frame2, font=LARGE_FONT, bg="#e0f6fc")
frame2.days.place(x=c, y=g, anchor='center')
c=c
g=g+260
frame2.days.config(text=delta.days)
frame2.no_of_days=tk.Label(frame2, text="DAYS",bg="#e0f6fc")
frame2.no_of_days.place(x=c, y=h, anchor='center')
c=c
h=h+260
#progress bar
frame2.my_progress = ttk.Progressbar(frame2, orient='horizontal', length=300, mode='determinate')
frame2.my_progress.place(x=c, y=i, anchor='center')
c=c
i=i+260
frame2.my_button = tk.Button(frame2, text="Progress", command=self.step)
frame2.my_button.place(x=c, y=j, anchor='center')
c=c
j=j+260
class HomePage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
#### creating scrollbar ####
#create a main frame
main_frame = tk.Frame(self, bg='#f7f6f6')
main_frame.pack(fill='both', expand=1)
#create a canvas
my_canvas = tk.Canvas(main_frame, bg='#f7f6f6')
my_canvas.pack(side='left', fill='both', expand=1)
#add a scroll bar to the canvas
my_scrollbar = ttk.Scrollbar(main_frame, orient='vertical', command=my_canvas.yview)
my_scrollbar.pack(side='right', fill='y')
#create another frame inside the canvas
second_frame = tk.Frame(my_canvas)
# add that new frame to a window in the canvas
my_canvas.create_window((0,0), window=second_frame, anchor="nw", width="10000")
#label = tk.Label(self, text="Home", font = LARGE_FONT)
#label.pack(pady=10,padx=10)
#height of Y
tk.Label(main_frame, text="", fg="white", bg="#99cbd8").place(anchor='w', relheight=2, width='150') #ipadx=73)
#width of x
frame = tk.Frame(main_frame, bg="#c0e3ed", height=110)
frame.place(anchor='n', relwidth=2)
#LABEL WHICH DISPLAYS NAME FROM TEXT ENTRY
#tk.Label(self, text ="Name's Planner", fg="white", bg="#c0e3ed", font = LARGE_FONT).place(relx=0.5, y=50, anchor='center')
self.name_label = tk.Label(main_frame, text="", font=("Arial Bold", 40), bg="#c0e3ed")
self.name_label.place(relx=0.55, y=55, anchor='center')
self.date_label = tk.Label(second_frame, text="", bg="#c0e3ed")
# keep placing the label at top right corner
self.date_label.place(relx=1, y=0, anchor='ne')
#pack(side='top', anchor='ne')
button1 = tk.Button(main_frame, height=2, width=10, bg="#e0f6fc", text="Home", command=lambda: controller.show_frame(HomePage)) #button to navigate page
button1.place(x=35, y=145)
button1 = tk.Button(main_frame, height=2, width=10, bg="#e0f6fc", text="To Do", command=lambda: controller.show_frame(ToDoPage)) #button to navigate page
button1.place(x=35, y=225)
#(relx=0.2, rely=0.4, anchor='center')
button1 = tk.Button(main_frame, height=2, width=10, bg="#e0f6fc", text="Timetable", command=lambda: controller.show_frame(TimetablePage)) #button to navigate page
button1.place(x=35, y=305)
photo2 = tk.PhotoImage(file='apple.png') #photo1 is a variable
#label (window, image=photo1, bg="black") .grid(row=0, column=0, sticky=E)
panel = tk.Label(main_frame, image = photo2)
panel.image = photo2
panel.place(x=35, y=400)
#your upcoming assesments title
title = tk.Label(main_frame, text="Your Upcoming Assesments", bg='#f7f6f6', font=LARGE_FONT)
title.place(x=200, y=150)
add_button = ttk.Button(main_frame, text="Add", command=lambda: controller.show_frame(AddPage))
add_button.place(relx=0.8, rely=1, anchor='se')
save_button = ttk.Button(main_frame, text="Save")
save_button.place(relx=0.9, rely=1, anchor='se')
clear_button = ttk.Button(main_frame, text="Clear")
clear_button.place(relx=1, rely=1, anchor='se')
self.configure(bg='#f7f6f6')
class AddPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
#width of x
frame = tk.Frame(self, bg="#c0e3ed", height=110)
frame.pack(fill="x")
label = tk.Label(self, text="Add Assesment", font = LARGE_FONT, bg="#c0e3ed")
label.place(relx=0.5, y=50, anchor='center')
assessment_label = tk.Label(self, text="Enter assesment name:")
assessment_label.place(relx=0.5, y=200, anchor='center')
assessment_name = tk.Entry(self, textvariable=controller.shared_data['assessment'])
assessment_name.place(relx=0.5, y=220, anchor='center')
cal2 = Calendar(self, textvariable=controller.shared_data['due_date'], background="#e0f6fc", disabledbackground="white", bordercolor="light blue", headersbackground="light blue", normalbackground="#e0f6fc", foreground="black", normalforeground='black', headersforeground='white', selectmode="day", year=2021, month=8, day=9)
cal2.place(relx=0.5, y=400, anchor='center')
due_date = ttk.Button(self, text="Submit")
due_date.place(relx=0.5, y=510, anchor='center')
add_button = ttk.Button(self, text="Add Assesment", command=lambda: controller.display(HomePage))
add_button.place(relx=0.5, y=560, anchor='center')
button1 = ttk.Button(self, text="Home", command=lambda: controller.show_frame(HomePage)) #button to navigate page
button1.pack()
app = StudyFriendO()
app.mainloop()
解决方案
推荐阅读
- typescript - 方法重载不够具体
- javascript - drupal8 使用 java 脚本根据 from_date 显示 to_date - 未显示在表单上
- c++ - 为什么这段代码没有输出以及如何回收内存?
- excel - 从 Excel VBA 在 OneDrive 上创建文本文件
- javascript - 如何使用带有 Google Apps 脚本的主列表更新特定列中特定范围的数据验证?
- javascript - 在对象中添加字符并返回其计数输出
- has-and-belongs-to-many - CakePHP 4.x:如何创建一组表单控件来列出 HABTM(通过)关联中的所有值?
- javascript - 如何在 requestAnimationFrame 中使用多个线程来调用 Web Assembly 函数?
- javascript - 如何将模拟器连接到 redux-saga-firebase 应用程序
- swift - 使用 SwiftUI 更改 macOS 窗口级别(制作浮动窗口)