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

Python中CustomTkinter框架类间共享动态变量roww的实现疑问

共享Frame间公共变量的解决方案

将公共变量roww托管在主控制器类中,让两个Frame通过控制器引用共享并修改该变量,是最清晰且易维护的实现方式。以下是针对你代码的具体修改:

1. 修改 gui.py

import customtkinter
from frame_1 import Frame1
from frame_2 import Frame2


class YfinanceGUI(customtkinter.CTkFrame):
    def __init__(self, app):
        super().__init__(app)
        self.app = app
        self.roww = 0  # 在这里定义共享的公共变量,初始值为0

        # 创建Frame时传递控制器引用
        self.frame_1 = Frame1(self.app, self)
        self.frame_1.pack(padx=10, pady=10)

        self.frame_2 = Frame2(self.app, self.frame_1, self)
        self.frame_2.pack(padx=10, pady=10)

        self.print_button = customtkinter.CTkButton(master=self, command=self.print_row)
        self.print_button.pack(padx=10, pady=10)

    def print_row(self):
        print(f"Current row: {self.roww}")  # 读取控制器中的roww

app = customtkinter.CTk()
running = YfinanceGUI(app)
running.pack(fill="both", expand=True)  # 确保主界面能显示
app.mainloop()

关键修正:

  • 让YfinanceGUI继承CTkFrame,解决内部按钮的父容器问题
  • 将roww作为控制器的实例属性,成为唯一的数据源
  • 创建Frame时传入控制器引用,让子Frame能访问该变量

2. 修改 frame_1.py

import customtkinter

class Frame1(customtkinter.CTkFrame):
    def __init__(self, master, controller, *args, **kwargs):
        super().__init__(master, *args, **kwargs)
        self.controller = controller  # 保存控制器引用

        # 读取控制器的roww来设置初始输入框的行
        self.entry_1 = customtkinter.CTkEntry(self)
        self.entry_1.grid(row=1 + self.controller.roww, column=0, padx=10, pady=10)

        self.entry_2 = customtkinter.CTkEntry(self)
        self.entry_2.grid(row=1 + self.controller.roww, column=1, padx=10, pady=10)

3. 修改 frame_2.py

import customtkinter

class Frame2(customtkinter.CTkFrame):
    def __init__(self, master, frame_1, controller, *args, **kwargs):
        super().__init__(master, *args, **kwargs)
        self.frame_1 = frame_1
        self.controller = controller  # 保存控制器引用

        self.button = customtkinter.CTkButton(master=self, command=self.add_row)
        self.button.pack(padx=10, pady=10)

    def add_row(self):
        # 读取控制器的roww设置新输入框位置
        self.entry_1 = customtkinter.CTkEntry(self.frame_1)
        self.entry_1.grid(row=1 + self.controller.roww, column=0, padx=10, pady=10)

        self.entry_2 = customtkinter.CTkEntry(self.frame_1)
        self.entry_2.grid(row=1 + self.controller.roww, column=1, padx=10, pady=10)

        self.controller.roww += 1  # 添加完成后更新共享变量

核心逻辑说明

  • 所有对roww的读取和修改都通过主控制器完成,确保变量唯一且同步
  • 子Frame通过持有控制器引用实现共享,避免了全局变量的混乱
  • 符合面向对象的封装原则,后续扩展功能时更容易维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:31:58