将输入项存储到新变量中

2024-04-25 12:06:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个程序,允许用户在文本框中输入一定的温度,然后根据用户的输入显示相应的图形。我知道当我手动写入起始温度时程序可以工作,但我似乎不知道如何将用户输入值存储到正确的变量中然后使用。我将把整个程序放在下面,但是我的问题是在第二页的课上。我希望输入的值被存储为变量名“Tc”,它用于页面的plot部分。我不断得到错误“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()

Tags: 用户namefromimportself程序matplotlibinit
2条回答

你所描述的根本不是问题。您只需使小部件成为类的属性,然后需要转换并返回来自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)

首先,你的代码不起作用。阅读this。我建议在这里发布之前至少试着运行代码。。。你知道吗

您的代码无法工作,因为您试图在对象内部使用pack,而当您在PageOne类下调用self.pack时,该对象的从属对象使用grid。特金特不会让你这么做的。你知道吗

然后你说你收到的错误是"AttributeError: 'PageTwo' object has no attribute 'ID1'"。要做到这一点,您需要在PageTwo类中的某个位置声明变量ID1,而您不需要这样做。你知道吗

在PageTwo类的init方法中,将tkinter条目小部件声明为entry1。你知道吗

稍后在read_inputs函数中使用self.entry1。所以这是一个简单的修复,只需将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()

我无法运行您的代码来验证这一点,但我敢打赌,由于变量名不正确,您无法读取输入。你知道吗

相关问题 更多 >