【问题标题】:Radiobuttons return a value of zero regardless of selection无论选择如何,单选按钮都返回零值
【发布时间】:2021-03-04 23:39:21
【问题描述】:

我目前正在编写代码来解决理想气体定律中的任何变量,并且在达到输出时遇到了问题。

我最终希望通过这个项目达到一个点,在我的计算器中添加了大量的方程和定律,但是我已经开始使用理想气体定律。我目前在使用 Tkinter 单选按钮和检索选定按钮后面的值时遇到问题。每次我尝试使用 .get() 时,无论选择如何,我的单选按钮都会返回零值。

我有三个类,我目前正在使用它们,它们都将根据工作量进行细分。如果有人能帮助我精简代码并尽量减少体积,我也将不胜感激。

图形界面类

from tkinter import *
import tkinter as tk
import math
import turtle
from turtle import*
from conversions import Conversions
from calculator import Calculator, Output
    
class CalculatorGUI:   
    """    All Branches of Calculator     """ 
        
    def IdealGasGUI():  #IDEAL GAS LAW
        master = Tk()    
        var1 = tk.IntVar()
        var2 = tk.IntVar()
        var3 = tk.IntVar()
        var4 = tk.IntVar()
        
        """    Activation Code     """
        def SolveIdeal():
            Calculate = Calculator()
            p = int(pN.get())
            v = int(vN.get())
            n = int(nN.get())
            t = int(tN.get())
                
            target = var1.get()
            pU = var2.get()
            vU = var3.get()
            tU = var4.get()
            
            Calculate.IdealGas(p,v,n,t,target,pU,vU,tU)
        
        master.geometry('540x500')
        master.title('Science Calculator © 2020 Heath Marchese All Rights Reserved')

        Label(master, text="Science Calculator - Ideal Gas Law", font='Helvetica 24 bold').grid(row=0,rowspan=2,column=0,columnspan=4,pady=(0,25),sticky=N)
        
        Label(master, text="Which variable is needed?", font ='Helvetica 14').grid(row=2,rowspan=1,column=1,columnspan=2,pady=(0,15))
    
        Radiobutton(master, text="Pressure", font = "Helvetica 12", variable=var1, value=1).grid(row=3,column=0)
        Radiobutton(master, text="Volume", font = "Helvetica 12", variable=var1, value=2).grid(row=3,column=1)
        Radiobutton(master, text="Mole", font = "Helvetica 12", variable=var1, value=3).grid(row=3,column=2)
        Radiobutton(master, text="Temperature", font = "Helvetica 12", variable=var1, value=4).grid(row=3,column=3)
        
        Label(master, text="Pressure:", font ='Helvetica 14').grid(row=4,column=0,pady=(25,5))
        pN = Entry(master)
        pN.grid(row=4,column=1,sticky=W,pady=(25,0)) 
        Radiobutton(master, text="kPa", font = "Helvetica 12", variable=var2, value=1).grid(row=5,column=0)
        Radiobutton(master, text="torr", font = "Helvetica 12", variable=var2, value=2).grid(row=5,column=1)
        Radiobutton(master, text="ATM", font = "Helvetica 12", variable=var2, value=3).grid(row=5,column=2)
        Radiobutton(master, text="mmHg", font = "Helvetica 12", variable=var2, value=4).grid(row=5,column=3)
        
        Label(master, text="Volume:", font ='Helvetica 14').grid(row=6,column=0,pady=(0,5))
        vN = Entry(master)
        vN.grid(row=6,column=1,sticky=W)
        Radiobutton(master, text="L", font = "Helvetica 12", variable=var3, value=1).grid(row=7,column=0)
        Radiobutton(master, text="cm^3", font = "Helvetica 12", variable=var3, value=2).grid(row=7,column=1)
        
        Label(master, text="Mole:", font ='Helvetica 14').grid(row=8,column=0,pady=(0,28))
        nN = Entry(master)
        nN.grid(row=8,column=1,sticky=W,pady=(0,30))
        
        Label(master, text="Temperature:", font ='Helvetica 14').grid(row=10,column=0,pady=(0,5))
        tN = Entry(master)
        tN.grid(row=10,column=1,sticky=W)
        Radiobutton(master, text="°C", font = "Helvetica 12", variable=var4, value=1).grid(row=11,column=0)
        Radiobutton(master, text="°F", font = "Helvetica 12", variable=var4, value=2).grid(row=11,column=1)
        Radiobutton(master, text="K", font = "Helvetica 12", variable=var4, value=3).grid(row=11,column=2)
        
        Button(master, text="Solve", font ='Helvetica 12 bold', command=SolveIdeal).grid(row=12,column=1,columnspan=2,pady=(15,0))
        Button(master, text="Return", font ='Helvetica 12 bold', command=master.quit).grid(row=13,column=1,pady=(10,0))
        Button(master, text="Quit", font ='Helvetica 12 bold', command=master.quit).grid(row=13,column=2,pady=(10,0),padx=(40))
        
            
    """    Initial Calculator Code     """ 
    master = Tk()
    Convert = Conversions()
    
    master.geometry('500x500')
    master.title('Science Calculator © 2020 Heath Marchese Some Rights Reserved')
    Button(master, text="Ideal Gas Law", font = "Helvetica 12", command=IdealGasGUI).grid()
    Button(master, text="Quit", font ='Helvetica 12 bold', command=master.quit).grid(pady=(300,0))
    
    master.mainloop()
    
