Избегайте нескольких окон одного типа - PullRequest
0 голосов
/ 24 октября 2018

Моя цель - иметь интерактивную гистограмму.Я хочу открыть окно, содержащее текст.Это должно произойти, когда пользователь нажимает на одну из полос.Я начал играть немного.В следующем примере, если вы нажмете на левой панели, появится окно с текстом.У меня проблема, я хочу, чтобы окно открывалось только один раз.Поэтому, если вы нажмете второй раз на левой панели, я не хочу открывать второе окно.Поэтому мой вопрос, как я могу проверить, если окно уже существует и избежать нескольких окон одного типа.Я уже нашел пост, касающийся этой темы, но я не понимаю решение, которое было только плохо объяснено.

Большое спасибо за вашу помощь.

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 голосов
/ 27 октября 2018

Тем временем я нашел решение для моей проблемы.Как сказал 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...