Tkinter多框架应用中step函数未被识别报错如何解决
问题根因
你遇到的报错本质不是step函数未定义,是step方法中访问的self.my_progress属性不存在:你在display方法里把进度条绑定到了HomePage类的实例frame1上,但是step方法里的self指向的是StudyFriendO主类实例,主类本身没有my_progress这个属性,所以会抛出属性不存在的错误。
修复方案
直接修改step方法,从主类的frames字典中获取HomePage实例后再操作进度条即可:
def step(self): self.frames[HomePage].my_progress['value'] += 5
优化建议
当前代码每次点击add assessment按钮都会新建一个进度条和按钮,多次点击会出现组件重叠的问题,建议把进度条和按钮提前在HomePage的__init__方法中初始化,默认隐藏,调用display的时候再显示即可:
- 修改
HomePage类的初始化逻辑:
class HomePage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) add_button = ttk.Button(self, text="Add", command=lambda: controller.show_frame(AddPage)) add_button.place(relx=0.8, rely=1, anchor='se') # 提前初始化进度条和按钮,默认隐藏 self.my_progress = ttk.Progressbar(self, orient='horizontal', length=300, mode='determinate') self.my_button = tk.Button(self, text="Progress", command=controller.step)
- 修改
display方法,不需要重复创建组件,直接显示即可:
def display(self, cont): frame1: HomePage = self.frames[HomePage] frame1.my_progress.place(x=460, y=460, anchor='center') frame1.my_button.pack(pady=20)
修复后完整可运行代码
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 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 (HomePage, 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(HomePage) def show_frame(self, cont): frame = self.frames[cont] frame.tkraise() def step(self): self.frames[HomePage].my_progress['value']+= 5 def display(self, cont): frame1: HomePage = self.frames[HomePage] frame1.my_progress = ttk.Progressbar(frame1, orient='horizontal', length=300, mode='determinate') frame1.my_progress.place(x=460, y=460, anchor='center') frame1.my_button = tk.Button(frame1, text="Progress", command=self.step) frame1.my_button.pack(pady=20) class HomePage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) add_button = ttk.Button(self, text="Add", command=lambda: controller.show_frame(AddPage)) add_button.place(relx=0.8, rely=1, anchor='se') class AddPage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) 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()
内容的提问来源于stack exchange,提问作者Minbutt
相关产品推荐
相关产品推荐

