python 日历小部件 - return 用户选择的日期
python calendar widget - return the user-selected date
这个ttk calendar class基于tkinter制作了一个日历。如何使其 return 成为所选日期的值?下面是我试过的,它 returned 'NoneType object is not callable':
def test():
import sys
root = Tkinter.Tk()
root.title('Ttk Calendar')
ttkcal = Calendar(firstweekday=calendar.SUNDAY)
ttkcal.pack(expand=1, fill='both')
x = ttkcal.selection() #this and the following line are what i inserted
print 'x is: ', x #or perhaps return x
if 'win' not in sys.platform:
style = ttk.Style()
style.theme_use('clam')
root.mainloop()
if __name__ == '__main__':
test()
选择的是@属性,因此您需要执行以下操作才能执行代码:
x = ttkcal.selection
此外,使用此日历,您可以在关闭 callendar 小部件之后(即在 mainloop() 之后)获取 selected 日期。因此你的代码应该是:
def test2():
import sys
root = Tkinter.Tk()
root.title('Ttk Calendar')
ttkcal = Calendar(firstweekday=calendar.SUNDAY)
ttkcal.pack(expand=1, fill='both')
if 'win' not in sys.platform:
style = ttk.Style()
style.theme_use('clam')
root.mainloop()
x = ttkcal.selection
print 'x is: ', x
以防万一。如果您不想关闭日历 window 以获取 selected 值,但您希望在单击它们时获取它们 "live",例如将它们显示在其他window的标签中,您可以执行以下操作:
首先扩展日历 class 以添加每次 select 某个日期时调用的回调函数:
class Calendar2(Calendar):
def __init__(self, master=None, call_on_select=None, **kw):
Calendar.__init__(self, master, **kw)
self.set_selection_callbeck(call_on_select)
def set_selection_callbeck(self, a_fun):
self.call_on_select = a_fun
def _pressed(self, evt):
Calendar._pressed(self, evt)
x = self.selection
#print(x)
if self.call_on_select:
self.call_on_select(x)
有了这个,你就可以制作新的test2例子了,它有两个windows。一个用于日历,另一个 window 带有一些标签(例如):
class SecondFrame(Tkinter.Frame):
def __init__(self, *args, **kwargs):
Tkinter.Frame.__init__(self, *args, **kwargs)
self.l = Tkinter.Label(self, text="Selected date")
self.l.pack()
self.pack()
def update_lable(self, x):
self.l['text'] = x;
def test2():
import sys
root = Tkinter.Tk()
root.title('Ttk Calendar')
ttkcal = Calendar2(firstweekday=calendar.SUNDAY)
ttkcal.pack(expand=1, fill='both')
if 'win' not in sys.platform:
style = ttk.Style()
style.theme_use('clam')
sf = SecondFrame(Tkinter.Toplevel())
ttkcal.set_selection_callbeck(sf.update_lable)
root.mainloop()
在此示例中,SecondFrame 中的标签将在您每次 select 日历中的某个日期时更新。
这个ttk calendar class基于tkinter制作了一个日历。如何使其 return 成为所选日期的值?下面是我试过的,它 returned 'NoneType object is not callable':
def test():
import sys
root = Tkinter.Tk()
root.title('Ttk Calendar')
ttkcal = Calendar(firstweekday=calendar.SUNDAY)
ttkcal.pack(expand=1, fill='both')
x = ttkcal.selection() #this and the following line are what i inserted
print 'x is: ', x #or perhaps return x
if 'win' not in sys.platform:
style = ttk.Style()
style.theme_use('clam')
root.mainloop()
if __name__ == '__main__':
test()
选择的是@属性,因此您需要执行以下操作才能执行代码:
x = ttkcal.selection
此外,使用此日历,您可以在关闭 callendar 小部件之后(即在 mainloop() 之后)获取 selected 日期。因此你的代码应该是:
def test2():
import sys
root = Tkinter.Tk()
root.title('Ttk Calendar')
ttkcal = Calendar(firstweekday=calendar.SUNDAY)
ttkcal.pack(expand=1, fill='both')
if 'win' not in sys.platform:
style = ttk.Style()
style.theme_use('clam')
root.mainloop()
x = ttkcal.selection
print 'x is: ', x
以防万一。如果您不想关闭日历 window 以获取 selected 值,但您希望在单击它们时获取它们 "live",例如将它们显示在其他window的标签中,您可以执行以下操作:
首先扩展日历 class 以添加每次 select 某个日期时调用的回调函数:
class Calendar2(Calendar):
def __init__(self, master=None, call_on_select=None, **kw):
Calendar.__init__(self, master, **kw)
self.set_selection_callbeck(call_on_select)
def set_selection_callbeck(self, a_fun):
self.call_on_select = a_fun
def _pressed(self, evt):
Calendar._pressed(self, evt)
x = self.selection
#print(x)
if self.call_on_select:
self.call_on_select(x)
有了这个,你就可以制作新的test2例子了,它有两个windows。一个用于日历,另一个 window 带有一些标签(例如):
class SecondFrame(Tkinter.Frame):
def __init__(self, *args, **kwargs):
Tkinter.Frame.__init__(self, *args, **kwargs)
self.l = Tkinter.Label(self, text="Selected date")
self.l.pack()
self.pack()
def update_lable(self, x):
self.l['text'] = x;
def test2():
import sys
root = Tkinter.Tk()
root.title('Ttk Calendar')
ttkcal = Calendar2(firstweekday=calendar.SUNDAY)
ttkcal.pack(expand=1, fill='both')
if 'win' not in sys.platform:
style = ttk.Style()
style.theme_use('clam')
sf = SecondFrame(Tkinter.Toplevel())
ttkcal.set_selection_callbeck(sf.update_lable)
root.mainloop()
在此示例中,SecondFrame 中的标签将在您每次 select 日历中的某个日期时更新。