我正在创建一个Python(3.4.3)-tkinter程序,想知道是否可以从另一个def内部为按钮的命令引用一个class(self.get_details)。我在任何地方都找不到解决这个问题的答案,所以我想问一下。

例子:

import tkinter as tk
...

class Widgets(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init___(self, parent)
        self.parent = parent

        self.initUI()

    def initUI():

        # Lots of other different tkinter widgets go here

        self.button = tk.Button(command=App(get_details))
        self.button.pack()


class PopUp(tk.TopLevel): ....

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

        self.initUI()

    def get_details(self):

        # Complete a function

    def initUI(self):

        self.parent.title("My Application")
        self.style = Style()
        self.style.theme_use("default")

        self.pack()

        self.widgets = Widgets(self)
        self.widgets.pack(side="top", anchor="center", fill="both", expand=True)

if __name__ == "__main__":

    root = tk.Tk()
    App(root).pack(side="top", fill="both", expand=True)
    root.resizable(0,0)
    root.mainloop()

所以我想一个属于Widgets()类的按钮来调用一个命令def get_details(self),该命令属于App()类,其中包含Widgets()类。

我希望我具有足够的描述性,很难说出这个问题。总的来说,我还是Python的新手。谢谢!

编辑:

按照建议,我将其更改为self.parent.get_details(),它起作用了!但是,当我从Widgets()内的def get_details()类引用tkinter小部件时:self.button,我得到:
AttributeError: 'App' object has no attribute 'button'

所以我尝试将按钮引用为:self.parent.button,我收到了:
AttributeError: 'tkapp' object has no attribute 'button'

我应该如何调用/引用按钮?谢谢!

最佳答案

App中,创建一个Widgets对象,并保存对它的引用self.widgets。这样做时,您将对该App对象的引用传递到Widgets对象中。该App实例引用保存为Widgets,保存在self.parent对象中。请记住,self的这两种用法是指不同的对象:在App中,self指的是该App对象的当前实例。在Widgets中,self指向该Widgets对象的当前实例。要引用其他类中的内容,必须使用正确的引用并遵循路径。

App实例中:

self             this App instance
.widgets         the Widgets instance it contains
.button          the button in that Widget instance

Widgets实例中:
self             this Widgets instance
.parent          the App object that created this Widgets object
.get_details     the get_details function in the parent App object

在下面,我修复了代码的剩余位(导致语法错误的...,未定义的Style等),并提供了一个小示例说明如何从另一个对象引用每个对象。该按钮最初显示“你好”,您可以通过单击将其更改为“再见”。
import tkinter as tk

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

        self.initUI()

    def initUI(self):

        # Lots of other different tkinter widgets go here

        self.button = tk.Button(text='hello', command=self.parent.get_details)
        self.button.pack()

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

        self.initUI()

    def get_details(self):

        self.widgets.button.config(text='goodbye')

    def initUI(self):

        self.parent.title("My Application")

        self.pack()

        self.widgets = Widgets(self)
        self.widgets.pack(side="top", anchor="center", fill="both", expand=True)

if __name__ == "__main__":

    root = tk.Tk()
    App(root).pack(side="top", fill="both", expand=True)
    root.resizable(0,0)
    root.mainloop()

关于不同类别中的Python 3 Tkinter按钮命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30690365/

10-09 00:01