我对Python非常陌生,我想构建一个带有许多盒子的GUI界面。这是我到目前为止所尝试过的
import tkinter as tk
from tkinter import ttk, messagebox
class MultiOptimizationApp:
def __init__(self, master):
self.master = master
master.title("Multi-Objective Optimization Setup")
# Initialize variables dictionary
self.data = {
"Number of Variables": tk.StringVar(),
"Number of Objectives": tk.StringVar(),
"Number of Constraints": tk.StringVar(),
"List of Lower Bounds": tk.StringVar(),
"List of Upper Bounds": tk.StringVar()
}
# Create labels and entries
ttk.Label(master, text="Number of Variables:").grid(row=0, column=0, padx=5, pady=5, sticky="e")
self.var_entry = ttk.Entry(master, textvariable=self.data["Number of Variables"])
self.var_entry.grid(row=0, column=1, padx=5, pady=5, sticky="w")
ttk.Label(master, text="Number of Objectives:").grid(row=1, column=0, padx=5, pady=5, sticky="e")
self.obj_entry = ttk.Entry(master, textvariable=self.data["Number of Objectives"])
self.obj_entry.grid(row=1, column=1, padx=5, pady=5, sticky="w")
ttk.Label(master, text="Number of Constraints:").grid(row=2, column=0, padx=5, pady=5, sticky="e")
self.con_entry = ttk.Entry(master, textvariable=self.data["Number of Constraints"])
self.con_entry.grid(row=2, column=1, padx=5, pady=5, sticky="w")
#still having problems with numbers like ln(2), exp(1), sin(2)
ttk.Label(master, text="List of Lower Bounds (comma-separated):").grid(row=3, column=0, padx=5, pady=5, sticky="e")
self.lb_entry = ttk.Entry(master, textvariable=self.data["List of Lower Bounds"])
self.lb_entry.grid(row=3, column=1, padx=5, pady=5, sticky="w")
ttk.Label(master, text="List of Upper Bounds (comma-separated):").grid(row=4, column=0, padx=5, pady=5, sticky="e")
self.ub_entry = ttk.Entry(master, textvariable=self.data["List of Upper Bounds"])
self.ub_entry.grid(row=4, column=1, padx=5, pady=5, sticky="w")
# Create submit button
self.submit_button = ttk.Button(master, text="Submit", command=self.submit_data)
self.submit_button.grid(row=5, column=0, columnspan=2, padx=5, pady=10, sticky="ew")
# Configure resizing behavior
master.columnconfigure(1, weight=1)
def submit_data(self):
try:
# Retrieve data from entries
num_vars = int(self.data["Number of Variables"].get())
num_objs = int(self.data["Number of Objectives"].get())
num_cons = int(self.data["Number of Constraints"].get())
lb_list = [float(x) for x in self.data["List of Lower Bounds"].get().split(',')]
ub_list = [float(x) for x in self.data["List of Upper Bounds"].get().split(',')]
# Validate bounds
if len(lb_list) != num_vars or len(ub_list) != num_vars:
raise ValueError("Number of bounds does not match number of variables.")
# Store data in a dictionary
data_dict = {
"Number of Variables": num_vars,
"Number of Objectives": num_objs,
"Number of Constraints": num_cons,
"List of Lower Bounds": lb_list,
"List of Upper Bounds": ub_list
}
# Print data
print("Data submitted successfully:")
for key, value in data_dict.items():
print(f"{key}: {value}")
messagebox.showinfo("Success", "Data submitted successfully!")
except ValueError as e:
messagebox.showerror("Error", str(e))
def run():
root = tk.Tk()
app = MultiOptimizationApp(root)
root.mainloop()
run()
我想在上面的应用程序中添加更多盒子。最终,下面的图 2 捕捉到了我想要的。也就是说,假设您在框中输入数字。例如变量个数:2;目标数量:2;约束数量:3;下限列表:-1,2;上限列表:2,4 然后点击“提交”,然后我想要如下图 2 所示的内容:
感谢您的宝贵时间!
在提交函数中,您可以添加代码来动态添加输入条目。例如:对于目标,您可以这样做,对于约束等也可以这样做。
if num_objs > 0:
for i in range(num_objs):
ttk.Label(self.master, text=f"Objective {i+1}:").grid(row=6+i, column=0, padx=5, pady=5, sticky="e")
ttk.Entry(self.master).grid(row=6+i, column=1, padx=5, pady=5, sticky="w")
为了将下界中的数学表达式作为输入,您可以使用 eval 而不是 float,(您必须导入 math 模块):
lb_list = [eval(x.strip(), math.__dict__) for x in lb_input.split(',')]