避免使用同一类型的多个窗口

时间:2018-10-24 20:52:22

标签: python windows tkinter

我的目标是制作交互式条形图。我想打开一个包含文本的窗口。当用户单击其中一个栏时,将发生这种情况。我开始玩了一些。在以下示例中,如果单击左栏,则会弹出一个包含文本的窗口。我有问题,我只想让窗户打开一次。因此,如果您再次单击左侧栏上的,我不想打开第二个窗口。因此,我的问题是,如何检查该窗口是否已存在并避免使用多个相同类型的窗口。我已经找到了有关该主题的帖子,但是我不理解该解决方案,该解决方案的解释不充分。

非常感谢您的帮助。

def on_press(event):
    cont,att = rect[0].contains(event)
    if cont == True:
        win = tk.Tk()
        label1 = ttk.Label(win, text ="Test1").grid(column=0,row=0)
        label2 = ttk.Label(win, text ="Test2").grid(column=0,row=1)
        label3 = ttk.Label(win, text ="Test3").grid(column=0,row=2)


fig = plt.figure()
ax = fig.add_subplot(111)
x = [1,2,3]
y = [10,20,5]
rect = ax.bar(x,y)



test = rect[0].figure.canvas.mpl_connect('button_press_event', on_press)

plt.show()

1 个答案:

答案 0 :(得分:0)

与此同时,我找到了解决问题的方法。就像MediaEU所说的那样,我使用一个设置为true或false的变量。但是,一个重要的“技巧”是使用state()方法。 如果打开主窗口,则state()返回'normal'。如果主窗口关闭,则state()会引发异常。作为初学者,花了我很多时间弄清楚了。 这是我的建议:

class info_window:
    def __init__(self, rect): # has an argument rect, for a specific bar in your plot
        self.rect = rect
        self.win_open = False
        self.state = 'normal'
        self.temp = self.rect.figure.canvas.mpl_connect('button_press_event', self)

    def label(self):
        self.label1 = ttk.Label(self.win, text ="Test1").grid(column=0,row=0)
        self.label2 = ttk.Label(self.win, text ="Test2").grid(column=0,row=1)
        self.label3 = ttk.Label(self.win, text ="Test3").grid(column=0,row=2)

    def __call__(self, event):
        cont, att = self.rect.contains(event) 
        try:                    # here is the "trick", in case window was closed self.win.state() throws an exception
            self.win.state()
        except:                 # setting win_open to False ensures that a window can be opened again
            self.win_open = False
        if cont == True:    
            if self.win_open == False: # if window does not exist, create it
                self.win = tk.Tk()
                self.label()
                self.win_open = True # as long as window is open, you can't create it again