从 Tkinter 框架调用函数到另一个框架

2023-11-27

我有一个页面,将在其中显示一些客户详细信息。因此,我创建了一个名为“客户详细信息”的页面,其中包含我需要的所有标签,并将这些标签的文本设置为变量。可惜它不起作用。标签创建于__init__方法,所以我无法“更新”它们,因为 init 仅在开始时被调用。所以我的想法是创建一个包含所有标签的新函数,当我有必要时我会调用该函数......这就是问题所在。我无法调用另一个函数tk.Frame。以下代码是该代码的简化版本。

import tkinter as tk
from tkinter import ttk

class Myapp(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        container = ttk.Frame(self, borderwidth=10, relief="sunken", width=200, height=100)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (HomePage, PageOne):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="N,S,E,W")
        self.show_frame(HomePage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()


class HomePage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = ttk.Label(self, text="HomePage")
        label.pack()
        button1 = ttk.Button(self, text="Quit",
                            command=lambda: quit())
        button1.pack()
        button2 = ttk.Button(self, text="Call Function in the other page/class to show the label",
                            command=lambda: PageOne.function()) # this is to do it from an other class. I can't do this
        button2.pack()
        button3 = ttk.Button(self, text="Page One",
                            command=lambda: controller.show_frame(PageOne))
        button3.pack()


class PageOne(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = ttk.Label(self, text="PageOne")
        label.pack()
        button1 = ttk.Button(self, text="Quit",
                            command=lambda: quit())
        button1.pack()
        button2 = ttk.Button(self, text="Call Function, in local it works..",
                            command=lambda: self.function())#this is to do it in local
        button2.pack()
        button3 = ttk.Button(self, text="HomePage",
                            command=lambda: controller.show_frame(HomePage))
        button3.pack()

    def function(self):
        label1 = ttk.Label(self, text="It Worked!")
        label1.pack()


app = Myapp()
app.mainloop()

要调用另一个对象的方法,您需要对该对象的引用。您复制的用于管理不同页面的代码旨在使这变得简单,但它缺少获取页面实例的函数。

因此,您首先需要做的是添加一个get_page控制器上的方法:

class Myapp(tk.Tk):
    ...
    def get_page(self, page_class):
        return self.frames[page_class]

这样,您就可以获取页面实例,并通过页面实例您可以调用该方法。

接下来,您需要保留对控制器的引用,以便可以从其他函数调用它:

class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        self.controller = controller
        ...

最后,您现在可以使用控制器来获取页面,并通过页面可以调用该函数。

我的建议是不要使用lambda除非你绝对需要它,而在这种情况下你不需要。当您使用正确的函数而不是lambda.

例如:

class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        ...
        button2 = ttk.Button(..., command=self.do_button)
        ...

    def do_button(self):
        page = self.controller.get_page(PageOne)
        page.function()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Tkinter 框架调用函数到另一个框架 的相关文章

随机推荐

  • 如何拦截粘贴到 NSTextView 中以删除不支持的格式?

    我正在尝试创建一个简单的基于 NSTextView 的窗口 以进行简单的所见即所得编辑 但是 我只想允许某些类型的格式 例如粗体 斜体 下划线和单个标题类型 但没有颜色或不同的字体 问题是 如果我只是使用 NSTextView 有人可以在另
  • iOS 推送通知 - 更新徽章而不发出警报?

    有没有办法在不显示警报或打开应用程序的情况下更新徽章中的数字 我正在编写一个应用程序 它应该始终在图标徽章中显示当前未读消息的数量 但我想这样做而不向用户显示任何警报 我正在为 iOS 5 0 进行开发 编辑 为了更清楚 我正在询问一种方法
  • Java String.replaceAll 正则表达式

    使用 java 删除输入字符串 如 MY CORP My Name 的 MY CORP 部分的正则表达式是什么String replaceAll方法 这样我只能获取 My Name 部分 I tried public static Stri
  • OpenCV:如何从以太网摄像头捕获帧

    我之前对 USB 网络摄像头进行了编程 其唯一目的是从摄像头获取实时帧并显示在窗口中 我使用 cvCaptureFromCAM 来实现此目的 它对于 USB 摄像头效果很好 请参见下面的代码 我想知道如何从千兆以太网摄像头捕获帧 我想我需要
  • C++ 中的重写删除应如何表现?

    我遇到的问题是 据我所知 删除运算符应该是静态函数 但有时编译器 VC 似乎将其视为动态函数 Given class Base public void operator new size t size allocate from custo
  • PHP:使用自动加载器时如何获取所有类

    我正在使用 Composer 生成自动加载器 autoload psr 4 SomeNamespace src SomeDir 我需要创建实现特定接口的所有类的实例 这相当容易但是 当不使用自动加载器时get declared classe
  • Jquery 使用数组中的数据创建选择标签

    我需要访问数据库并更新选择标签的选项 我的代码在这里 window load function getJSON http localhost ABC web app dev php doctorFillOption function dat
  • Silverlight:组合框中的默认值

    我想在组合框中显示默认文本 例如 选择一个人 消息 你能帮我一下吗 请注意 我正在使用域上下文中的数据绑定 谢谢 为了实现这一点 我使用了派生的ExtendedComboBox扩展内置类ComboBox班级 您可以在以下位置找到该类的源代码
  • HL7 FHIR 在 asp.net web api 中序列化为 json

    我正在使用 HL7 Fhirnuget由 Ewout Kramer 创建的软件包 0 9 3 我将其与 ASP NET Web API 绑定在一起 但不幸的是内置的 JSON 序列化无法正确生成 JSON 它包含很多这样的内容
  • 现代CPU会跳过零乘法吗?

    我想知道当两个数字中至少有一个为零时 当前的CPU是否避免将两个数字相乘 谢谢 这根据 CPU 和 在某些情况下 操作数的类型而有很大差异 较旧 较简单的 CPU 通常使用如下乘法算法 integer operator integer co
  • 文本溢出时的选取框文本

    这是我的问题 假设我有 3 个 div 标签 宽度均为 100 像素 lt DIV WIDTH gt Text in div 1 Text in div two it overflows Text in div three lt DIV W
  • NumPy 中的加权标准差

    numpy average 有一个权重选项 但是numpy std 才不是 有人对解决方法有建议吗 下面这个简短的 手动计算 怎么样 def weighted avg and std values weights Return the we
  • C中的查找表

    我正在用 C 创建一个查找表 当我定义这个时 typedef struct char action char message lookuptab lookuptab tab aa bb cc dd 它编译时没有错误 但是当我做这样的事情时
  • 如何从回收站恢复文件[重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 C 从回收站恢复文件 有人知道如何使用 C 和 Windows API 从回收站恢复文件吗 This link可以帮你 using System using System Collectio
  • 视差视图滚动(类似雅虎天气)

    严格来说 这不是一个编程问题 而是更多的 如何完成这个 问题 我很好奇 并且正在开发一个可能需要此功能的应用程序 如何实现左右视差滚动 要准确了解我的意思 请查看雅虎天气应用程序 它是免费的 不用担心 他们是只使用一个视图控制器还是为其中显
  • 如何在CSS中制作渐变边框

    我正在尝试将渐变应用于边框 我认为这就像这样做一样简单 border color moz linear gradient top 555555 111111 但这是行不通的 有谁知道边框渐变的正确方法是什么 The border image
  • 数组“包含”方法在 Google Apps 脚本中失败

    我试图在 Google Apps 脚本中对数组使用 includes 方法 但失败并显示 无法找到对象 1 4 3 7 中包含的函数 第 4 行 文件 test array 以下是代码 function test array var arr
  • Soundpool 还是媒体播放器?

    我正在为 Android 开发一款纸牌游戏 我希望每次投掷纸牌时都能播放投掷声音 这是同一个文件 我还会播放其他声音 例如背景音乐和某些点击声 您建议使用什么 声音池或创建 MediaPlayback 并播放它 每一个的优点 缺点是什么 我
  • 内联静态常量与静态常量变量

    我无法弄清楚哪种解决方案更好 因为我不清楚其中的区别 我想要一个包含一些可以在整个程序中自由使用的变量的文件 我的第一次尝试如下 头文件 Hosts h pragma once include
  • 从 Tkinter 框架调用函数到另一个框架

    我有一个页面 将在其中显示一些客户详细信息 因此 我创建了一个名为 客户详细信息 的页面 其中包含我需要的所有标签 并将这些标签的文本设置为变量 可惜它不起作用 标签创建于 init 方法 所以我无法 更新 它们 因为 init 仅在开始时