第一个帖子,但很长时间的听众…

我刚接触Tkinter,遇到了一些问题.让我摸不着头脑的主要一点是,当我在4个输入框中的一个框中输入一个值时,它们会复制其他4个框中的值.按钮工作正常,我需要清理东西,但不确定这是否是一种有效的方法:

此外,框架是错误的,我计划添加 comments

我删除了一些无关的行,但得到了相同的结果.将self添加到Entry对象的Text变量中.

import tkinter as tk
from tkinter import  *
from tkinter import ttk

root = Tk()
s = ttk.Style()
s.configure('Danger.TFrame', background='red', borderwidth=5, relief='sunken')
frm = ttk.Frame(root, padding=200, style='Danger.TFrame').grid()

#Fix needed for inputs duplicating.

input_frame = ttk.Frame(frm,padding=10).grid(row=1)

output_frame = ttk.Frame(frm,padding=10).grid(row=16,column=0)

class single_frame(tk.Frame): #intent is to have repeatable frame with name, abreviation, and unit
    def __init__(self, parent, name, abreviation, unit,row_adjust) -> None:
        self.n = name
        self.u = unit
        self.a = abreviation
        
        ttk.Frame(parent, width = 50, height = 50,style='Danger.TFrame').grid()
        ttk.Label(parent,text=self.n).grid(column=0, row=row_adjust)
        ttk.Label(parent,text=self.a).grid(column=1,row=row_adjust)
        ttk.Label(parent,text=self.u).grid(column=3,row=row_adjust)
        pass


class fxinput(single_frame):  #setting up a class to handle input boxes
    def __init__(self,parent,name,abreviation,unit,row_adjust) -> None:
        super().__init__(parent,name,abreviation,unit,row_adjust)
        self.v = float()
        self.e = ttk.Entry(parent, textvariable=self.v)
        #self.e.insert(tk.END,"1")
        self.e.grid(column=2,row=row_adjust)
        pass

class fxoutput(single_frame):  #setting up a class to handle input boxes
    def __init__(self,parent,name,abreviation,unit,out,row_adjust) -> None:
        super().__init__(parent,name,abreviation,unit,row_adjust)
        self.out = out
        self.l = ttk.Label(parent, text=self.out)
        self.l.grid(column=2,row=row_adjust)
        pass
    def update(self,value):
        self.l["text"]=value

inV = fxinput(input_frame,'Ideal Gas','v','L*atm/mol*K',1)
inn = fxinput(input_frame,'Ideal Gas','n','L*atm/mol*K',2)
inT = fxinput(input_frame,'Ideal Gas','T','L*atm/mol*K',3)
inR = fxinput(input_frame,'Ideal Gas','R','L*atm/mol*K',4)
out1 = fxoutput(output_frame,'Pressure','P','atm',1, 5)



ttk.Button(frm, text="Quit!", command=root.destroy).grid(column=10,row=0)

def calculate():
    try:

        v = float(inV.e.get())
        n = float(inn.e.get())
        R = float(inR.e.get())
        T = float(inT.e.get())

        print(v)
        p = n*R*T/v
        out1.update(p)
        print(out1.out)
    except:
        print("error")
        return

calc_button = ttk.Button(frm, text="Calculate", default="active", command=calculate)
calc_button.grid(column=20,row =20)
#root.bind('<Return>', lambda e: calc_button.invoke())
root.mainloop()


推荐答案

让我摸不着头脑的主要一点是,当我在4个输入框中的一个框中输入一个值时,它们会复制其他4个框中的值.

这立刻告诉我,这四个人都分享了同样的textvariable.

textvariable属性赋值时,它需要是tkinter变量对象之一(StringVarIntVar等).对象名称的字符串值与嵌入式TCL解释器内部的一个变量相关联.每个实例的名称将是唯一的,这为您提供了TCL解释器中的唯一变量.

然而,在您的例子中,您传递的值是float().float()返回0.0,所以您的所有小部件都将与一个内部名称为0.0的变量相关联.

简单的解决方法是使用适当的tkinter变量,而不是浮点数.例如,DoubleVar:

class fxinput(single_frame):  #setting up a class to handle input boxes
    def __init__(self,parent,name,abreviation,unit,row_adjust) -> None:
        ...
        self.v = tk.DoubleVar()
        self.e = ttk.Entry(parent, textvariable=self.v)
        ...

在一些注释掉的代码中,您似乎打算将该值初始化为1.您可以在创建变量时执行此操作:

self.v = tk.DoubleVar(value=1.0)

Python-3.x相关问答推荐

谁能解释一下这个带邮编的多功能环路?

Django 3.2/Django-cms 3.11:查找错误:型号帐户.客户用户未注册

泛型类型的参数的静态类型

根据另一列中的条件填写该列中的值

我没有';无法理解此TemplateDoesNotExist错误

我用Kivy创建的应用程序在安卓系统上运行时出错.(attributeerror:';class';对象没有属性';_javaclass__cls_storage';)

tkinter/python3.9 中的 Entry 子类和用户输入重复的问题

Sunburst 折线图可视化

将逗号分隔的字符串类型系列转换为整数列表 pandas

numpy是如何添加@运算符的?

过滤阈值大小数据以使用 Pyspark 或 Python 读取

如果网站加载时间过长,如何强制 Selenium 刷新

使用大型多个数据集,其中每个数据集包含多个值 - Pytorch

类型提示和链式赋值以及多重赋值

为什么 List 不能包含多种类型?

如何从 Python 3.5 降级到 Python 3.4

使用完整路径激活 conda 环境

将字符串拆分为最大长度 X 的片段 - 仅在空格处拆分

带有数千个逗号刻度标签的 MatPlotLib 美元符号

Pylint 中的模块PyQt5.QtWidgets错误中没有名称QApplication