clidx commited on
Commit
8272240
·
verified ·
1 Parent(s): fb61b06

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +37 -337
src/streamlit_app.py CHANGED
@@ -6,14 +6,10 @@ import math
6
  LANGUAGES = {
7
  "中文": {
8
  "page_title": "溶剂分数转换器",
9
- "main_title": "🧪 溶剂摩尔分数体积分数与质量分数转换器",
10
  "conversion_mode": "转换模式",
11
  "mode_mole_to_vol": "摩尔分数 → 体积分数",
12
  "mode_vol_to_mole": "体积分数 → 摩尔分数",
13
- "mode_mole_to_mass": "摩尔分数 → 质量分数",
14
- "mode_mass_to_mole": "质量分数 → 摩尔分数",
15
- "mode_vol_to_mass": "体积分数 → 质量分数",
16
- "mode_mass_to_vol": "质量分数 → 体积分数",
17
  "select_conversion": "选择转换方向:",
18
  "solvent_selection": "溶剂选择",
19
  "select_solvents": "选择两种溶剂或自定义参数:",
@@ -24,46 +20,34 @@ LANGUAGES = {
24
  "density": "密度",
25
  "input_mole_fraction": "输入摩尔分数",
26
  "input_volume_fraction": "输入体积分数",
27
- "input_mass_fraction": "输入质量分数",
28
  "mole_fraction_of": "摩尔分数",
29
  "volume_fraction_of": "体积分数",
30
- "mass_fraction_of": "质量分数",
31
  "result_volume_fraction": "计算结果 - 体积分数",
32
  "result_mole_fraction": "计算结果 - 摩尔分数",
33
- "result_mass_fraction": "计算结果 - 质量分数",
34
  "verification": "验证",
35
  "detailed_info": "详细信息",
36
  "solvent_params": "溶剂参数",
37
  "solvent": "溶剂",
38
  "mole_fraction": "摩尔分数",
39
  "volume_fraction": "体积分数",
40
- "mass_fraction": "质量分数",
41
  "calculation_formula": "计算公式",
42
  "formula_mole_to_vol_title": "**摩尔分数转换为体积分数:**",
43
  "formula_vol_to_mole_title": "**体积分数转换为摩尔分数:**",
44
- "formula_mole_to_mass_title": "**摩尔分数转换为质量分数:**",
45
- "formula_mass_to_mole_title": "**质量分数转换为摩尔分数:**",
46
- "formula_vol_to_mass_title": "**体积分数转换为质量分数:**",
47
- "formula_mass_to_vol_title": "**质量分数转换为体积分数:**",
48
  "formula_where": "其中:",
49
  "usage_instructions": "使用说明",
50
  "instruction_1": "1. **选择转换模式**: 在侧边栏选择转换方向",
51
  "instruction_2": "2. **选择溶剂**: 从预设的常见溶剂中选择,或选择\"自定义\"输入参数",
52
- "instruction_3": "3. **输入数值**: 输入摩尔分数体积分数或质量分数",
53
  "instruction_4": "4. **查看结果**: 右侧显示转换结果和详细信息",
54
  "note": "**注意**: 本计算假设理想混合,实际情况可能存在偏差。",
55
  "language": "语言"
56
  },
57
  "English": {
58
  "page_title": "Solvent Fraction Converter",
59
- "main_title": "🧪 Solvent Mole Fraction, Volume Fraction & Mass Fraction Converter",
60
  "conversion_mode": "Conversion Mode",
61
  "mode_mole_to_vol": "Mole Fraction → Volume Fraction",
62
  "mode_vol_to_mole": "Volume Fraction → Mole Fraction",
63
- "mode_mole_to_mass": "Mole Fraction → Mass Fraction",
64
- "mode_mass_to_mole": "Mass Fraction → Mole Fraction",
65
- "mode_vol_to_mass": "Volume Fraction → Mass Fraction",
66
- "mode_mass_to_vol": "Mass Fraction → Volume Fraction",
67
  "select_conversion": "Select conversion direction:",
68
  "solvent_selection": "Solvent Selection",
69
  "select_solvents": "Select two solvents or customize parameters:",
@@ -74,32 +58,24 @@ LANGUAGES = {
74
  "density": "Density",
75
  "input_mole_fraction": "Input Mole Fraction",
76
  "input_volume_fraction": "Input Volume Fraction",
77
- "input_mass_fraction": "Input Mass Fraction",
78
  "mole_fraction_of": "Mole fraction of",
79
  "volume_fraction_of": "Volume fraction of",
80
- "mass_fraction_of": "Mass fraction of",
81
  "result_volume_fraction": "Results - Volume Fraction",
82
  "result_mole_fraction": "Results - Mole Fraction",
83
- "result_mass_fraction": "Results - Mass Fraction",
84
  "verification": "Verification",
85
  "detailed_info": "Detailed Information",
86
  "solvent_params": "Solvent Parameters",
87
  "solvent": "Solvent",
88
  "mole_fraction": "Mole Fraction",
89
  "volume_fraction": "Volume Fraction",
90
- "mass_fraction": "Mass Fraction",
91
  "calculation_formula": "Calculation Formula",
92
  "formula_mole_to_vol_title": "**Mole Fraction to Volume Fraction:**",
93
  "formula_vol_to_mole_title": "**Volume Fraction to Mole Fraction:**",
94
- "formula_mole_to_mass_title": "**Mole Fraction to Mass Fraction:**",
95
- "formula_mass_to_mole_title": "**Mass Fraction to Mole Fraction:**",
96
- "formula_vol_to_mass_title": "**Volume Fraction to Mass Fraction:**",
97
- "formula_mass_to_vol_title": "**Mass Fraction to Volume Fraction:**",
98
  "formula_where": "Where:",
99
  "usage_instructions": "Usage Instructions",
100
  "instruction_1": "1. **Select Conversion Mode**: Choose conversion direction in sidebar",
101
  "instruction_2": "2. **Select Solvents**: Choose from preset common solvents or select 'Custom' to input parameters",
102
- "instruction_3": "3. **Input Values**: Input mole fraction, volume fraction or mass fraction",
103
  "instruction_4": "4. **View Results**: Results and detailed information are displayed on the right",
104
  "note": "**Note**: This calculation assumes ideal mixing; actual situations may deviate.",
105
  "language": "Language"
@@ -169,9 +145,7 @@ st.markdown("---")
169
  st.sidebar.header(lang["conversion_mode"])
170
  conversion_mode = st.sidebar.radio(
171
  lang["select_conversion"],
172
- [lang["mode_mole_to_vol"], lang["mode_vol_to_mole"],
173
- lang["mode_mole_to_mass"], lang["mode_mass_to_mole"],
174
- lang["mode_vol_to_mass"], lang["mode_mass_to_vol"]]
175
  )
176
 
177
  # 溶剂选择
@@ -215,7 +189,6 @@ else:
215
  # 主界面内容
216
  col1, col2 = st.columns(2)
217
 
218
- # 摩尔分数 → 体积分数
219
  if conversion_mode == lang["mode_mole_to_vol"]:
220
  with col1:
221
  st.header(lang["input_mole_fraction"])
@@ -245,10 +218,11 @@ if conversion_mode == lang["mode_mole_to_vol"]:
245
  st.header(lang["result_volume_fraction"])
246
  st.metric(f"{lang['volume_fraction_of']} {solvent_a_name} (φ_A)", f"{phi_a:.4f}")
247
  st.metric(f"{lang['volume_fraction_of']} {solvent_b_name} (φ_B)", f"{phi_b:.4f}")
 
 
248
  st.write(f"{lang['verification']}: φ_A + φ_B = {phi_a + phi_b:.4f}")
249
 
250
- # 体积分数 → 摩尔分数
251
- elif conversion_mode == lang["mode_vol_to_mole"]:
252
  with col1:
253
  st.header(lang["input_volume_fraction"])
254
  phi_a = st.number_input(
@@ -277,136 +251,10 @@ elif conversion_mode == lang["mode_vol_to_mole"]:
277
  st.header(lang["result_mole_fraction"])
278
  st.metric(f"{lang['mole_fraction_of']} {solvent_a_name} (x_A)", f"{x_a:.4f}")
279
  st.metric(f"{lang['mole_fraction_of']} {solvent_b_name} (x_B)", f"{x_b:.4f}")
280
- st.write(f"{lang['verification']}: x_A + x_B = {x_a + x_b:.4f}")
281
-
282
- # 摩尔分数 → 质量分数
283
- elif conversion_mode == lang["mode_mole_to_mass"]:
284
- with col1:
285
- st.header(lang["input_mole_fraction"])
286
- x_a = st.number_input(
287
- f"{lang['mole_fraction_of']} {solvent_a_name} (x_A):",
288
- min_value=0.0,
289
- max_value=1.0,
290
- value=0.5,
291
- step=0.001,
292
- format="%.4f"
293
- )
294
- x_b = 1.0 - x_a
295
- st.write(f"{lang['mole_fraction_of']} {solvent_b_name} (x_B): {x_b:.4f}")
296
-
297
- # 计算质量分数
298
- mass_a = x_a * M_a
299
- mass_b = x_b * M_b
300
- mass_total = mass_a + mass_b
301
-
302
- if mass_total > 0:
303
- w_a = mass_a / mass_total
304
- w_b = mass_b / mass_total
305
- else:
306
- w_a = w_b = 0
307
 
308
- with col2:
309
- st.header(lang["result_mass_fraction"])
310
- st.metric(f"{lang['mass_fraction_of']} {solvent_a_name} (w_A)", f"{w_a:.4f}")
311
- st.metric(f"{lang['mass_fraction_of']} {solvent_b_name} (w_B)", f"{w_b:.4f}")
312
- st.write(f"{lang['verification']}: w_A + w_B = {w_a + w_b:.4f}")
313
-
314
- # 质量分数 → 摩尔分数
315
- elif conversion_mode == lang["mode_mass_to_mole"]:
316
- with col1:
317
- st.header(lang["input_mass_fraction"])
318
- w_a = st.number_input(
319
- f"{lang['mass_fraction_of']} {solvent_a_name} (w_A):",
320
- min_value=0.0,
321
- max_value=1.0,
322
- value=0.5,
323
- step=0.001,
324
- format="%.4f"
325
- )
326
- w_b = 1.0 - w_a
327
- st.write(f"{lang['mass_fraction_of']} {solvent_b_name} (w_B): {w_b:.4f}")
328
-
329
- # 计算摩尔分数
330
- n_ratio_a = w_a / M_a
331
- n_ratio_b = w_b / M_b
332
- n_total = n_ratio_a + n_ratio_b
333
-
334
- if n_total > 0:
335
- x_a = n_ratio_a / n_total
336
- x_b = n_ratio_b / n_total
337
- else:
338
- x_a = x_b = 0
339
-
340
- with col2:
341
- st.header(lang["result_mole_fraction"])
342
- st.metric(f"{lang['mole_fraction_of']} {solvent_a_name} (x_A)", f"{x_a:.4f}")
343
- st.metric(f"{lang['mole_fraction_of']} {solvent_b_name} (x_B)", f"{x_b:.4f}")
344
  st.write(f"{lang['verification']}: x_A + x_B = {x_a + x_b:.4f}")
345
 
346
- # 体积分数 → 质量分数
347
- elif conversion_mode == lang["mode_vol_to_mass"]:
348
- with col1:
349
- st.header(lang["input_volume_fraction"])
350
- phi_a = st.number_input(
351
- f"{lang['volume_fraction_of']} {solvent_a_name} (φ_A):",
352
- min_value=0.0,
353
- max_value=1.0,
354
- value=0.5,
355
- step=0.001,
356
- format="%.4f"
357
- )
358
- phi_b = 1.0 - phi_a
359
- st.write(f"{lang['volume_fraction_of']} {solvent_b_name} (φ_B): {phi_b:.4f}")
360
-
361
- # 计算质量分数
362
- mass_a = phi_a * rho_a
363
- mass_b = phi_b * rho_b
364
- mass_total = mass_a + mass_b
365
-
366
- if mass_total > 0:
367
- w_a = mass_a / mass_total
368
- w_b = mass_b / mass_total
369
- else:
370
- w_a = w_b = 0
371
-
372
- with col2:
373
- st.header(lang["result_mass_fraction"])
374
- st.metric(f"{lang['mass_fraction_of']} {solvent_a_name} (w_A)", f"{w_a:.4f}")
375
- st.metric(f"{lang['mass_fraction_of']} {solvent_b_name} (w_B)", f"{w_b:.4f}")
376
- st.write(f"{lang['verification']}: w_A + w_B = {w_a + w_b:.4f}")
377
-
378
- # 质量分数 → 体积分数
379
- elif conversion_mode == lang["mode_mass_to_vol"]:
380
- with col1:
381
- st.header(lang["input_mass_fraction"])
382
- w_a = st.number_input(
383
- f"{lang['mass_fraction_of']} {solvent_a_name} (w_A):",
384
- min_value=0.0,
385
- max_value=1.0,
386
- value=0.5,
387
- step=0.001,
388
- format="%.4f"
389
- )
390
- w_b = 1.0 - w_a
391
- st.write(f"{lang['mass_fraction_of']} {solvent_b_name} (w_B): {w_b:.4f}")
392
-
393
- # 计算体积分数
394
- vol_a = w_a / rho_a
395
- vol_b = w_b / rho_b
396
- vol_total = vol_a + vol_b
397
-
398
- if vol_total > 0:
399
- phi_a = vol_a / vol_total
400
- phi_b = vol_b / vol_total
401
- else:
402
- phi_a = phi_b = 0
403
-
404
- with col2:
405
- st.header(lang["result_volume_fraction"])
406
- st.metric(f"{lang['volume_fraction_of']} {solvent_a_name} (φ_A)", f"{phi_a:.4f}")
407
- st.metric(f"{lang['volume_fraction_of']} {solvent_b_name} (φ_B)", f"{phi_b:.4f}")
408
- st.write(f"{lang['verification']}: φ_A + φ_B = {phi_a + phi_b:.4f}")
409
-
410
  # 详细信息展示
411
  st.markdown("---")
412
  st.header(lang["detailed_info"])
@@ -423,95 +271,36 @@ with col1:
423
  st.dataframe(df_params)
424
 
425
  with col2:
426
- if "mole" in conversion_mode:
427
- if conversion_mode in [lang["mode_mole_to_vol"], lang["mode_mole_to_mass"]]:
428
- st.subheader(lang["mole_fraction"])
429
- df_input = pd.DataFrame({
430
- lang["solvent"]: [solvent_a_name, solvent_b_name],
431
- lang["mole_fraction"]: [x_a, x_b]
432
- })
433
- st.dataframe(df_input)
434
- else:
435
- st.subheader(lang["mole_fraction"])
436
- df_result = pd.DataFrame({
437
- lang["solvent"]: [solvent_a_name, solvent_b_name],
438
- lang["mole_fraction"]: [x_a, x_b]
439
- })
440
- st.dataframe(df_result)
441
- elif "vol" in conversion_mode:
442
- if conversion_mode in [lang["mode_vol_to_mole"], lang["mode_vol_to_mass"]]:
443
- st.subheader(lang["volume_fraction"])
444
- df_input = pd.DataFrame({
445
- lang["solvent"]: [solvent_a_name, solvent_b_name],
446
- lang["volume_fraction"]: [phi_a, phi_b]
447
- })
448
- st.dataframe(df_input)
449
- else:
450
- st.subheader(lang["volume_fraction"])
451
- df_result = pd.DataFrame({
452
- lang["solvent"]: [solvent_a_name, solvent_b_name],
453
- lang["volume_fraction"]: [phi_a, phi_b]
454
- })
455
- st.dataframe(df_result)
456
- elif "mass" in conversion_mode:
457
- if conversion_mode in [lang["mode_mass_to_mole"], lang["mode_mass_to_vol"]]:
458
- st.subheader(lang["mass_fraction"])
459
- df_input = pd.DataFrame({
460
- lang["solvent"]: [solvent_a_name, solvent_b_name],
461
- lang["mass_fraction"]: [w_a, w_b]
462
- })
463
- st.dataframe(df_input)
464
- else:
465
- st.subheader(lang["mass_fraction"])
466
- df_result = pd.DataFrame({
467
- lang["solvent"]: [solvent_a_name, solvent_b_name],
468
- lang["mass_fraction"]: [w_a, w_b]
469
- })
470
- st.dataframe(df_result)
471
-
472
- with col3:
473
  if conversion_mode == lang["mode_mole_to_vol"]:
474
- st.subheader(lang["volume_fraction"])
475
- df_result = pd.DataFrame({
476
- lang["solvent"]: [solvent_a_name, solvent_b_name],
477
- lang["volume_fraction"]: [phi_a, phi_b]
478
- })
479
- st.dataframe(df_result)
480
- elif conversion_mode == lang["mode_mole_to_mass"]:
481
- st.subheader(lang["mass_fraction"])
482
- df_result = pd.DataFrame({
483
- lang["solvent"]: [solvent_a_name, solvent_b_name],
484
- lang["mass_fraction"]: [w_a, w_b]
485
- })
486
- st.dataframe(df_result)
487
- elif conversion_mode == lang["mode_vol_to_mole"]:
488
  st.subheader(lang["mole_fraction"])
489
- df_result = pd.DataFrame({
490
  lang["solvent"]: [solvent_a_name, solvent_b_name],
491
  lang["mole_fraction"]: [x_a, x_b]
492
  })
493
- st.dataframe(df_result)
494
- elif conversion_mode == lang["mode_vol_to_mass"]:
495
- st.subheader(lang["mass_fraction"])
496
- df_result = pd.DataFrame({
497
- lang["solvent"]: [solvent_a_name, solvent_b_name],
498
- lang["mass_fraction"]: [w_a, w_b]
499
- })
500
- st.dataframe(df_result)
501
- elif conversion_mode == lang["mode_mass_to_mole"]:
502
- st.subheader(lang["mole_fraction"])
503
- df_result = pd.DataFrame({
504
  lang["solvent"]: [solvent_a_name, solvent_b_name],
505
- lang["mole_fraction"]: [x_a, x_b]
506
  })
507
- st.dataframe(df_result)
508
- elif conversion_mode == lang["mode_mass_to_vol"]:
 
 
509
  st.subheader(lang["volume_fraction"])
510
- df_result = pd.DataFrame({
511
  lang["solvent"]: [solvent_a_name, solvent_b_name],
512
  lang["volume_fraction"]: [phi_a, phi_b]
513
  })
514
- st.dataframe(df_result)
 
 
 
 
 
 
 
515
 
516
  # 公式说明
517
  st.markdown("---")
@@ -524,6 +313,8 @@ if conversion_mode == lang["mode_mole_to_vol"]:
524
 
525
  $$\\phi_A = \\frac{{x_A \\cdot M_A / \\rho_A}}{{x_A \\cdot M_A / \\rho_A + x_B \\cdot M_B / \\rho_B}}$$
526
 
 
 
527
  {lang["formula_where"]}
528
  - $x_A, x_B$: 摩尔分数
529
  - $\\phi_A, \\phi_B$: 体积分数
@@ -536,20 +327,23 @@ if conversion_mode == lang["mode_mole_to_vol"]:
536
 
537
  $$\\phi_A = \\frac{{x_A \\cdot M_A / \\rho_A}}{{x_A \\cdot M_A / \\rho_A + x_B \\cdot M_B / \\rho_B}}$$
538
 
 
 
539
  {lang["formula_where"]}
540
  - $x_A, x_B$: Mole fractions
541
  - $\\phi_A, \\phi_B$: Volume fractions
542
  - $M_A, M_B$: Molar mass (g/mol)
543
  - $\\rho_A, \\rho_B$: Density (g/cm³)
544
  """)
545
-
546
- elif conversion_mode == lang["mode_vol_to_mole"]:
547
  if language == "中文":
548
  st.markdown(f"""
549
  {lang["formula_vol_to_mole_title"]}
550
 
551
  $$x_A = \\frac{{\\phi_A \\cdot \\rho_A / M_A}}{{\\phi_A \\cdot \\rho_A / M_A + \\phi_B \\cdot \\rho_B / M_B}}$$
552
 
 
 
553
  {lang["formula_where"]}
554
  - $\\phi_A, \\phi_B$: 体积分数
555
  - $x_A, x_B$: 摩尔分数
@@ -562,106 +356,12 @@ elif conversion_mode == lang["mode_vol_to_mole"]:
562
 
563
  $$x_A = \\frac{{\\phi_A \\cdot \\rho_A / M_A}}{{\\phi_A \\cdot \\rho_A / M_A + \\phi_B \\cdot \\rho_B / M_B}}$$
564
 
565
- {lang["formula_where"]}
566
- - $\\phi_A, \\phi_B$: Volume fractions
567
- - $x_A, x_B$: Mole fractions
568
- - $M_A, M_B$: Molar mass (g/mol)
569
- - $\\rho_A, \\rho_B$: Density (g/cm³)
570
- """)
571
-
572
- elif conversion_mode == lang["mode_mole_to_mass"]:
573
- if language == "中文":
574
- st.markdown(f"""
575
- {lang["formula_mole_to_mass_title"]}
576
-
577
- $$w_A = \\frac{{x_A \\cdot M_A}}{{x_A \\cdot M_A + x_B \\cdot M_B}}$$
578
-
579
- {lang["formula_where"]}
580
- - $x_A, x_B$: 摩尔分数
581
- - $w_A, w_B$: 质量分数
582
- - $M_A, M_B$: 摩尔质量 (g/mol)
583
- """)
584
- else:
585
- st.markdown(f"""
586
- {lang["formula_mole_to_mass_title"]}
587
-
588
- $$w_A = \\frac{{x_A \\cdot M_A}}{{x_A \\cdot M_A + x_B \\cdot M_B}}$$
589
 
590
  {lang["formula_where"]}
591
- - $x_A, x_B$: Mole fractions
592
- - $w_A, w_B$: Mass fractions
593
- - $M_A, M_B$: Molar mass (g/mol)
594
- """)
595
-
596
- elif conversion_mode == lang["mode_mass_to_mole"]:
597
- if language == "中文":
598
- st.markdown(f"""
599
- {lang["formula_mass_to_mole_title"]}
600
-
601
- $$x_A = \\frac{{w_A / M_A}}{{w_A / M_A + w_B / M_B}}$$
602
-
603
- {lang["formula_where"]}
604
- - $w_A, w_B$: 质量分数
605
- - $x_A, x_B$: 摩尔分数
606
- - $M_A, M_B$: 摩尔质量 (g/mol)
607
- """)
608
- else:
609
- st.markdown(f"""
610
- {lang["formula_mass_to_mole_title"]}
611
-
612
- $$x_A = \\frac{{w_A / M_A}}{{w_A / M_A + w_B / M_B}}$$
613
-
614
- {lang["formula_where"]}
615
- - $w_A, w_B$: Mass fractions
616
  - $x_A, x_B$: Mole fractions
617
  - $M_A, M_B$: Molar mass (g/mol)
618
- """)
619
-
620
- elif conversion_mode == lang["mode_vol_to_mass"]:
621
- if language == "中文":
622
- st.markdown(f"""
623
- {lang["formula_vol_to_mass_title"]}
624
-
625
- $$w_A = \\frac{{\\phi_A \\cdot \\rho_A}}{{\\phi_A \\cdot \\rho_A + \\phi_B \\cdot \\rho_B}}$$
626
-
627
- {lang["formula_where"]}
628
- - $\\phi_A, \\phi_B$: 体积分数
629
- - $w_A, w_B$: 质量分数
630
- - $\\rho_A, \\rho_B$: 密度 (g/cm³)
631
- """)
632
- else:
633
- st.markdown(f"""
634
- {lang["formula_vol_to_mass_title"]}
635
-
636
- $$w_A = \\frac{{\\phi_A \\cdot \\rho_A}}{{\\phi_A \\cdot \\rho_A + \\phi_B \\cdot \\rho_B}}$$
637
-
638
- {lang["formula_where"]}
639
- - $\\phi_A, \\phi_B$: Volume fractions
640
- - $w_A, w_B$: Mass fractions
641
- - $\\rho_A, \\rho_B$: Density (g/cm³)
642
- """)
643
-
644
- elif conversion_mode == lang["mode_mass_to_vol"]:
645
- if language == "中文":
646
- st.markdown(f"""
647
- {lang["formula_mass_to_vol_title"]}
648
-
649
- $$\\phi_A = \\frac{{w_A / \\rho_A}}{{w_A / \\rho_A + w_B / \\rho_B}}$$
650
-
651
- {lang["formula_where"]}
652
- - $w_A, w_B$: 质量分数
653
- - $\\phi_A, \\phi_B$: 体积分数
654
- - $\\rho_A, \\rho_B$: 密度 (g/cm³)
655
- """)
656
- else:
657
- st.markdown(f"""
658
- {lang["formula_mass_to_vol_title"]}
659
-
660
- $$\\phi_A = \\frac{{w_A / \\rho_A}}{{w_A / \\rho_A + w_B / \\rho_B}}$$
661
-
662
- {lang["formula_where"]}
663
- - $w_A, w_B$: Mass fractions
664
- - $\\phi_A, \\phi_B$: Volume fractions
665
  - $\\rho_A, \\rho_B$: Density (g/cm³)
666
  """)
667
 
 
6
  LANGUAGES = {
7
  "中文": {
8
  "page_title": "溶剂分数转换器",
9
+ "main_title": "🧪 溶剂摩尔分数体积分数转换器",
10
  "conversion_mode": "转换模式",
11
  "mode_mole_to_vol": "摩尔分数 → 体积分数",
12
  "mode_vol_to_mole": "体积分数 → 摩尔分数",
 
 
 
 
13
  "select_conversion": "选择转换方向:",
14
  "solvent_selection": "溶剂选择",
15
  "select_solvents": "选择两种溶剂或自定义参数:",
 
20
  "density": "密度",
21
  "input_mole_fraction": "输入摩尔分数",
22
  "input_volume_fraction": "输入体积分数",
 
23
  "mole_fraction_of": "摩尔分数",
24
  "volume_fraction_of": "体积分数",
 
25
  "result_volume_fraction": "计算结果 - 体积分数",
26
  "result_mole_fraction": "计算结果 - 摩尔分数",
 
27
  "verification": "验证",
28
  "detailed_info": "详细信息",
29
  "solvent_params": "溶剂参数",
30
  "solvent": "溶剂",
31
  "mole_fraction": "摩尔分数",
32
  "volume_fraction": "体积分数",
 
33
  "calculation_formula": "计算公式",
34
  "formula_mole_to_vol_title": "**摩尔分数转换为体积分数:**",
35
  "formula_vol_to_mole_title": "**体积分数转换为摩尔分数:**",
 
 
 
 
36
  "formula_where": "其中:",
37
  "usage_instructions": "使用说明",
38
  "instruction_1": "1. **选择转换模式**: 在侧边栏选择转换方向",
39
  "instruction_2": "2. **选择溶剂**: 从预设的常见溶剂中选择,或选择\"自定义\"输入参数",
40
+ "instruction_3": "3. **输入数值**: 使用滑块调整摩尔分数体积分数",
41
  "instruction_4": "4. **查看结果**: 右侧显示转换结果和详细信息",
42
  "note": "**注意**: 本计算假设理想混合,实际情况可能存在偏差。",
43
  "language": "语言"
44
  },
45
  "English": {
46
  "page_title": "Solvent Fraction Converter",
47
+ "main_title": "🧪 Solvent Mole Fraction & Volume Fraction Converter",
48
  "conversion_mode": "Conversion Mode",
49
  "mode_mole_to_vol": "Mole Fraction → Volume Fraction",
50
  "mode_vol_to_mole": "Volume Fraction → Mole Fraction",
 
 
 
 
51
  "select_conversion": "Select conversion direction:",
52
  "solvent_selection": "Solvent Selection",
53
  "select_solvents": "Select two solvents or customize parameters:",
 
58
  "density": "Density",
59
  "input_mole_fraction": "Input Mole Fraction",
60
  "input_volume_fraction": "Input Volume Fraction",
 
61
  "mole_fraction_of": "Mole fraction of",
62
  "volume_fraction_of": "Volume fraction of",
 
63
  "result_volume_fraction": "Results - Volume Fraction",
64
  "result_mole_fraction": "Results - Mole Fraction",
 
65
  "verification": "Verification",
66
  "detailed_info": "Detailed Information",
67
  "solvent_params": "Solvent Parameters",
68
  "solvent": "Solvent",
69
  "mole_fraction": "Mole Fraction",
70
  "volume_fraction": "Volume Fraction",
 
71
  "calculation_formula": "Calculation Formula",
72
  "formula_mole_to_vol_title": "**Mole Fraction to Volume Fraction:**",
73
  "formula_vol_to_mole_title": "**Volume Fraction to Mole Fraction:**",
 
 
 
 
74
  "formula_where": "Where:",
75
  "usage_instructions": "Usage Instructions",
76
  "instruction_1": "1. **Select Conversion Mode**: Choose conversion direction in sidebar",
77
  "instruction_2": "2. **Select Solvents**: Choose from preset common solvents or select 'Custom' to input parameters",
78
+ "instruction_3": "3. **Input Values**: Use sliders to adjust mole fraction or volume fraction",
79
  "instruction_4": "4. **View Results**: Results and detailed information are displayed on the right",
80
  "note": "**Note**: This calculation assumes ideal mixing; actual situations may deviate.",
81
  "language": "Language"
 
145
  st.sidebar.header(lang["conversion_mode"])
146
  conversion_mode = st.sidebar.radio(
147
  lang["select_conversion"],
148
+ [lang["mode_mole_to_vol"], lang["mode_vol_to_mole"]]
 
 
149
  )
150
 
151
  # 溶剂选择
 
189
  # 主界面内容
190
  col1, col2 = st.columns(2)
191
 
 
192
  if conversion_mode == lang["mode_mole_to_vol"]:
193
  with col1:
194
  st.header(lang["input_mole_fraction"])
 
218
  st.header(lang["result_volume_fraction"])
219
  st.metric(f"{lang['volume_fraction_of']} {solvent_a_name} (φ_A)", f"{phi_a:.4f}")
220
  st.metric(f"{lang['volume_fraction_of']} {solvent_b_name} (φ_B)", f"{phi_b:.4f}")
221
+
222
+ # 验证
223
  st.write(f"{lang['verification']}: φ_A + φ_B = {phi_a + phi_b:.4f}")
224
 
225
+ else: # 体积分数 → 摩尔分数
 
226
  with col1:
227
  st.header(lang["input_volume_fraction"])
228
  phi_a = st.number_input(
 
251
  st.header(lang["result_mole_fraction"])
252
  st.metric(f"{lang['mole_fraction_of']} {solvent_a_name} (x_A)", f"{x_a:.4f}")
253
  st.metric(f"{lang['mole_fraction_of']} {solvent_b_name} (x_B)", f"{x_b:.4f}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
254
 
255
+ # 验证
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
  st.write(f"{lang['verification']}: x_A + x_B = {x_a + x_b:.4f}")
257
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
258
  # 详细信息展示
259
  st.markdown("---")
260
  st.header(lang["detailed_info"])
 
271
  st.dataframe(df_params)
272
 
273
  with col2:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
274
  if conversion_mode == lang["mode_mole_to_vol"]:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
275
  st.subheader(lang["mole_fraction"])
276
+ df_mole = pd.DataFrame({
277
  lang["solvent"]: [solvent_a_name, solvent_b_name],
278
  lang["mole_fraction"]: [x_a, x_b]
279
  })
280
+ st.dataframe(df_mole)
281
+ else:
282
+ st.subheader(lang["volume_fraction"])
283
+ df_vol = pd.DataFrame({
 
 
 
 
 
 
 
284
  lang["solvent"]: [solvent_a_name, solvent_b_name],
285
+ lang["volume_fraction"]: [phi_a, phi_b]
286
  })
287
+ st.dataframe(df_vol)
288
+
289
+ with col3:
290
+ if conversion_mode == lang["mode_mole_to_vol"]:
291
  st.subheader(lang["volume_fraction"])
292
+ df_vol_result = pd.DataFrame({
293
  lang["solvent"]: [solvent_a_name, solvent_b_name],
294
  lang["volume_fraction"]: [phi_a, phi_b]
295
  })
296
+ st.dataframe(df_vol_result)
297
+ else:
298
+ st.subheader(lang["mole_fraction"])
299
+ df_mole_result = pd.DataFrame({
300
+ lang["solvent"]: [solvent_a_name, solvent_b_name],
301
+ lang["mole_fraction"]: [x_a, x_b]
302
+ })
303
+ st.dataframe(df_mole_result)
304
 
305
  # 公式说明
306
  st.markdown("---")
 
313
 
314
  $$\\phi_A = \\frac{{x_A \\cdot M_A / \\rho_A}}{{x_A \\cdot M_A / \\rho_A + x_B \\cdot M_B / \\rho_B}}$$
315
 
316
+ $$\\phi_B = \\frac{{x_B \\cdot M_B / \\rho_B}}{{x_A \\cdot M_A / \\rho_A + x_B \\cdot M_B / \\rho_B}}$$
317
+
318
  {lang["formula_where"]}
319
  - $x_A, x_B$: 摩尔分数
320
  - $\\phi_A, \\phi_B$: 体积分数
 
327
 
328
  $$\\phi_A = \\frac{{x_A \\cdot M_A / \\rho_A}}{{x_A \\cdot M_A / \\rho_A + x_B \\cdot M_B / \\rho_B}}$$
329
 
330
+ $$\\phi_B = \\frac{{x_B \\cdot M_B / \\rho_B}}{{x_A \\cdot M_A / \\rho_A + x_B \\cdot M_B / \\rho_B}}$$
331
+
332
  {lang["formula_where"]}
333
  - $x_A, x_B$: Mole fractions
334
  - $\\phi_A, \\phi_B$: Volume fractions
335
  - $M_A, M_B$: Molar mass (g/mol)
336
  - $\\rho_A, \\rho_B$: Density (g/cm³)
337
  """)
338
+ else:
 
339
  if language == "中文":
340
  st.markdown(f"""
341
  {lang["formula_vol_to_mole_title"]}
342
 
343
  $$x_A = \\frac{{\\phi_A \\cdot \\rho_A / M_A}}{{\\phi_A \\cdot \\rho_A / M_A + \\phi_B \\cdot \\rho_B / M_B}}$$
344
 
345
+ $$x_B = \\frac{{\\phi_B \\cdot \\rho_B / M_B}}{{\\phi_A \\cdot \\rho_A / M_A + \\phi_B \\cdot \\rho_B / M_B}}$$
346
+
347
  {lang["formula_where"]}
348
  - $\\phi_A, \\phi_B$: 体积分数
349
  - $x_A, x_B$: 摩尔分数
 
356
 
357
  $$x_A = \\frac{{\\phi_A \\cdot \\rho_A / M_A}}{{\\phi_A \\cdot \\rho_A / M_A + \\phi_B \\cdot \\rho_B / M_B}}$$
358
 
359
+ $$x_B = \\frac{{\\phi_B \\cdot \\rho_B / M_B}}{{\\phi_A \\cdot \\rho_A / M_A + \\phi_B \\cdot \\rho_B / M_B}}$$
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
360
 
361
  {lang["formula_where"]}
362
+ - $\\phi_A, \\phi_B$: Volume fractions
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
363
  - $x_A, x_B$: Mole fractions
364
  - $M_A, M_B$: Molar mass (g/mol)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
365
  - $\\rho_A, \\rho_B$: Density (g/cm³)
366
  """)
367