Tkinter: вызов функции приложения из другого модуля - PullRequest
0 голосов
/ 13 июля 2020

Я создал небольшой фиктивный проект, чтобы проиллюстрировать мою цель:

Приложение состоит из двух виджетов, кнопки и текстовой области. При нажатии кнопки вызывает другой модуль. Затем вызываемый модуль обращается к мэйнфрейму и обращается к функции «вставить текст», действуя как журнал кода, запущенного в вызываемом модуле. Ниже приведен простой пример того, чего я пытаюсь достичь.

Структура проекта:

  • main.py

  • другой (папка)

    • module.py

main.py

from tkinter import *
import tkinter as tk
#from tkmacosx import Button ignore if not in MacOS

from another import module

class Example():
    def __init__(self,parent):
        self.main_frame = Frame(root)
        self.main_frame.pack()
        self.text = Text(self.main_frame)
        self.text.grid(row = 0, column = 0)
        self.button = Button(self.main_frame,
            height = 25,
            width = 150,
            command = self.call_another_module)
        self.button.grid(row = 1, column = 0)
        self.new_text_line("Start.")

    def call_another_module(self):
        self.new_text_line("button press!\n")
        module.Generic_class()

    def new_text_line(self, message):
        self.text.insert(INSERT, message + '\n')

if __name__ == '__main__':
    root = Tk()
    root.title("Example")
    app = Example(root)
    root.mainloop()

module.py

import tkinter as tk

#Shenanigans to import main
import os,sys,inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir)

import main


class Generic_class():
    #code of something
    #call new_text_line function 
    main.Example().new_text_line("Hurray!")
    #continue code

Я знаю, что вызов основного модуля, как показано в приведенном выше примере, неверен, поскольку я снова вызываю экземпляр приложения.

Буду очень признателен за отзывы по этой конкретной проблеме и другим подходам к этой проблеме.

1 Ответ

0 голосов
/ 13 июля 2020

См. Другие виджеты - все они получают другой виджет в качестве первого аргумента, и он является его родительским.

То же самое в вашем классе - получить родительский виджет в качестве первого аргумента

class GenericClass(): # PEP8: `UpperCaseNames` for classes

    def __init__(self, parent):
        self.parent = parent
        self.parent.new_text_line("Hurray!")

И затем вы можете создать его

module.GenericClass(self)

, и он будет иметь доступ ко всем функциям / переменным в Example

...