You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的时候再显示即可:

  1. 修改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)
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:39:01