python - 如何使用 tkinter 按钮和函数,使用 tk.Entry 中的变量?
问题描述
我正在尝试编写一些简单的代码来将变量放入一个简单的函数中,该函数使用温度和压力来计算名为 fO2 的输出。
我看不到如何更新输入变量,现在它使用 0。
此外,您输入的任何内容都会Temp_input
在P_input
.
from matplotlib.backends.backend_tkagg import *
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
import tkinter as tk
root = tk.Tk()
root.title('Oxygen Fugacity')
root.geometry("500x400")
Temp_input = tk.Entry(root, width=15, borderwidth=5,textvariable=Tcinput)
Temp_input.grid(row=1,column=1)
P_input = tk.Entry(root, width=15, borderwidth=5,textvariable=Pinput)
P_input.grid(row=2,column=1)
Templabel = tk.Label(root,text='Temperature (C)').grid(row=1,column=0)
Plabel = tk.Label(root,text='Pressure (bar)').grid(row=2,column=0)
comp = tk.Button(root, text='Compute', command=lambda: all).grid(row=3,column=1)
Tcinput = tk.IntVar(master=root,value=Tcinput).get()
Pinput = tk.IntVar(master=root,value=Pinput).get()
tk.Label(root, text='NNO').grid(row=1,column=3,padx=(30,0),pady=(10,10))
tk.Label(root, text='FMQ').grid(row=2,column=3,padx=(30,0),pady=(10,10))
tk.Label(root, text='IW').grid(row=3,column=3,padx=(30,0),pady=(10,10))
tk.Label(root, text='MH').grid(row=4,column=3,padx=(30,0),pady=(10,10))
tk.Label(root, text='CoCoO').grid(row=5,column=3,padx=(30,0),pady=(10,10))
tk.Label(root, text='CCO').grid(row=6,column=3,padx=(30,0),pady=(10,10))
NNO_OUT = tk.Message(root, text = all(Tcinput,Pinput)[0]).grid(row=1,column=4,padx=(30,0))
FMQ_OUT = tk.Message(root, text = all(Tcinput,Pinput)[1]).grid(row=2,column=4,padx=(30,0))
IW_OUT = tk.Message(root, text = all(Tcinput,Pinput)[2]).grid(row=3,column=4,padx=(30,0))
MH_OUT = tk.Message(root, text = all(Tcinput,Pinput)[3]).grid(row=4,column=4,padx=(30,0))
CoCoO_OUT = tk.Message(root, text = all(Tcinput,Pinput)[4]).grid(row=5,column=4,padx=(30,0))
CCO_OUT = tk.Message(root, text = all(Tcinput,Pinput)[5]).grid(row=6,column=4,padx=(30,0))
root.mainloop()
def all(Tc=1200,P=1):
a = str(round(fo2.NNO(Tc,P),2))
b = str(round(fo2.FMQ(Tc,P),4))
c = str(round(fo2.IW(Tc,P),4))
d = str(round(fo2.MH(Tc,P),4))
e = str(round(fo2.CoCoO(Tc,P),4))
f = str(round(fo2.CCO(Tc,P),4))
x=[a,b,c,d,e,f]
return x
编辑
我已经编辑了代码,但按钮仍然不起作用,我尝试在函数上使用 lambda 和 ()
谁能看到问题?
from matplotlib.backends.backend_tkagg import *
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
import tkinter as tk
def some_func():
global Tcinput, Pinput
Tc = Tcinput.get() # GETTER
P = Pinput.get() # GETTER
a = str(round(fo2.NNO(Tc,P),4))
b = str(round(fo2.FMQ(Tc,P),4))
c = str(round(fo2.IW(Tc,P),4))
d = str(round(fo2.MH(Tc,P),4))
e = str(round(fo2.CoCoO(Tc,P),4))
f = str(round(fo2.CCO(Tc,P),4))
x=[a,b,c,d,e,f]
return x
root = tk.Tk()
root.title('Oxygen Fugacity')
root.geometry("500x400")
Tcinput = tk.IntVar(master=root,value=1200) # NEW
Pinput = tk.IntVar(master=root,value=1) # NEW
Temp_input = tk.Entry(root, width=15, borderwidth=5,textvariable=Tcinput)
Temp_input.grid(row=1,column=1)
P_input = tk.Entry(root, width=15, borderwidth=5,textvariable=Pinput)
P_input.grid(row=2,column=1)
Templabel = tk.Label(root,text='Temperature (C)').grid(row=1,column=0)
Plabel = tk.Label(root,text='Pressure (bar)').grid(row=2,column=0)
tk.Label(root, text='NNO').grid(row=1,column=3,padx=(30,0),pady=(10,10))
tk.Label(root, text='FMQ').grid(row=2,column=3,padx=(30,0),pady=(10,10))
tk.Label(root, text='IW').grid(row=3,column=3,padx=(30,0),pady=(10,10))
tk.Label(root, text='MH').grid(row=4,column=3,padx=(30,0),pady=(10,10))
tk.Label(root, text='CoCoO').grid(row=5,column=3,padx=(30,0),pady=(10,10))
tk.Label(root, text='CCO').grid(row=6,column=3,padx=(30,0),pady=(10,10))
comp = tk.Button(root, text='Compute', command=lambda: some_func()).grid(row=3,column=1)
NNO_OUT = tk.Message(root, text = some_func()[0]).grid(row=1,column=4,padx=(30,0))
FMQ_OUT = tk.Message(root, text = some_func()[1]).grid(row=2,column=4,padx=(30,0))
IW_OUT = tk.Message(root, text = some_func()[2]).grid(row=3,column=4,padx=(30,0))
MH_OUT = tk.Message(root, text = some_func()[3]).grid(row=4,column=4,padx=(30,0))
CoCoO_OUT = tk.Message(root, text = some_func()[4]).grid(row=5,column=4,padx=(30,0))
CCO_OUT = tk.Message(root, text = some_func()[5]).grid(row=6,column=4,padx=(30,0))
root.mainloop()
解决方案
根据我对代码的理解,您需要获取包含 Tc 和 P 值的 IntVar。这是新代码:
from matplotlib.backends.backend_tkagg import *
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
import tkinter as tk
root = tk.Tk()
root.title('Oxygen Fugacity')
root.geometry("500x400")
Tcinput = IntVar(master=root,value=1200) # NEW
Pinput = IntVar(master=root,value=1) # NEW
def some_func():
global Tcinput, Pinput
Tc = Tcinput.get() # GETTER
P = Pinput.get() # GETTER
a = str(round(fo2.NNO(Tc,P),2))
b = str(round(fo2.FMQ(Tc,P),4))
c = str(round(fo2.IW(Tc,P),4))
d = str(round(fo2.MH(Tc,P),4))
e = str(round(fo2.CoCoO(Tc,P),4))
f = str(round(fo2.CCO(Tc,P),4))
x=[a,b,c,d,e,f]
return x
Temp_input = tk.Entry(root, width=15, borderwidth=5,textvariable=Tcinput)
Temp_input.grid(row=1,column=1)
P_input = tk.Entry(root, width=15, borderwidth=5,textvariable=Pinput)
P_input.grid(row=2,column=1)
Templabel = tk.Label(root,text='Temperature (C)').grid(row=1,column=0)
Plabel = tk.Label(root,text='Pressure (bar)').grid(row=2,column=0)
comp = tk.Button(root, text='Compute', command=lambda: some_func()).grid(row=3,column=1)
tk.Label(root, text='NNO').grid(row=1,column=3,padx=(30,0),pady=(10,10))
tk.Label(root, text='FMQ').grid(row=2,column=3,padx=(30,0),pady=(10,10))
tk.Label(root, text='IW').grid(row=3,column=3,padx=(30,0),pady=(10,10))
tk.Label(root, text='MH').grid(row=4,column=3,padx=(30,0),pady=(10,10))
tk.Label(root, text='CoCoO').grid(row=5,column=3,padx=(30,0),pady=(10,10))
tk.Label(root, text='CCO').grid(row=6,column=3,padx=(30,0),pady=(10,10))
NNO_OUT = tk.Message(root, text = some_func()[0]).grid(row=1,column=4,padx=(30,0))
FMQ_OUT = tk.Message(root, text = some_func()[1]).grid(row=2,column=4,padx=(30,0))
IW_OUT = tk.Message(root, text = some_func()[2]).grid(row=3,column=4,padx=(30,0))
MH_OUT = tk.Message(root, text = some_func()[3]).grid(row=4,column=4,padx=(30,0))
CoCoO_OUT = tk.Message(root, text = some_func()[4]).grid(row=5,column=4,padx=(30,0))
CCO_OUT = tk.Message(root, text = some_func()[5]).grid(row=6,column=4,padx=(30,0))
root.mainloop()