Как получить функции и переменные из других классов в tkinter? - PullRequest
0 голосов
/ 16 декабря 2018

Я все еще учусь использовать tkniter и классы.Я пытаюсь найти способ получить доступ к функциям и переменным из другого класса, когда задействован tkniter.Я хотел бы добавить в класс test3 кнопку, которая вызывает функцию test_function из класса test2, а также хотел бы увеличить значение self.x на 1 из класса test1 изнутрикласс test3.Любая помощь будет точной.

import tkinter as tk

class main(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)

        container = tk.Frame(self)
        container.grid()

        n = 0
        for f in (test1, test2, test3):
            frame = f(container)
            frame grid(row=1, column=n, rowspan=3)
            n=+1


class test1(tk.Frame):

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.x = -1


class test2(tk.Frame):

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

    def test_function(self):
        print("test")


class test3(tk.Frame):

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)


if __name__=="__main__":
    app = main()
    app.mainloop()

1 Ответ

0 голосов
/ 16 декабря 2018

Вы всегда должны будете сохранять ссылки на все объекты, которые вы хотите вызвать.Например, вы должны сохранить ссылку на экземпляр test2(), чтобы иметь возможность вызывать метод test_function().Я делаю это в self.instance_list.

Это происходит и наоборот;экземпляр test3() должен иметь ссылку на своего создателя, которую я передаю в вызове: frame = f(container, self).Поскольку только test3() требуется ссылка, я позволю другим классам отказаться от этой ссылки.

Тогда вам нужно правильно вызвать нужную функцию.В этом вам, вероятно, придется немного поэкспериментировать, пока он не заработает.Я знаю, что.Но здесь я вызываю функцию экземпляра раба моего хозяина:

command=master.instance_list[1].test_function
#       master      slave         function 

Или исследуем все приложение:

import tkinter as tk

class main(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        container = tk.Frame(self, bg='thistle')
        container.grid()
        n = 0
        self.instance_list = [] # Create list to save ref to instances
        for f in (test1, test2, test3):
            frame = f(container, self)  # Pass self to instance 
            frame.grid(row=1, column=n, rowspan=3)
            self.instance_list.append(frame) # Save ref to list
            n =+ 1

class test1(tk.Frame):
    def __init__(self, parent, _):
        tk.Frame.__init__(self, parent)
        self.x = -1

class test2(tk.Frame):
    def __init__(self, parent, _):
        tk.Frame.__init__(self, parent)

    def test_function(self):
        print("test")

class test3(tk.Frame):
    def __init__(self, parent, master):
        tk.Frame.__init__(self, parent)
        b = tk.Button(self, text='QA',
                  command=master.instance_list[1].test_function)
        b.pack(padx=20, pady=20)

if __name__=="__main__":
    app = main()
    app.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...