Найти - Пользователи
Полная версия: Установка всплывающего окна по центру программы
Начало » GUI » Установка всплывающего окна по центру программы
1 2
victoreva
Доброго времени суток!
Подскажите как сделать, чтобы окно(Toplevel) всплывало по центру программы? Библиотека Tkinter, python 3.x
4kpt_III
Высчитывать позицию для .geometry(). Код нужен?
victoreva
Был бы признателен)
4kpt_III
Держите.

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. Будут вопросы - пишите…
victoreva
Можете еще сказать, почему не работает данный способ - мне нужно закрыть окно 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
И, если не трудно, напишите рабочий код.
victoreva
4kpt_III
Держите.
Спасибо!
4kpt_III
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)
4kpt_III
И я все же рекомендую Вам 2 вещи:
1. Не пишите from tkinter import*
2. Не используйте менеджер геометрии place. Лучше grid или pack.
victoreva
Еще один вопрос. Вкратце, чтоб вы понимали суть - у меня есть пункты во 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
4kpt_III
И я все же рекомендую Вам 2 вещи:
1. Не пишите from tkinter import*
2. Не используйте менеджер геометрии place. Лучше grid или pack.
На счет первого пункта - исправлю потом)
А чем вам place не нравится?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB