Сохранить Tkinter Entry в новой переменной - PullRequest
0 голосов
/ 05 июля 2018

Я пишу программу, которая позволяет пользователю вводить определенную температуру в текстовое поле, а затем отображать соответствующий график на основе ввода пользователя. Я знаю, что программа работает, когда я вручную записываю начальную температуру, но я не могу понять, как получить введенное пользователем значение, сохраненное в правильной переменной, а затем использовать. Я опишу всю программу ниже, однако моя проблема в классе под названием PageTwo. Я хочу, чтобы введенное значение сохранялось как имя переменной «Tc», которая используется в разделе графика на странице. Я продолжаю получать сообщение об ошибке «AttributeError: объект« PageTwo »не имеет атрибута« ID1 »». Любая помощь будет оценена.

import tkinter as tk
from tkinter import font as tkfont
from tkinter import *
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure

class SampleApp(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.title_font = tkfont.Font(family='Helvetica', weight="bold")
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (PageTwo):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("StartPage")


class PageTwo(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="Temperature Distribution as a function of Distance")
        label.pack(pady=10, padx=10)


        button2 = tk.Button(self, text="Finish & Plot", command=self.plot)
        button2.pack()

        var1 = StringVar()
        var1.set("Enter inner chamber temperature:")
        label1 = tk.Label(self, textvariable=var1, height=2)
        label1.pack()

        ID1 = StringVar()
        entry1 = tk.Entry(self, bd=4, textvariable=ID1)
        entry1.pack()

    def read_inputs(self):
        x = self.entry1.get()

    def plot(self):
        Tc = self.read_inputs()
        f = 49
        h1 = 50
        L1 = .05 
        L2 = .022  
        L3 = .1125
        k_sand = 0.27 
        k_water = 0.6  
        k_brick = 0.72 
        e_sand = 0.343  
        k_ws = e_sand * k_water + (1 - e_sand) * k_sand
        T4 = -((f * (1 / h1)) - Tc)
        T3 = -((f * (L1 / k_al)) - T4)
        T2 = -((f * (L2 / k_ws)) - T3)
        T1 = -((f * (L3 / k_brick)) - T2)

        print(T4, T3, T2, T1)


if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

То, что вы описали, вовсе не является проблемой tkinter. Вам просто нужно сделать виджет атрибутом класса, а затем вам нужно преобразовать и вернуть значение из read_inputs:

class PageTwo(tk.Frame):
    def __init__(self, parent, controller):
        ...
        self.entry1 = tk.Entry(...)
        ...

    def read_inputs(self):
        x = self.entry1.get()
        return float(x)
0 голосов
/ 05 июля 2018

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

ваш код не работает, потому что вы пытаетесь использовать pack внутри объекта, в котором есть подчиненные, использующие grid, когда вы вызываете self.pack в классе PageOne. Tkinter никогда не позволит вам сделать это.

тогда вы говорите, что полученная ошибка "AttributeError: 'PageTwo' object has no attribute 'ID1'". чтобы это было возможно, вам нужно объявить переменную ID1 с self где-то внутри класса PageTwo, чего у вас нет.

в методе init класса PageTwo вы объявляете виджет tkinter Entry как entry1.

позже вы используете self.entry1 в вашей функции read_inputs. так что это простое исправление, просто объявите entry1 как self.entry1 ...

class PageTwo(tk.Frame):
    def __init__(self, parent, controller):
        ...
        ID1 = StringVar()
        self.entry1 = tk.Entry(self, bd=4, textvariable=ID1)
        self.entry1.pack()
        ...

    def read_inputs(self):
        x = self.entry1.get()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...