【问题标题】:Creating a table look-a-like Tkinter创建一个类似于 Tkinter 的表
【发布时间】:2012-06-15 09:14:59
【问题描述】:

我希望在 Tkinter 中创建类似于表格的东西,但不一定必须是一个。

例如,我想创建标题“Name1”、“Name2”、“Value”,在每个标题下方我希望有几个空白行。

然后我希望稍后用我计算的值或名称的字符串值填充这些行(因此是标签)。

对于“Name2”,我实际上希望整个列成为一个下拉菜单。我已经自己创建了一个代码,但不知道如何将它合并到这个“表”中。

例如,是否可以在 Label 小部件周围创建一个边框,使其看起来像一个“表格”?

非常感谢任何关于在这种情况下可能发生的事情的指针。如果您需要我的任何代码来做某事,请问。谢谢!

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    你有什么问题?简单的解决方案是使用grid 布置小部件。您可以在每个单元格中放置您想要的任何类型的小部件。是的,标签可以有边框。不过,制作网格线的一种简单方法是在每个单元格周围使用填充,这样框架的颜色就会通过间隙显示出来。

    在一个框架中执行此操作。如果您需要能够滚动表格,请将框架放在画布内并添加滚动条。网络上到处都有关于如何使用画布创建可滚动框架的示例。

    这是一个非常简单的示例,它只使用标签,不滚动。我将把你需要的确切实现作为练习留给读者。

    import Tkinter as tk
    
    class ExampleApp(tk.Tk):
        def __init__(self):
            tk.Tk.__init__(self)
            t = SimpleTable(self, 10,2)
            t.pack(side="top", fill="x")
            t.set(0,0,"Hello, world")
    
    class SimpleTable(tk.Frame):
        def __init__(self, parent, rows=10, columns=2):
            # use black background so it "peeks through" to 
            # form grid lines
            tk.Frame.__init__(self, parent, background="black")
            self._widgets = []
            for row in range(rows):
                current_row = []
                for column in range(columns):
                    label = tk.Label(self, text="%s/%s" % (row, column), 
                                     borderwidth=0, width=10)
                    label.grid(row=row, column=column, sticky="nsew", padx=1, pady=1)
                    current_row.append(label)
                self._widgets.append(current_row)
    
            for column in range(columns):
                self.grid_columnconfigure(column, weight=1)
    
    
        def set(self, row, column, value):
            widget = self._widgets[row][column]
            widget.configure(text=value)
    
    if __name__ == "__main__":
        app = ExampleApp()
        app.mainloop()
    

    【讨论】:

    • 我现在唯一的问题是我从来没有真正使用过'self'或'init'并且不太明白如何将我的其他功能合并到菜单等. 你能给我一些建议(对于极端初学者!)好吗?
    • 例如,我什至对如何为框架分配名称有点困惑......但我有打开和菜单等功能。
    • @user20:你认为为什么需要为框架指定名称?在上面的示例中,t 持有对框架的引用,这就是您使用它所需的全部内容。
    • self.grid_columnconfigure(column, weight=1) 是做什么的? (我尝试省略您示例的这一部分,但没有看到任何变化)(Python 3.6)
    • @Siemkowski:它告诉网格几何管理器如何分配额外空间。如果您省略代码,您将在手动调整小部件大小以使其更大时立即看到差异。
    【解决方案2】:

    我找到了一个相当简单的无对象解决方案:

    from Tkinter import *
    
    rows = []
    for i in range(5):
        cols = []
        for j in range(4):
            e = Entry(relief=RIDGE)
            e.grid(row=i, column=j, sticky=NSEW)
            e.insert(END, '%d.%d' % (i, j))
            cols.append(e)
        rows.append(cols)
    
    def onPress():
        for row in rows:
            for col in row:
                print col.get(),
            print
    
    Button(text='Fetch', command=onPress).grid()
    mainloop()
    

    # simple 2d table
    
    from Tkinter import *
    
    for i in range(5):
        for j in range(4):
            l = Label(text='%d.%d' % (i, j), relief=RIDGE)
            l.grid(row=i, column=j, sticky=NSEW)
    
    mainloop()
    

    所有可在http://www.java2s.com/Code/Python/GUI-Tk/获取

    【讨论】:

      【解决方案3】:

      如何从字典创建表:

      my_dict = {
          1: {'Header1': 'Row1_Value1', 'Header2': 'Row1_Value2', 'Header3': 'Row1_Value3', },
          2: {'Header1': 'Row2_Value1', 'Header2': 'Row2_Value2', 'Header3': 'Row2_Value3', },
      
          }
      
      # Create the header
      for column, header in enumerate(my_dict[1]):
          Label(self, text=header).grid(row=0, column=0+column)
      
      # Fill in the values
      for row, element in enumerate(my_dict.values()):
          for column, (header, value) in enumerate(element.items()):
              Label(self, text=value).grid(row=1+row, column=0+column)
      

      【讨论】:

        猜你喜欢
        • 2020-03-28
        • 1970-01-01
        • 1970-01-01
        • 2013-11-07
        • 1970-01-01
        • 2016-12-11
        • 1970-01-01
        • 2011-06-13
        • 2015-06-16
        相关资源
        最近更新 更多