2016-08-12 66 views
0

我删除了我之前关于此问题的一个问题,以简化我的问题并将问题更清晰地传达出去。我有一个内部有多个类的项目,我想在一个新的窗口中显示一个日历,一旦我点击一个按钮。我目前正在使用this日历脚本,并在我的整个脚本中进行了一些小改动。我改变帧到Toplevel为在日历这样的脚本的第一部分:Tkinter,在Toplevel窗口上按钮单击显示日历

class Calendar(tk.Toplevel): 

    def __init__(self, parent, **kw): 

     Toplevel.__init__(self, parent, **kw) 

现在,这确实与我的脚本的其余部分一起创建一个顶层窗口的日历,但只要程序是做它开始。我想让它在用户稍后调用时显示。

例如:

class Application(tk.Tk): # tk.Tk creates main window 

    def __init__(self): 
     tk.Tk.__init__(self) 

     self.title("T") 
     self.geometry('550x320')#x,y 
     self.create_options() 
     self.calendar = Calendar(self) 

    def create_options(self): 
     self.widgets = tk.Frame(self) 
     tk.Button(self, 
       text = "...", command=self.show_Calendar 
       ).place(x=525, y=130) 

这将称之为:

def show_Calendar(self): 
    '''shows calendar''' 
    toplevel = Toplevel() 
    toplevel.Calendar.place(x=0, y=0) 

该按钮并创建一个窗口,但有什么也没有。什么是最好的方式让这个日历只显示在点击按钮时出现的窗口中?

回答

1
self.calendar = Calendar(self) 

把你的应用程序init内这条线将在该应用程序中创建的同时创建它。您可能希望将其移入show_Calendar方法。

def show_Calendar(self): 
    '''shows calendar''' 
    toplevel = Toplevel() 
    toplevel.Calendar.place(x=0, y=0) 

toplevel = Toplevel()在这里没有任何意义。您正在创建一个空白Toplevel并将其设置为局部变量。这Toplevel不是以任何方式与您的日历相关。

在日历脚本中,您确保Calendar类继承自Toplevel,因此无论您何时创建日历,它都会附加到它自己的Toplevel

def show_Calendar(self): 
    '''shows calendar''' 
    self.calendar = Calendar(self) 

我看着你刚才的问题,你删除它之前,如果你也想删除日历,当用户将焦点更改,你应该看看Events and Bindings这里,特别是<FocusOut>

+0

没有理由在'Calendar'实例上调用'place',因为它是'Toplevel'。事实上,调用'place'会抛出一个错误,因为'Toplevel'的实例没有'place'函数。 –

+0

我明白了。我已经删除了该行。 – Hobbes

+0

@霍布斯非常感谢!过去几天我一直在网上搜索,试图找到一种方法。感谢帮助! – TheHoff

相关问题