python - 如何从 tkinter 的下拉菜单中提取信息?
问题描述
我如何从一个人在下拉菜单中选择的内容中获取信息?我希望下拉菜单影响计算器正在计算的内容。所以我想到的是检查他们选择的内容,然后使用 if 语句来确定要计算的内容。相关代码在底部,但请忽略它们value
,value1
因为它们只是测试。我想看看python会给我什么错误和信息。
import tkinter as tk
from tkinter import *
from PIL import ImageTk, Image
HEIGHT = 600
WIDTH = 900
h = 6.63e-34
c = 3.00e+8
def on_select(value):
if value == OPTIONS[0]:
label_enter_what['text'] = 'Enter wavelength in chosen unit below'
label_unit['text'] = 'Enter what unit \n of wavelength'
unit_set.set(OPTIONS_UNITS[1])
elif value == OPTIONS[1]:
label_enter_what['text'] = 'Enter wavelength in chosen unit below'
label_unit['text'] = 'Enter what unit \n of wavelength'
unit_set.set(OPTIONS_UNITS[1])
elif value == OPTIONS[2]:
label_enter_what['text'] = 'Enter energy in chosen unit below'
label_unit['text'] = 'Enter what unit of energy'
unit_set.set(OPTIONS_UNITS[3])
root = tk.Tk()
root.title("Photon property calculator")
canvas = tk.Canvas(root, height=HEIGHT, width=WIDTH)
canvas.pack()
background_image = ImageTk.PhotoImage(Image.open('interference.jpg'))
background_label = tk.Label(root, image=background_image)
background_label.place(relheight=1, relwidth=1)
frame = tk.Frame(root, bg='#3E3E3E', bd=5)
frame.place(relx=0.5, rely=0.1, relheight=0.1, relwidth=0.75, anchor='n')
entry_value = tk.Entry(frame, font=40, bg='white')
entry_value.place(relx=0.175, rely=0, relheight=1, relwidth=0.4)
frame_upper = tk.Frame(root, bg='#3E3E3E', bd=2.5)
frame_upper.place(relx=0.5, rely=0.03, relheight=0.06, relwidth=0.75, anchor='n')
label_what_to_calc = tk.Label(frame_upper, bg='white', text='Enter what \n to calculate')
label_what_to_calc.place(relx=0, rely=0, relheight=1, relwidth=0.15)
label_enter_what = tk.Label(frame_upper, bg='white', text='Select an option')
label_enter_what.place(relx=0.175, relheight=1, relwidth=0.4)
label_unit = tk.Label(frame_upper, bg='white', text='Enter what unit \n of wavelength')
label_unit.place(relx=0.6, relheight=1, relwidth=0.21)
lower_frame = tk.Frame(root, bg='#60A8FF', bd=10)
lower_frame.place(relx=0.5, rely=0.3, relheight=0.5, relwidth=0.75, anchor='n')
OPTIONS = [
"Energy",
"Frequency",
"Wavelength"
]
value_var = tk.StringVar(value=OPTIONS[0])
drop = tk.OptionMenu(frame, value_var, *OPTIONS, command=on_select)
drop.place(relx=0, rely=0, relheight=1, relwidth=0.15)
OPTIONS_UNITS = ["μm",
"nm",
"pm",
"aJ",
"zJ",
]
unit_set = tk.StringVar(value=OPTIONS_UNITS[0])
drop_units = tk.OptionMenu(frame, unit_set, *OPTIONS_UNITS)
drop_units.place(relx=0.6, rely=0, relheight=1, relwidth=0.09)
def do_operation():
first_number = entry_value.get()
try:
input = float(first_number)
if value == [0] and value1 == [0]:
new_num = input*10e-28
label['text'] = str(h*c/new_num)
elif OPTIONS ==[0] and OPTIONS_UNITS == [1]:
label['text'] = str("test")
except ValueError:
print("wrong")
button = tk.Button(frame, text='Calculate!', font=40, bg="#F96612", fg='black', command=do_operation)
button.place(relx=0.7, relheight=1, relwidth=0.3)
label = tk.Label(lower_frame, bg='white', text='1')
label.place(relheight=1, relwidth=1)
root.mainloop()
解决方案
如果你想在你的选项改变时运行一个函数,你可以在你的 StringVar() 对象上设置一个跟踪。value_var.trace("w", on_select)
然后您可以使用value_var.get()
. 我已在某种程度上将其编辑到您的代码中。我没有运行代码,所以它可能有一些问题;尽管已经解决了最常见的问题。如果您有任何问题,请随时发表评论。
import tkinter as tk
from tkinter import *
from PIL import ImageTk, Image
HEIGHT = 600
WIDTH = 900
h = 6.63e-34
c = 3.00e+8
value_var = tk.StringVar() # value_var has to be moved ahead of your function
def on_select(*args):
global value_var # value_var has to be declared as a global in your function
value = value_var.get() # value_var.get() returns the current string.
if value == OPTIONS[0]:
label_enter_what['text'] = 'Enter wavelength in chosen unit below'
label_unit['text'] = 'Enter what unit \n of wavelength'
unit_set.set(OPTIONS_UNITS[1])
elif value == OPTIONS[1]:
label_enter_what['text'] = 'Enter wavelength in chosen unit below'
label_unit['text'] = 'Enter what unit \n of wavelength'
unit_set.set(OPTIONS_UNITS[1])
elif value == OPTIONS[2]:
label_enter_what['text'] = 'Enter energy in chosen unit below'
label_unit['text'] = 'Enter what unit of energy'
unit_set.set(OPTIONS_UNITS[3])
root = tk.Tk()
root.title("Photon property calculator")
canvas = tk.Canvas(root, height=HEIGHT, width=WIDTH)
canvas.pack()
background_image = ImageTk.PhotoImage(Image.open('interference.jpg'))
background_label = tk.Label(root, image=background_image)
background_label.place(relheight=1, relwidth=1)
frame = tk.Frame(root, bg='#3E3E3E', bd=5)
frame.place(relx=0.5, rely=0.1, relheight=0.1, relwidth=0.75, anchor='n')
entry_value = tk.Entry(frame, font=40, bg='white')
entry_value.place(relx=0.175, rely=0, relheight=1, relwidth=0.4)
frame_upper = tk.Frame(root, bg='#3E3E3E', bd=2.5)
frame_upper.place(relx=0.5, rely=0.03, relheight=0.06, relwidth=0.75, anchor='n')
label_what_to_calc = tk.Label(frame_upper, bg='white', text='Enter what \n to calculate')
label_what_to_calc.place(relx=0, rely=0, relheight=1, relwidth=0.15)
label_enter_what = tk.Label(frame_upper, bg='white', text='Select an option')
label_enter_what.place(relx=0.175, relheight=1, relwidth=0.4)
label_unit = tk.Label(frame_upper, bg='white', text='Enter what unit \n of wavelength')
label_unit.place(relx=0.6, relheight=1, relwidth=0.21)
lower_frame = tk.Frame(root, bg='#60A8FF', bd=10)
lower_frame.place(relx=0.5, rely=0.3, relheight=0.5, relwidth=0.75, anchor='n')
OPTIONS = [
"Energy",
"Frequency",
"Wavelength"
]
value_var.trace("w", on_select) # The "w" parameter sets it to trigger on write events
value_var.set(OPTIONS[0]) # value_var.set() will set the string value but it will also trigger the trace event.
drop = tk.OptionMenu(frame, value_var, *OPTIONS)
drop.place(relx=0, rely=0, relheight=1, relwidth=0.15)
OPTIONS_UNITS = ["μm",
"nm",
"pm",
"aJ",
"zJ",
]
unit_set = tk.StringVar(value=OPTIONS_UNITS[0])
drop_units = tk.OptionMenu(frame, unit_set, *OPTIONS_UNITS)
drop_units.place(relx=0.6, rely=0, relheight=1, relwidth=0.09)
def do_operation():
first_number = entry_value.get()
try:
input = float(first_number)
if value == [0] and value1 == [0]:
new_num = input*10e-28
label['text'] = str(h*c/new_num)
elif OPTIONS ==[0] and OPTIONS_UNITS == [1]:
label['text'] = str("test")
except ValueError:
print("wrong")
button = tk.Button(frame, text='Calculate!', font=40, bg="#F96612", fg='black', command=do_operation)
button.place(relx=0.7, relheight=1, relwidth=0.3)
label = tk.Label(lower_frame, bg='white', text='1')
label.place(relheight=1, relwidth=1)
root.mainloop()
没有使用命令设置的跟踪和回调。
import tkinter as tk
from tkinter import *
from PIL import ImageTk, Image
HEIGHT = 600
WIDTH = 900
h = 6.63e-34
c = 3.00e+8
value_var = tk.StringVar() # value_var has to be moved ahead of your function
def on_select():
global value_var # value_var has to be declared as a global in your function
value = value_var.get() # value_var.get() returns the current string.
if value == OPTIONS[0]:
label_enter_what['text'] = 'Enter wavelength in chosen unit below'
label_unit['text'] = 'Enter what unit \n of wavelength'
unit_set.set(OPTIONS_UNITS[1])
elif value == OPTIONS[1]:
label_enter_what['text'] = 'Enter wavelength in chosen unit below'
label_unit['text'] = 'Enter what unit \n of wavelength'
unit_set.set(OPTIONS_UNITS[1])
elif value == OPTIONS[2]:
label_enter_what['text'] = 'Enter energy in chosen unit below'
label_unit['text'] = 'Enter what unit of energy'
unit_set.set(OPTIONS_UNITS[3])
root = tk.Tk()
root.title("Photon property calculator")
canvas = tk.Canvas(root, height=HEIGHT, width=WIDTH)
canvas.pack()
background_image = ImageTk.PhotoImage(Image.open('interference.jpg'))
background_label = tk.Label(root, image=background_image)
background_label.place(relheight=1, relwidth=1)
frame = tk.Frame(root, bg='#3E3E3E', bd=5)
frame.place(relx=0.5, rely=0.1, relheight=0.1, relwidth=0.75, anchor='n')
entry_value = tk.Entry(frame, font=40, bg='white')
entry_value.place(relx=0.175, rely=0, relheight=1, relwidth=0.4)
frame_upper = tk.Frame(root, bg='#3E3E3E', bd=2.5)
frame_upper.place(relx=0.5, rely=0.03, relheight=0.06, relwidth=0.75, anchor='n')
label_what_to_calc = tk.Label(frame_upper, bg='white', text='Enter what \n to calculate')
label_what_to_calc.place(relx=0, rely=0, relheight=1, relwidth=0.15)
label_enter_what = tk.Label(frame_upper, bg='white', text='Select an option')
label_enter_what.place(relx=0.175, relheight=1, relwidth=0.4)
label_unit = tk.Label(frame_upper, bg='white', text='Enter what unit \n of wavelength')
label_unit.place(relx=0.6, relheight=1, relwidth=0.21)
lower_frame = tk.Frame(root, bg='#60A8FF', bd=10)
lower_frame.place(relx=0.5, rely=0.3, relheight=0.5, relwidth=0.75, anchor='n')
OPTIONS = [
"Energy",
"Frequency",
"Wavelength"
]
value_var.set(OPTIONS[0]) # value_var.set() will set the string value but will not trigger an event as the OptionMenu has not been created with the call back yet.
drop = tk.OptionMenu(frame, value_var, *OPTIONS, command=on_select)
drop.place(relx=0, rely=0, relheight=1, relwidth=0.15)
OPTIONS_UNITS = ["μm",
"nm",
"pm",
"aJ",
"zJ",
]
unit_set = tk.StringVar(value=OPTIONS_UNITS[0])
drop_units = tk.OptionMenu(frame, unit_set, *OPTIONS_UNITS)
drop_units.place(relx=0.6, rely=0, relheight=1, relwidth=0.09)
def do_operation():
first_number = entry_value.get()
try:
input = float(first_number)
if value == [0] and value1 == [0]:
new_num = input*10e-28
label['text'] = str(h*c/new_num)
elif OPTIONS ==[0] and OPTIONS_UNITS == [1]:
label['text'] = str("test")
except ValueError:
print("wrong")
button = tk.Button(frame, text='Calculate!', font=40, bg="#F96612", fg='black', command=do_operation)
button.place(relx=0.7, relheight=1, relwidth=0.3)
label = tk.Label(lower_frame, bg='white', text='1')
label.place(relheight=1, relwidth=1)
root.mainloop()
推荐阅读
- rust - 如何使用迭代器和范围创建阶乘的非递归计算?
- pine-script - 如何使用用于 TradingView 的 Pine 脚本创建累积分时
- mysql - sql添加条件IF
- hadoop - 为什么Datanode进程没有在wsl中运行?
- reactjs - 正确使用 UseCallBack
- pyparsing - 如何处理带前缀的关键字?
- acumatica - System.InvalidOperationException:在应用程序的预启动初始化阶段无法调用此方法
- c - 问题解释和错误检测(假设我想打印 3-8 之间的素数)
- java - Java 扫描仪故障
- json - 使用 jq 根据来自 JSON 文件的参数值调用 AWS CLI