使用许多盒子构建Python GUI

问题描述 投票:0回答:1

我对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()

这是我从上面的代码得到的结果。见图1: Figure 1

我想在上面的应用程序中添加更多盒子。最终,下面的图 2 捕捉到了我想要的。也就是说,假设您在框中输入数字。例如变量个数:2;目标数量:2;约束数量:3;下限列表:-1,2;上限列表:2,4 然后点击“提交”,然后我想要如下图 2 所示的内容:

Figure 2

  1. 我在获取图 2 时遇到了困难。可以吗 有人请给我提示/帮助吗?
  2. 当前我的条目框(来自图 1)不接受像 sin(1) 这样的数字, ln(2),exp(1)。我不知道如何解决这个问题。有人可以给我提示/帮助吗?

感谢您的宝贵时间!

python python-3.x user-interface
1个回答
0
投票

在提交函数中,您可以添加代码来动态添加输入条目。例如:对于目标,您可以这样做,对于约束等也可以这样做。

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(',')]
© www.soinside.com 2019 - 2024. All rights reserved.