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

为何使用tkraise()无法切换Tkinter框架?

问题分析与解决方案

核心问题

你的MainPage和AccNoWaiver类中,所有Canvas组件都是直接创建在**主窗口(controller)**上的,而非各自的Frame实例内部。这些Canvas用place(x=0,y=0)铺满主窗口后,会直接覆盖所有Frame容器,导致tkraise()切换Frame的操作完全被上层Canvas遮挡,看起来像是切换无效。

修复步骤

只需修改两个页面类中Canvas的父组件参数,把controller换成self(当前Frame实例)即可。

修改后的MainPage.py

from tkinter import Frame, Canvas

class MainPage(Frame):    
    def __init__(self, parent, controller):
        super().__init__(parent)
        self.photoList = []
        self.loadWidgets(controller)
                     
    def loadWidgets(self, controller):
        # 将Canvas父组件改为当前Frame实例self
        canvas = Canvas(
            self,
            bg = "#153246",
            height = 720,
            width = 1280,
            bd = 0,
            highlightthickness = 0,
            relief = "ridge"
        )

        canvas.place(x = 0, y = 0)

        canvas.create_text(
            336.0,
            602.0,
            anchor="nw",
            text="Please tap ID on the black box to start",
            fill="#F5F0E6",
            font=("Montserrat", 32 * -1)
        )

修改后的AccNoWaiver.py

from tkinter import Frame, Canvas

class AccNoWaiver(Frame):
    def __init__(self, parent, controller):
        super().__init__(parent)
        self.photoList = []
        self.loadWidgets(controller)
        
    def loadWidgets(self, controller):  
        # 将Canvas父组件改为当前Frame实例self
        canvas = Canvas(
            self,
            bg = "#153244",
            height = 720,
            width = 1280,
            bd = 0,
            highlightthickness = 0,
            relief = "ridge"
        )

        canvas.place(x = 0, y = 0)

        canvas.create_text(
            169.0,
            258.0,
            anchor="nw",
            text="Looks like you haven’t signed\n  the waiver, let’s solve that",
            fill="#F5F0E6",
            font=("Montserrat", 64 * -1)
        )

修复逻辑说明

  • 每个页面的Canvas现在属于各自的Frame,调用frame.tkraise()时,整个Frame(包括内部Canvas)会被提升到顶层,自然就能显示对应页面内容。
  • 原代码中Canvas直接挂载在主窗口,属于独立于Frame体系的顶层组件,Frame的层级切换无法影响到它们,因此始终显示最后创建的那个Canvas。

额外建议:可以在Frame内部给Canvas加上pack(fill="both", expand=True),让Canvas自动填充Frame,避免出现布局偏移问题。


内容的提问来源于stack exchange,提问作者HumboldtSquid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:10:18