Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: OnlyjusОтветов: 1

Я написал приложение на 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. На данный момент переключение галочки либо открывает, либо закрывает окно. Однако то, что я действительно хочу, это закрыть окно, если окно находится перед приложением, или вывести окно на передний план, если оно находится за приложением.

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

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

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

pythontkinter

Ответы

Ответ 1 · рейтинг 10 · John Gaines Jr.

На самом деле можно проверить порядок расположения окон. Используя 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 ниже обоих.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы