Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Установка всплывающего окна по центру программы [RSS Feed]

#1 Март 25, 2015 11:28:12

victoreva
Зарегистрирован: 2015-03-17
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Установка всплывающего окна по центру программы

Доброго времени суток!
Подскажите как сделать, чтобы окно(Toplevel) всплывало по центру программы? Библиотека Tkinter, python 3.x

Офлайн

#2 Март 25, 2015 11:36:41

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Установка всплывающего окна по центру программы

Высчитывать позицию для .geometry(). Код нужен?

Офлайн

#3 Март 25, 2015 12:19:01

victoreva
Зарегистрирован: 2015-03-17
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Установка всплывающего окна по центру программы

Был бы признателен)

Офлайн

#4 Март 25, 2015 12:28:52

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Установка всплывающего окна по центру программы

Держите.

root.update_idletasks()
width = your_toplevel.winfo_width()
height = your_root.winfo_height()
x = (root.winfo_screenwidth() // 2) - (width // 2)
y = (root.winfo_screenheight() // 2) - (height // 2)
your_toplevel.geometry('{0}x{1}+{2}+{3}'.format(width, height, x, y))

P.S. Будут вопросы - пишите…

Офлайн

#5 Март 25, 2015 12:31:46

victoreva
Зарегистрирован: 2015-03-17
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Установка всплывающего окна по центру программы

Можете еще сказать, почему не работает данный способ - мне нужно закрыть окно Toplevel при нажатии на кнопку, пишу следующее:

def dialog(event):
 win = Toplevel(root,width=400,height=100 )
 but3 = Button(win, text="Выход",width=30,height=5, bg="white",fg="black") 
 but3.bind("<Button-1>", win.destroy)
 but3.place(relx=0.75,rely=0.55,relwidth=0.2,relheight=0.3)
Выдает ошибку: TypeError: destroy() takes 1 positional argument but 2 were given
И, если не трудно, напишите рабочий код.

Офлайн

#6 Март 25, 2015 12:35:36

victoreva
Зарегистрирован: 2015-03-17
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Установка всплывающего окна по центру программы

4kpt_III
Держите.
Спасибо!

Офлайн

#7 Март 25, 2015 13:01:15

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Установка всплывающего окна по центру программы

victoreva
Выдает ошибку: TypeError: destroy() takes 1 positional argument but 2 were given

.bind обязательным аргументом в функцию-обработчик передает event (ссылку на объект события). А .destroy уж никак не ожидает его получить. В Вашем случае придется душить event. Это будет как-то так:

def dialog(event):
    win = Toplevel(root,width=400,height=100 )
    but3 = Button(win, text="Выход",width=30,height=5, bg="white",fg="black") 
    but3.bind("<Button-1>", lambda event: win.destroy())
    but3.place(relx=0.75,rely=0.55,relwidth=0.2,relheight=0.3)

Офлайн

#8 Март 25, 2015 13:04:35

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Установка всплывающего окна по центру программы

И я все же рекомендую Вам 2 вещи:
1. Не пишите from tkinter import*
2. Не используйте менеджер геометрии place. Лучше grid или pack.

Офлайн

#9 Март 25, 2015 14:01:11

victoreva
Зарегистрирован: 2015-03-17
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Установка всплывающего окна по центру программы

Еще один вопрос. Вкратце, чтоб вы понимали суть - у меня есть пункты во frame1 в виде кнопок, при нажатии на любую из них выводится диалоговое окно(в данном случае Toplevel), в котором есть 3 варианта - выйти, вывести в текстовый файл(запускается batnik1), вывести в текстовое поле frame2(запускается batnik2). Но в зависимости от того, какую кнопку мы нажали во frame1 у нас будут запускаться разные батники, этих пунктов у меня около 20. Логично написание функции, которая просто будет вставлять имена нужных батников, попробовал реализовать следующим способом, используя ваши предыдущие решения:

def helpfull():
 frame1=Frame(root,bd=0)
 frame1.place(relx=0.05,rely=0.05,relwidth=0.35,relheight=0.85)
 but2 = Button(frame1, text="Основные сведения",width=30,height=5,  bg="white",fg="black") 
 but2.bind("<Button-1>", lambda event:dialog(systeminfo,systeminfo1))
 but2.place(relx=0,rely=0.05,relwidth=1,relheight=0.03)
def func1(a1):
 cmd='bat\Helpful information\'+ a1 + '.bat'
 proba=subprocess.check_output(cmd, stderr=subprocess.STDOUT)
 send_text(proba)
def func1(a2):	
 cmd='bat\Helpful information\' + a2 + '.bat'
 proba=subprocess.check_output(cmd, stderr=subprocess.STDOUT)
 send_text(proba)
def dialog(batnik1,batnik2):
  win = Toplevel(root,width=400,height=100 )
 
 but1 = Button(win, text="Поле программы",width=30,height=5, bg="white",fg="black")	
 but1.bind("<Button-1>",lambda event:func1(batnik1)) 
 but1.place(relx=0.05,rely=0.55,relwidth=0.3,relheight=0.3) 
 but2 = Button(win, text="Текстовый файл",width=30,height=5, bg="white",fg="black") 
 but2.bind("<Button-1>",lambda event:func2(batnik2))
 but2.place(relx=0.4,rely=0.55,relwidth=0.3,relheight=0.3)	
 but3 = Button(win, text="Отмена",width=30,height=5, bg="white",fg="black") 
 but3.bind("<Button-1>", lambda event: win.destroy())
 but3.place(relx=0.75,rely=0.55,relwidth=0.2,relheight=0.3)

Программа ошибок не выдает, но и ничего не происходит. Не скажите в чем причина?
Или лучше создать новую тему в другом разделе?

Отредактировано victoreva (Март 25, 2015 14:05:05)

Офлайн

#10 Март 25, 2015 14:03:00

victoreva
Зарегистрирован: 2015-03-17
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Установка всплывающего окна по центру программы

4kpt_III
И я все же рекомендую Вам 2 вещи:
1. Не пишите from tkinter import*
2. Не используйте менеджер геометрии place. Лучше grid или pack.
На счет первого пункта - исправлю потом)
А чем вам place не нравится?

Отредактировано victoreva (Март 25, 2015 14:06:44)

Офлайн

  • Начало
  • » GUI
  • » Установка всплывающего окна по центру программы[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version