Как получить доступ к тексту внутри виджета ввода из функции в tkinter?

#python #tkinter

#python #tkinter

Вопрос:

У меня есть назначение графического интерфейса python, в котором я должен создать приложение с графическим интерфейсом, которое будет оценивать функцию одной переменной в указанном диапазоне входных значений. Мы должны использовать классы. Я написал следующий код:

 from tkinter import *
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
import tkinter.font as font

class eval_interface:
    def __init__(self):
        self.root = Tk()
        self.root.title("Function Evaluator")
        self.topframe = Frame(self.root)
        self.createTopFrame()
        self.topframe.grid(row=0, column=0, columnspan=10, sticky=N   S   W   E)
        self.frame2 = Frame(self.root)
        self.createFrame2()
        self.frame2.grid(row = 1, column = 0, pady = 15, columnspan = 10, sticky = N   S   W   E)
        self.frame3 = Frame(self.root)
        self.createFrame3()
        self.frame3.grid(row=2, column=0, pady=15, columnspan=10, sticky=N   S   W   E)
        self.frame4 = Frame(self.root)
        self.frame5 = Frame(self.root)
        self.createFrame5()
        self.frame5.grid(row=4, column=0, pady=15, columnspan=10, sticky=N   S   E   W)
        self.createFrame4()
        self.frame4.grid(row = 3, column = 0, pady = 15, columnspan = 10, sticky = N S E W)
        self.root.mainloop()

    def createTopFrame(self):  #Frame containing title
        title = Label(self.topframe, text="Function evaluator and plotter".center(228, " "), font=font.Font(size=17))
        title.grid(row=0, column=0, columnspan=7)

    def createFrame2(self):  #Frame containing function Entry widget
        title = Label(self.frame2, text = "Enter the function in x : ", font = font.Font(size = 14))
        title.grid(row = 0, column = 0, sticky = N   S   W   E)
        function_entry = Entry(self.frame2, width  = 150)
        function_entry.grid(row = 0, column = 1, sticky = N   S   W   E)

    def createFrame3(self):  #Frame containing range Entry widgets
        range_label = Label(self.frame3, text="Enter the range of the function from : ", font = font.Font(size = 14))
        lower_range_entry = Entry(self.frame3, width=10)
        range_label2 = Label(self.frame3, text=" to ")
        upper_range_entry = Entry(self.frame3, width=10)
        range_label.grid(row=1, column=0, sticky="nsew")
        lower_range_entry.grid(row=1, column=1)
        range_label2.grid(row=1, column=2, sticky="nsew")
        upper_range_entry.grid(row=1, column=3, sticky="nsew")

    def createFrame4(self):  #Frame containing button widgets
        btn_evaluate = Button(self.frame4, text = "Evaluate", font = font.Font(size = 14), command = self.evaluate())
        btn_plot = Button(self.frame4, text = "Plot", font = font.Font(size = 14))
        btn_clear = Button(self.frame4, text = "Clear", font = font.Font(size = 14))
        btn_exit = Button(self.frame4, text = "Exit", font = font.Font(size = 14), command = exit)
        btn_evaluate.grid(row=0, column=0, padx=10, pady=5)
        btn_plot.grid(row=0, column=1, padx=10, pady=5)
        btn_clear.grid(row=0, column=2, padx=10, pady=5)
        btn_exit.grid(row=0, column=3, padx=10, pady=5)

    def createFrame5(self):  #Frame containing Result Textbox
        res_text = Text(self.frame5, width = 95, height = 55, padx = 10)
        res_text.grid(row = 0, column = 0)

    def evaluate(self):
        x = 10

    def clear(self):
        z=12


eval_interface()
 

Мой вопрос в том, как мне получить доступ к данным, введенным пользователем в трех виджетах ввода (в кадрах 2 и 3) при нажатии кнопки оценки? И после того, как я получил доступ к данным и выполнил с ними необходимые операции, как мне отобразить результат в текстовом поле во фрейме 5? (Я только что закодировал некоторое случайное утверждение в функциях evaluate и clear, чтобы увидеть графический интерфейс вывода.)

Ответ №1:

Если вы хотите получить доступ к Entry виджетам внутри evaluate() функции, вам необходимо изменить три локальные переменные function_entry , lower_range_entry а upper_range_entry также переменные экземпляра self.function_entry , self.lower_range_entry и self.upper_range_entry . То же самое для Text виджета res_text . Затем вы можете получить значения из трех Entry виджетов и вставить результат во self.res_text внутреннюю evaluate() функцию:

     def createFrame2(self):  #Frame containing function Entry widget
        title = Label(self.frame2, text = "Enter the function in x : ", font = font.Font(size = 14))
        title.grid(row = 0, column = 0, sticky = N   S   W   E)
        self.function_entry = Entry(self.frame2, width  = 150)
        self.function_entry.grid(row = 0, column = 1, sticky = N   S   W   E)

    def createFrame3(self):  #Frame containing range Entry widgets
        range_label = Label(self.frame3, text="Enter the range of the function from : ", font = font.Font(size = 14))
        self.lower_range_entry = Entry(self.frame3, width=10)
        range_label2 = Label(self.frame3, text=" to ")
        self.upper_range_entry = Entry(self.frame3, width=10)

        range_label.grid(row=1, column=0, sticky="nsew")
        self.lower_range_entry.grid(row=1, column=1)
        range_label2.grid(row=1, column=2, sticky="nsew")
        self.upper_range_entry.grid(row=1, column=3, sticky="nsew")

    ...

    def createFrame5(self):  #Frame containing Result Textbox
        self.res_text = Text(self.frame5, width = 95, height = 55, padx = 10)
        self.res_text.grid(row = 0, column = 0)

    def evaluate(self):
        # get content from entries
        x = self.function_entry.get()
        lower = self.lower_range_entry.get()
        upper = self.upper_range_entry.get()
        # example on inserting result into text box
        result = ", ".join([x, lower, upper]) # or whatever you want
        self.res_text.insert("end", result)

    ...
 

Также command=self.evaluate() внутри createFrame4() должно быть command=self.evaluate вместо.