GUI (to input and output matrices)?

前端 未结 1 1119
陌清茗
陌清茗 2021-01-07 16:00

I need to create a GUI to input data into a matrix or table and read this form data.
The perfect solution is to restrict the input form to allow only float.

相关标签:
1条回答
  • 2021-01-07 16:16

    Using tkinter, you don't need a special table widget to do this -- just create a grid of normal entry widgets. If you have so many that you need a scrollbar it's slightly more difficult (and there are examples on this site for how to do that), but just to create a grid of something small it's very straightforward.

    Here's an example that also includes some input validation:

    import tkinter as tk
    
    class SimpleTableInput(tk.Frame):
        def __init__(self, parent, rows, columns):
            tk.Frame.__init__(self, parent)
    
            self._entry = {}
            self.rows = rows
            self.columns = columns
    
            # register a command to use for validation
            vcmd = (self.register(self._validate), "%P")
    
            # create the table of widgets
            for row in range(self.rows):
                for column in range(self.columns):
                    index = (row, column)
                    e = tk.Entry(self, validate="key", validatecommand=vcmd)
                    e.grid(row=row, column=column, stick="nsew")
                    self._entry[index] = e
            # adjust column weights so they all expand equally
            for column in range(self.columns):
                self.grid_columnconfigure(column, weight=1)
            # designate a final, empty row to fill up any extra space
            self.grid_rowconfigure(rows, weight=1)
    
        def get(self):
            '''Return a list of lists, containing the data in the table'''
            result = []
            for row in range(self.rows):
                current_row = []
                for column in range(self.columns):
                    index = (row, column)
                    current_row.append(self._entry[index].get())
                result.append(current_row)
            return result
    
        def _validate(self, P):
            '''Perform input validation. 
    
            Allow only an empty value, or a value that can be converted to a float
            '''
            if P.strip() == "":
                return True
    
            try:
                f = float(P)
            except ValueError:
                self.bell()
                return False
            return True
    
    class Example(tk.Frame):
        def __init__(self, parent):
            tk.Frame.__init__(self, parent)
            self.table = SimpleTableInput(self, 3, 4)
            self.submit = tk.Button(self, text="Submit", command=self.on_submit)
            self.table.pack(side="top", fill="both", expand=True)
            self.submit.pack(side="bottom")
    
        def on_submit(self):
            print(self.table.get())
    
    
    root = tk.Tk()
    Example(root).pack(side="top", fill="both", expand=True)
    root.mainloop()
    

    More about input validation can be found here: Interactively validating Entry widget content in tkinter

    0 讨论(0)
提交回复
热议问题