Форум сайта python.su
Доброго времени суток!
Подскажите как сделать, чтобы окно(Toplevel) всплывало по центру программы? Библиотека Tkinter, python 3.x
Офлайн
Высчитывать позицию для .geometry(). Код нужен?
Офлайн
Был бы признателен)
Офлайн
Держите.
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))
Офлайн
Можете еще сказать, почему не работает данный способ - мне нужно закрыть окно 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)
Офлайн
4kpt_IIIСпасибо!
Держите.
Офлайн
victoreva
Выдает ошибку: TypeError: destroy() takes 1 positional argument but 2 were given
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)
Офлайн
И я все же рекомендую Вам 2 вещи:
1. Не пишите from tkinter import*
2. Не используйте менеджер геометрии place. Лучше grid или pack.
Офлайн
Еще один вопрос. Вкратце, чтоб вы понимали суть - у меня есть пункты во 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)
Офлайн
4kpt_IIIНа счет первого пункта - исправлю потом)
И я все же рекомендую Вам 2 вещи:
1. Не пишите from tkinter import*
2. Не используйте менеджер геометрии place. Лучше grid или pack.
Отредактировано victoreva (Март 25, 2015 14:06:44)
Офлайн