2017-09-23 60 views
1

我想組織標題,以便它們與列對齊。下面是代碼(創建表),但它不按我想要的方式工作。:如何對齊tkinter表中的列標題python

class Example(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent)    
     names = ["header1", "header2", "header3", "header4"] 
     self.label1 = tk.Label(self, text=("  ".join(names))) 
     self.table = SimpleTableInput(self, 3, 4) 
     self.submit = tk.Button(self, text="Submit", command=self.on_submit) 
     self.label1.pack(side="top") 
     self.table.pack(side="top", fill="both", expand=True) 
     self.submit.pack(side="bottom") 

我很感激任何建議!由於

整個腳本是在這裏:

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)    
     names = ["header1", "header2", "header3", "header4"] 
     self.label1 = tk.Label(self, text=("  ".join(names))) 
     self.table = SimpleTableInput(self, 3, 4) 
     self.submit = tk.Button(self, text="Submit", command=self.on_submit) 
     self.label1.pack(side="top") 
     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() 
+0

這將很難將Label中的文本與不同的小部件的列對齊。你可以發佈'SimpleTableInput'的代碼嗎?也許你有一些選項直接顯示頭部內容? – PRMoureu

+0

我發佈了整個代碼,SimpleTableInput是它的一部分。謝謝 – New2coding

回答

1

我建議的方法是創建一個在頂部框架,並與names內分離標籤來填充它。它允許對齊列並保持這種對齊,即使窗口被展開:

class Example(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     names = ["header1", "header2", "header3", "header4"] 
     frame = tk.Frame(self) 
     frame.pack(side="top", fill="both", expand=True) 
     for i, title in enumerate(names): 
      l = tk.Label(frame, text=title) 
      l.grid(row=0, column=i) 
      frame.grid_columnconfigure(i, weight=1) 
     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") 
+0

您的解決方案正是我所追求的。謝謝! – New2coding