从外部类连接方法

2024-09-30 14:29:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个类App(主类)和OptionsWin(创建顶层窗口的类)


import tkinter as tk

class App():
    def __init__(self):
        self.root = tk.Tk()
        #other methods
        self.opt_win = OptionsWin(self.root,'Circle')

    def show(self):
        #get value of the RadioButton
        pass
class OptionsWin():
    def __init__(self, root, shape=None):
        self.parent = root
        self.root = tk.Toplevel(self.parent)
        if shape == 'Circle':
            self.create_circle_opt()
    def create_circle_opt(self):
        #Other Widgets
        # Types of Circles
        self.radVar = tk.IntVar()
        self.radVar.set(0)

        tk.Radiobutton(self.root, text='Equal Ellipse', variable=self.radVar,
                       value=0, command=None).grid(column=2, row=0, padx=10,
                                                   pady=5, sticky=tk.W)
        tk.Radiobutton(self.root, text='Flat Ellipse', variable=self.radVar,
                       value=10, command=None).grid(column=2, row=1, padx=10,
                                                   pady=5, sticky=tk.W)
        tk.Radiobutton(self.root, text='Tall Ellipse', variable=self.radVar,
                       value=20, command=None).grid(column=2, row=2, padx=10,
                                                   pady=5, sticky=tk.W)

我想将RadioButtons命令arg连接到App class show函数。 有没有什么办法或者更好的办法来组织我的班级结构来解决这个问题


Tags: textselfnoneappvaluedefrootvariable
2条回答

因此,您将单选按钮的值存储在OptionsWin实例self.radVar的变量中。如果您在应用程序实例中有权访问该实例,则可以轻松地引用它。事实上这就是你想要的-

class App():
    def __init__(self):
        self.root = tk.Tk()
        #other methods
        self.opt_win(self.root,'Circle')

我们看不到self.opt\u win的定义。我猜这应该是

self.opt_win = OptionsWin(self.root,'Circle')

在这种情况下,您的show方法

def show(self):
    #get value of the RadioButton
    return self.opt_win.radVar

如果我对opt\u win的猜测是错误的(可能是构造函数方法),那么答案的基础是keep a reference to the OptionsWin instance so you can access the variables on it

编辑

为了能够从孩子身上引用父母,你可以-

class OptionsWin():
    def __init__(self, app, shape=None):
        self.app = app
        self.root = tk.Toplevel(app.root)
        if shape == 'Circle':
            self.create_circle_opt()

    def show(self):
        self.app.show()

然后你的应用程序构造器变成

class App():
    def __init__(self):
        self.root = tk.Tk()
        # pass self into the child, and then it can reference this object
        self.opt_win = OptionsWin(self,'Circle')

OptionsWin成为App中的成员怎么样

class App():
    def __init__(self):
        self.root = tk.Tk()
        self.options_win = OptionsWin()
        #other methods
        self.opt_win(self.root,'Circle')

相关问题 更多 >