Помогите внедрить интерфейс Tkinter в основную программу
Если кратко: есть 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 в программе? И если есть способ, пожалуйста, подскажите как конкретно прописать всё это дело (мне всё равно это нужно будет прописывать в основную программу - намного объёмнее и с большими нюансами, чем в примере, приведённом выше)
Ответы (1 шт):
Так как я не знаю ваших задумок, то покажу вкратце как можно сделать.
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)