【问题标题】:Store Tkinter Entry into new variable将 Tkinter 条目存储到新变量中
【发布时间】:2018-12-14 03:07:53
【问题描述】:

我正在编写一个程序,允许用户在文本框中输入一定的温度,然后根据用户输入显示相应的图形。我知道当我手动写入起始温度时程序可以工作,但我似乎无法弄清楚如何将用户输入值存储到正确的变量中然后使用。我将把整个程序放在下面,但是我的问题出在名为 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()

【问题讨论】:

  • 请不要发布整个程序。相反,专门为此问题创建一个minimal reproducible example。另外,请确保您发布的代码格式正确。
  • @BryanOakley 我删除了所有不必要的代码,您知道如何将用户输入存储到我可以在绘图语句中使用的变量中吗?
  • 现在你的代码根本无法运行,而且似乎还有很多不相关的代码。如果您的问题是关于从输入中获取值,我们真的需要任何 matplotlib 代码吗?
  • 好吧,read_inputs 没有返回值,这可以解释该错误。
  • 另外,您似乎还没有掌握minimal reproducible example 的概念。 “c”代表“完整”,您发布的代码由于多种原因无法运行。

标签: python matplotlib tkinter


【解决方案1】:

您所描述的根本不是 tkinter 问题。你只需要让widget成为类的属性,然后你需要从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)

【讨论】:

    【解决方案2】:

    首先,您的代码不起作用。阅读this。我建议至少在将代码发布到此处之前尝试运行代码...

    您的代码不起作用,因为当您在 PageOne 类下调用 self.pack 时,您试图在具有使用 grid 的从属对象内部使用 pack。 tkinter 永远不会让你这样做。

    然后你说你收到的错误是"AttributeError: 'PageTwo' object has no attribute 'ID1'"。为此,您需要在 PageTwo 类中使用 self somewhere 声明变量 ID1,而您不需要这样做。

    在PageTwo 类的init 方法中,您将tkinter Entry 小部件声明为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()
    

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

    【讨论】:

    • 代码确实为我运行,我遇到的唯一问题是从 entry1 获取输入并将其存储为要在图形部分中使用的新变量。
    • 对self.pack 的调用在这里并不是真正的问题,因为创建页面的代码稍后会在该小部件上调用grid,因此调用pack 的效果无效。
    • @BryanOakley 我的错。您没有收到错误 _tkinter.TclError: cannot use geometry manager pack inside .140481842351296 which already has slaves managed by grid ?
    • @Amanda 抱歉,我无法运行您调用 app = SampleApp() 的编辑版本,但 SampleApp 类不存在。
    • @spoiledgoods 我在第一堂课中添加了回来,以便代码能够运行,我还添加了一些虚拟变量以查看用户输入是否适用于计算 T4、T3、T2 的值, 和 T1,然后我在最后打印。总的来说,我只需要从用户那里获取输入并将其作为变量 Tc 存储在 PageTwo 类中,以便以后在计算中使用。
    猜你喜欢
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    相关资源
    最近更新 更多