Помогите внедрить интерфейс Tkinter в основную программу

Рейтинг: 0Ответов: 1Опубликовано: 19.04.2023

Если кратко: есть main.py, в котором есть основной класс моей программы MainProgramm(), в котором выполняются основные действия моей программы. В этом же классе происходит вызов функций из другого скрипта - Service.py - из класса Service().

Здесь я привожу упрощенный пример программы (это пример, чтобы только показать структуру)

UPD: сократила код, как могла

----main.py----

import Service

class MainProgramm():

    service=Service.Service() 
    print("Добро пожаловать в программу!!!") #Заменить на вывод в текстбокс
    a = 1
    b = 2
    c =service.Plus(a, b)

    d = service.ChoisNumber(a, b) 

----Service.py----

class Service():
    def __init__(self):
        pass

    def Plus(self,p1,p2):
        result = int(p1)+int(p2)
        return result

    def ChoisNumber(self,p1,p2):
        self.list = []
        self.list.append(p1)
        self.list.append(p2)
        print("Какое число выберете?\n") #Заменить на вывод в текстбокс

        while True:
            #Ожидание программы, пока пользователь не нажмёт кнопку "отправить"
            answer = input() #Заменить получением из entry
            if int(answer) in self.list:
                print(f"Вы выбрали {answer}!!!") #Заменить на вывод в текстбокс
                new_choise = answer
                break
            else:
                print("Выберите из списка!!!\n") #Заменить на вывод в текстбокс

        return new_choise

Планировала сделать похожее с интерфейсом - прописать код интерфейса в отдельном скрипте App.py. Я прописала интерфейс. Но вот проблема - я не понимаю, как связать скрипт с интерфейсом со скриптами программы main.py и Service.py.

---App.py----

    class Application():
    def __init__(self):
        self.root = ctk.CTk()
        self.root.geometry("750x450")
        self.root.minsize(750,450)

        self.txt_box = ctk.CTkTextbox(self.root, activate_scrollbars = True,
                                 corner_radius = 15,
                                 font = ('Courier New', 16, 'normal'))   
        self.txt_box.pack(side="top",fill="both",expand=1)
        self.txt_box.configure(wrap = "none", state = "disabled")   

        # ENTRY - поле ввода и кнопка отправки
        #По умолчанию кнопка и строка ввода НЕ АКТИВНЫ.
        # Они активируются ТОЛЬКО тогда, когда программа ожидает ответ от пользователя (ему нужно сделать выбор)
        self.entry = ctk.CTkEntry(master=self.root, placeholder_text="Ввод", state = ctk.DISABLED)
        self.entry.pack(side="left", fill="x", expand=1)

        self.button_entry = ctk.CTkButton(master=self.root, text="Enter", state = ctk.DISABLED)
        self.button_entry.pack(padx=20, pady=10)

        # BUTTON - кнопки запуска, остановки основной программы
        self.button_start = ctk.CTkButton(master=self.root, text="Начать", state = ctk.NORMAL)
        self.button_start.pack(padx=20, pady=10
       
    def PrintOnTextBox(self, prt_text):
        self.txt_box.configure(state="normal")
        self.txt_box.insert(index="end", text=prt_text + '\n')
        self.txt_box.configure(state="disabled")

Уже много какой литературы перечитала, но всё равно не понимаю как "внедрить" интерфейс в уже работающие скрипты. Переписывать код и начать создавать программу с нуля (чтобы сначала создать интерфейс, а потом прописать функционал) нет времени - скоро сдавать проект. Подскажите, пожалуйста, есть ли способ использования интерфейса из отдельного скрипта App.py в программе? И если есть способ, пожалуйста, подскажите как конкретно прописать всё это дело (мне всё равно это нужно будет прописывать в основную программу - намного объёмнее и с большими нюансами, чем в примере, приведённом выше)

Ответы

▲ 0Принят

Так как я не знаю ваших задумок, то покажу вкратце как можно сделать.

main.py

import customtkinter
from application import Application
from functional import Service


def main():
    customtkinter.set_appearance_mode("Light")

    application = Application()
    context = application.get_context()

    service = Service(context)
    service.chois_number()

    application.mainloop()


if __name__ == '__main__':
    main()

application.py

"""Здесь реализация приложения"""
from customtkinter import CTk


class Application(CTk): # Используйте наследование
    def __init__(self):
        super().__init__() # нужно инизиализировать

        self.geometry("450x380")
        self.minsize(350, 250)
        self.title("Моя программа")

    def get_context(self):
        return self

functional.py

from tkinter import Text
from customtkinter import CTkEntry


class Service:
    def __init__(self, context):
        self.context = context

        self.text_box = Text(self.context, width=50, height=5)
        self.text_box.grid(row=0, column=0)

    def chois_number(self):
        # print("Какое число выберете?\n") #Заменить на вывод в текстбокс
        self.text_box.insert("0.0", "Какое число выберете?\n")  # insert at line 0 character 0

        entry = CTkEntry(master=self.context,
                                       width=380,
                                       height=25,
                                       corner_radius=10)
        entry.grid(row=1, column=0)