start = CalculatorGUI() 

计算类

from tkinter import *
import tkinter
import math
import turtle
from turtle import*
from conversions import Conversions

def Output(out):
        master = Tk()
        master.geometry('200x200')
        Label(master, text=out).grid()

class Calculator:   
    def IdealGas(master,p,v,n,t,targ,pU,vU,tU): #PV = nRT
     
        print(p)
        print(v)
        print(n)
        print(t)
        print(targ)
        print(pU)
        print(vU)
        print(tU)
        
        Convert = Conversions()
        if (pU == 1):
            p = Convert.kPa_ATM(p)
        elif (pU == 2):
            p = Convert.torr_ATM(p)
        elif (pU == 4):
            p = Convert.mmHg_ATM(p)
        if (vU == 2):
           v = Convert.cm_L(v)
        if (tU == 1):
           t = Convert.C_K(t)
        elif (tU == 2):
           t = Convert.F_K(t)
        
        if (targ == 1):
            pres = (n * 0.08205 * t) / v
            out = ("Answer: {.5f} ATM").format(pres)
            master.Output(out)
        elif (targ == 2):
            vol = (n * 0.08205 * t) / p
            out = ("Answer: {.5f} L").format(vol)
            master.Output(out)
        elif (targ == 3):
            mol = (p * v) / (0.08205 * t) 
            out = ("Answer: {.5f} mol").format(mol)
            master.Output(out)
        elif (targ == 4):
            temp = (p * v) / (n * 0.08205)
            out = ("Answer: {.5f} K").format(temp)
            master.Output(out)

转换类

from tkinter import *
import tkinter
import math
import turtle
from turtle import*

class Conversions: #Name of first unit respective to variable in methods. Name of second unit is returned
    """     Pressure Conversions     """
    def mmHg_ATM(master,a):
        return (a / 760)
    def mmHg_kPa(master,a):
        return (a / 7.50062)
        
    def kPa_mmHg(master,a):
        return ''
    def kPa_ATM(master,a):
        return (a / 101.325)
    def kPa_torr(master,a):
        return ''
        
    def ATM_torr(master,a):
        return ''
    def ATM_mmHg(master,a):
        return (a * 760)
    def ATM_kPa(master,a):
        return ''
    
    def torr_mmHg(master,a):
        return ''
    def torr_ATM(master,a):
        return (a / 760)
    def torr_kPa(master,a):
        return ''
    
    """     Volume Conversions     """
    def cm_L(master,a):
        return (a / 1000)
    
    def L_cm(master,a):
        return (a * 1000)
    
    """     Temperature Conversions     """
    def C_K(master,a):
        return (a + 273.15)
    def C_F(master,a):
        return ''
    
    def F_C(master,a):
        return (a / 101.325)
    def F_K(master,a):
        return (((a - 32) * 5 / 9) + 273.15)
    
    def K_C(master,a):
        return ''
    def K_F(master,a):
        return (a / 101.325)

非常感谢任何帮助。谢谢

【问题讨论】:

    标签: python user-interface tkinter calculator


    【解决方案1】:

    您遇到问题的原因是您有多个 Tk 实例,并且您的 IntVars 连接到与单选按钮不同的实例。由于每个Tk 实例都运行自己的Tcl 解释器并且它们不能相互通信,因此变量不能与单选按钮的值链接。

    理想情况下,您应该有一个 Tk 实例并使用 Toplevel 类来获得额外的窗口。您也可以在创建变量时显式传递 master:var1 = tk.IntVar(master)

    顺便说一句,我建议您阅读一些有关 OOP 的教程,并考虑重构您的整个代码。现在,您已经定义了类,但您并没有真正使用它们。里面的代码也可以在类之外,不会有什么不同。

    【讨论】:

    • 谢谢,我会调查的。我对 python 很陌生,所以我利用这个项目作为一个机会来收集对 Tkinter、OOP 以及最终 numpy 和 matplotlib 的一些见解
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    相关资源
    最近更新 更多