Определение того, какое окно tkinter в данный момент находится сверху

Я написал приложение на python 2.7 и tkinter. Я создал панель инструментов с несколькими кнопками, которые открывают соответствующие верхние окна с различными параметрами. Я использовал ttk.Checkbutton со стилем 'toolbutton' в качестве индикатора, показывающего, открыты или закрыты окна опций.

Проблема в том, что окна параметров переместятся на задний план, если выбрано другое окно. В настоящее время, если снова выбрать кнопку инструмента, окно параметров закроется. Однако я хочу закрыть окно только в том случае, если оно находится сверху. Если окно параметров не сверху, я хочу, чтобы окно переместилось вперед.

Часть кода у меня работает:

class MainWindow:
    def __init__(self,application):
        self.mainframe=tk.Frame(application)
        application.geometry("900x600+30+30")

        self.otherOptionsSelect=tk.IntVar()
        self.otherOptions_Button=ttk.Checkbutton(application,style='Toolbutton',variable=self.otherOptionsSelect,
                                                onvalue=1, offvalue=0,image=self.optionsIcon, command=self.otherOptions)
    def otherOptions(self):

        if self.otherOptionsSelect.get()==0:
            self.otherOptions.destroy()
            return

        self.otherOptions=tk.Toplevel()
        self.otherOptions.title("IsoSurface Options")
        self.otherOptions.geometry("200x165+"+str(int(application.winfo_x())+555)+"+"+str(int(application.winfo_y())+230))

        self.otherOptApply_button=ttk.Button(self.otherOptions,text="Apply",command=self.showFrame)
        self.otherOptApply_button.place(x=20,y=80,width=50,height=30)

        self.otherOptClose_button=ttk.Button(self.otherOptions,text="Close",command=self.otherOptionsClose)
        self.otherOptClose_button.place(x=80,y=80,width=50,height=30)

    def otherOptionsClose(self):
        self.otherOptionsSelect.set(0)
        self.otherOptions.destroy()

Вот изображение всего приложения, которое я написал: введите здесь описание изображения

На изображении выше каждое окно имеет соответствующую кнопку ttk.checkbutton. На данный момент переключение галочки либо открывает, либо закрывает окно. Однако то, что я действительно хочу, это закрыть окно, если окно находится перед приложением, или вывести окно на передний план, если оно находится за приложением.

Надеюсь, это прояснит некоторые вещи.

Заранее спасибо!


person Onlyjus    schedule 27.04.2012    source источник
comment
Если вы выберете кнопку-флажок, не будет ли окно с кнопкой-флажком всегда сверху, или у вас есть оконный менеджер, который позволяет вам нажимать кнопки в фоновых окнах?   -  person Bryan Oakley    schedule 27.04.2012
comment
Может быть, я должен прояснить это немного. У меня есть главное окно, на котором есть панель инструментов с несколькими флажками. Каждая кнопка-флажок открывает/закрывает окно верхнего уровня, однако главное окно остается активным. Окна верхнего уровня не всегда находятся поверх основного окна, они могут уходить на задний план. Может быть, я попытаюсь разместить некоторые фотографии.   -  person Onlyjus    schedule 27.04.2012
comment
Я пытался опубликовать изображение, но мне нужно больше репутации...   -  person Onlyjus    schedule 27.04.2012
comment
Итак, если одно из этих других окон находится на экране, но за основным окном, что должно произойти? Это не буквально сверху, поэтому вы хотите, чтобы это было удалено?   -  person Bryan Oakley    schedule 28.04.2012
comment
другие окна находятся на экране, но позади главного окна, я хочу вывести окно на передний план. У меня есть картинка, которая прояснит ситуацию, мне просто нужна еще 1 репутация!!!!!   -  person Onlyjus    schedule 28.04.2012
comment
Возможно, можно было бы создать привязку к каждому окну, чтобы можно было отслеживать порядок их наложения? т.е. привязка кнопки-1, которая отслеживает изменения фокуса...   -  person Niall Byrne    schedule 30.04.2012
comment
Это может не всегда работать. Это просто дало бы мне порядок, в котором создается каждое окно. Скорее всего, старые окна будут сзади, но не всегда.   -  person Onlyjus    schedule 01.05.2012


Ответы (1)


На самом деле можно проверить порядок расположения окон. Используя Tkinter, вы должны сделать несколько забавных оценок tcl, чтобы получить информацию. Я нашел ответ на TkDoc в разделе Windows и диалоги, прокрутите вниз, пока не увидите в «Порядок укладки». Код сбивал меня с толку, пока я не начал играть с ним в интерактивном режиме. Мой тестовый код был:

import Tkinter as tk
root = tk.Tk()
root.title('root')
one = tk.Toplevel(root)
one.title('one')
two = tk.Toplevel(root)
two.title('two')

Затем я манипулировал окнами так, чтобы два были сверху, одно под ним и корень под ними всеми. В этой конфигурации следующая странность может сказать вам об относительном многоуровневом расположении окон:

root.tk.eval('wm stackorder '+str(two)+' isabove '+str(root))

возвращает 1, что означает «Да, второе окно находится над корневым окном». Пока следующее:

root.tk.eval('wm stackorder '+str(root)+' isabove '+str(two))

возвращает 0, что означает «Нет, корень окна не выше второго окна». Вы также можете использовать команду:

root.tk.eval('wm stackorder '+str(root))

Что возвращает полный порядок расположения окон в виде странной строки, примерно такой:

'. .68400520L .68401032L'

Что начинает иметь смысл, когда вы запускаете команды:

str(root)
str(one)
str(two)

и выясните, что корень имеет внутреннее имя «.», один — «.68400520L», а два — «.68401032L». Вы читаете вывод root.tk.eval('wm stackorder '+str(root)) в обратном порядке, так что он говорит, что два сверху, один под ним, а root ниже обоих.

person John Gaines Jr.    schedule 30.04.2012
comment
В Python 3.8 tkinter больше не использует случайные строки цифр в качестве ссылок на виджеты, поэтому вывод порядка расположения окон будет следующим: . .!toplevel .!toplevel2. Корень по-прежнему точка. - person Luther; 16.09.2020