Python ttk网格不显示所有元素

时间:2013-12-04 17:42:23

标签: python grid tkinter ttk

我正在尝试在Tkinter / ttk中制作一个简化的日历小部件,以便我选择月份和年份。我没有把所有的元素都显示出来。在下面给出的表格中,它仅显示具有月份的组合框。我敢肯定,我只是犯了一些其他人会立即指出的愚蠢错误,然后我将继续以我的愚蠢行为:-)。目标是让按钮,条目和组合框都显示在配置中:

| <Button | Entry | >Button |
|          Combobox         |
|        ChooseButton       |

如果我取消注释self.pack(),它会挂起。如果我取消注释self.pack()并注释掉self.box.grid,它会显示其余的小部件。现在,我假设我不应该一起使用包和网格,我只是尝试了,因为我看到其他人这样做了,我想我也可以尝试一下。

from Tkinter import Tk
from ttk import Frame, Combobox, Button, Entry
import calendar, re

def printThisFunc(string):
    def printFunc():
        print string
    return printFunc

class SelectMonthDialog(Frame):
    def __init__(self, parent, startDate):
        Frame.__init__(self, parent, padding='10px')   
        self.parent = parent
        self.parent.title('Select month')
        button = Button(self, text='<', command = printThisFunc('<'))
        button.grid(row=0, column=0)
        self.yearEntry = Entry(self)
        self.yearEntry.insert(0,str(startDate.year))
        self.yearEntry.grid(row=0, column=1)
        button = Button(self, text='>', command = printThisFunc('>'))
        button.grid(row=0, column=2)
        months = calendar.month_name[1:]
        self.box = Combobox(self.parent, state='readonly')
        self.box['values'] = months
        self.box.current(startDate.month-1)
        self.box.grid(row=1, column=0, columnspan=3)
        button = Button(self, text='Choose', command = printThisFunc('choose'))
        button.grid(row=2, column=0, columnspan=3)
        #self.pack()

if __name__ == "__main__":
    from datetime import datetime
    root = Tk()
    SelectMonthDialog(root, datetime.today())
    root.mainloop()

2 个答案:

答案 0 :(得分:1)

您创建的大多数小部件都有self的父级。这意味着它们是作为SelectMonthDialog实例的窗口小部件的子代。但是,您不会在其父级中打包/放置/网格该框架,因此它及其所有子级仍然不可见。

组合框显示的原因是因为其父组件是父组件。

解决方案是:

  1. 使组合框的父级为self,使其成为SelectMonthDialog框架的一部分
  2. self打包在其父级中,以便显示

答案 1 :(得分:0)

对于某些元素,您将self设置为parent,其他人将self.parent设置为parent - 只使用其中一个元素。

如果您使用self.parent,则会将元素放在root内,而您不需要selfFrame)。使用self.pack(),您可能会将root中的所有元素替换为Frame

如果您使用self,则会将元素放在Frame内,并且您必须将Frame放在root内,这样您才需要self.pack()