Tkinter GUI реализован с отдельным файлом Python с функциями

У меня проблема с наличием интерфейса GUI для реализации через второй файл, который просто содержит файл для чтения, сделанные графики и некоторые новые функции, которые будут оцениваться на основе этого.

Я пытаюсь создать приложение с графическим интерфейсом, используя Tkinter. То, как я делаю, заключается в следующем. У меня есть фоновый скрипт (скажем, Background.py), который имеет две функции. Функция X загружает файл данных, выполняет некоторые вычисления и выводит график. Я хочу вызвать это с помощью GUI-скрипта в другом файле (GUI.py), который открывает панель с кнопкой, и когда я нажимаю кнопку, должна быть оценена функция X в файле Background.py и показан график, После проверки графика я могу нажать другую кнопку, чтобы закрыть график и завершить функцию X. Теперь я могу выбрать другую кнопку, чтобы вызвать функцию Y в файле Background.py. Эти кнопки должны позволять мне вводить три значения, которые должны быть входными данными для функции Y в файле Background.py. Как только я нажму эту кнопку, она должна вызвать функцию Y и сделать то, что она просит. Теперь в конце, после этого я могу нажать кнопку, чтобы закрыть графический интерфейс.

Как я могу это сделать?. Общая грубая идея будет полезна.

Я поставил пример, насколько я могу:(по крайней мере, скелет кода) У меня есть фоновый файл скажем (Background.py) и файл графического интерфейса (скажем, GUI.py)

Background.py

import numpy

import matplotlib.pyplot as plt

import pandas

def progX():
     df = pd.read (myfile)

     ##df.stats # doing something and generating a plot from the file

    plt.boxplot(df['col'])

    plt.show()



def progY(y1, y2,y3):

    ## get the y1, y2, y3 from the GUI interface which the user has entered 

    #run a code...  and generate an output file

GUI.py

import Background as bg   
from tkinter import *
from tkinter.ttk import *

class GUI ():

    def create widgets(self):
        #....

    def create_panel2(self):
        #create buttons
        panel1 = ...
        btn1 = Button(panel1, text="yyyyy", command=bg.progA)
        btn1.pack() 

    def create_panel2(self):
        #create buttons
        panel2 = ...
        btn2 = Button(panel1, text="yyyyy", command=bg.progB)
        btn2.pack() 

All_Entries = []

window = Tk()
D=GUI(window)
window.mainloop()
runprogram1 = bg.progX()
runprogram2 = bg.probY(x, y, z)

Мой вопрос сейчас, имеет ли вышесказанное смысл? Как я могу вызвать фоновые функции из графического интерфейса? Операторы runprogram1 и runprogram2 определенно не верны. Как я могу это реализовать. Также, как я буду гарантировать, что я вызову программу Y в фоновом режиме, как только закрою вывод программы X?

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

1 ответ

Я предполагаю, что progA == progX, а также progB == progY?

Поскольку ваш код в настоящее время структурирован, некоторая функция в графическом интерфейсе должна получить y1, y2 и y3 из виджета (Entry()по-видимому), и перейти к progY, progY не могу получить эту информацию, b / c progY не знает о виджетах в графическом интерфейсе. Получить эти значения в классе GUI, привязав кнопку к другой функции, которая 1) вызывает .get() на Entry() widget, а затем 2) передает эти значения в progY.

Сделайте ваши поля ввода в графическом интерфейсе:

e1 = Entry(panel1)
e2 = Entry(panel1)
e3 = Entry(panel1)
self.entries = (e1, e2, e3)
for e in self.entries:
    e.pack()

Сделайте функцию, которая получает значения и вызовы progY в графическом интерфейсе:

def get_entries_call_y(self):
    e = [x.get() for x in self.entries]
    bd.progY(e[0], e[1], e[2])

Свяжите свою кнопку с get_entries_call_y (не для bd.progY):

btn2 = Button(panel1, text="yyyyy", command=get_entries_call_y)

Если вам нужен совет по структурированию программы с графическим интерфейсом в целом, попробуйте придерживаться (насколько это возможно) стандартной архитектуры интерфейса пользователя, такой как model-view-controller ( https://en.wikipedia.org/wiki/Model-view-controller). Решение, которое я описал выше, должно заставить вашу программу работать, но то, как вы структурировали свою программу, не является хорошим способом сделать это по многим причинам. Изучение MVC поможет вам определить, какая задача должна входить в какую функцию / класс / файл, даст вам логическую основу для добавления функций и улучшения вашего кода, а также позволит более эффективно создавать новые программы с графическим интерфейсом.

Или, по крайней мере, это то, что я получил от изучения MVC.

Другие вопросы по тегам