You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Tkinter与Combobox(GUI)时出现全局变量未定义问题

Fix NameError: 'var1' is not defined in Tkinter Combobox Calculation App

Let's break down why you're hitting this error and fix it step by step:

The Root Cause

Your code calls sol_analysis(selected1,selected2,selected3) immediately when the program starts—before any user selects an option from the comboboxes. The var1, var2, var3 variables are only defined inside the selected1/2/3 event handlers, which don't run until a combobox selection is made. Even with the global keyword, if those handlers never execute, the variables never exist.

Plus, your sol_analysis function doesn't actually use the parameters you pass to it—it relies on the global variables directly, so those parameters are redundant.

The Fixed Code

Here's the revised version that implements "select first, calculate later" correctly:

import openpyxl
from tkinter import *
import tkinter.ttk as ttk
from openpyxl import Workbook
from openpyxl import load_workbook

# Initialize global variables with default values to avoid NameError
var1 = 0
var2 = 0
var3 = 0

def selected1(event):
    global var1
    # Simplify with dictionary mapping instead of multiple ifs
    type_map = {'clam shell': 1, '360°': 2}
    var1 = type_map.get(mycombobox.get(), 0)

def selected2(event):
    global var2
    pos_map = {'hinge': 3, 'top': 4}
    var2 = pos_map.get(mycombobox1.get(), 0)

def selected3(event):
    global var3
    pos_map = {'hinge': 5, 'top': 6}
    var3 = pos_map.get(mycombobox2.get(), 0)

def sol_analysis():
    # Calculate and display the result
    var4 = var1 + var2 + var3
    # Update the result label with the new value
    result_label.config(text=f"Calculation Result: {var4}")

# ========================= main ==============================
root = Tk()
root.title('Industry Solution')
root.geometry("500x800")

# === Type ===
label_a = Label(root, text="1. type of computer")
label_a.pack(side=TOP, pady=1)
type_com = ['Type', 'clam shell', '360°']
mycombobox = ttk.Combobox(root, values=type_com)
mycombobox.current(0)
mycombobox.bind('<<ComboboxSelected>>', selected1)
mycombobox.pack(side=TOP, pady=1)

# === WLAN1 position ===
label_b = Label(root, text="2. WLAN1 antenna position")
label_b.pack(side=TOP, pady=1)
WLAN1_ant = ['WLAN1 ant. position', 'hinge', 'top']
mycombobox1 = ttk.Combobox(root, values=WLAN1_ant)
mycombobox1.current(0)
mycombobox1.bind('<<ComboboxSelected>>', selected2)
mycombobox1.pack(side=TOP, pady=1)

# === WLAN2 position ===
label_c = Label(root, text="3. WLAN2 antenna position")
label_c.pack(side=TOP, pady=1)
WLAN2_ant = ['WLAN2 ant. position', 'hinge', 'top']
mycombobox2 = ttk.Combobox(root, values=WLAN2_ant)
mycombobox2.current(0)
mycombobox2.bind('<<ComboboxSelected>>', selected3)
mycombobox2.pack(side=TOP, pady=1)

# === Calculate Button & Result Display ===
# Add a button to trigger calculation after selection
calc_btn = Button(root, text="Calculate Result", command=sol_analysis)
calc_btn.pack(side=TOP, pady=20)

# Label to show the calculation result
result_label = Label(root, text="Calculation Result: 0")
result_label.pack(side=TOP, pady=10)

root.mainloop()

Key Changes Explained

  1. Pre-initialize Global Variables: We set var1 = 0, var2 = 0, var3 = 0 at the start. This ensures the variables exist even before any combobox selection, eliminating the NameError.
  2. Add a Calculation Button: Instead of running sol_analysis on startup, we tie it to a button click. This lets users make all their selections first, then trigger the calculation intentionally.
  3. Simplify Event Handlers: Used dictionary mappings (type_map, pos_map) to replace repetitive if statements—this makes the code cleaner and easier to extend if you add more options later.
  4. Display the Result: Added a result_label that updates when the calculation runs, so users can actually see the output of the sum.
  5. Remove Redundant Parameters: The sol_analysis function no longer takes unused parameters, since it works directly with the global variables.

Now when you run the app:

  • Select options from all three comboboxes
  • Click the "Calculate Result" button
  • The sum will appear in the result label, no more NameError!

内容的提问来源于stack exchange,提问作者Denny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 01:27:44