我正在尝试在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()
答案 0 :(得分:1)
您创建的大多数小部件都有self
的父级。这意味着它们是作为SelectMonthDialog
实例的窗口小部件的子代。但是,您不会在其父级中打包/放置/网格该框架,因此它及其所有子级仍然不可见。
组合框显示的原因是因为其父组件是父组件。
解决方案是:
self
,使其成为SelectMonthDialog
框架的一部分self
打包在其父级中,以便显示答案 1 :(得分:0)
对于某些元素,您将self
设置为parent
,其他人将self.parent
设置为parent
- 只使用其中一个元素。
如果您使用self.parent
,则会将元素放在root
内,而您不需要self
(Frame
)。使用self.pack()
,您可能会将root
中的所有元素替换为Frame
。
如果您使用self
,则会将元素放在Frame
内,并且您必须将Frame
放在root
内,这样您才需要self.pack()