#python #tkinter
Вопрос:
Я пытаюсь обратиться transient
к Tk()
примеру. Пример:
import tkinter as tk
root = tk.Tk()
root.geometry('200x200')
def create_new_window():
win=tk.Toplevel()
win.transient(root)
win.geometry('200x200')
tk.Label(win,text=' Hello World ').pack()
label1 = tk.Label(root, text='Click the button')
label1.pack()
b1=tk.Button(root,text='New Window',command=create_new_window)
b1.pack()
root.mainloop()
Этот код удалит кнопки ▭
и. -
Но это будет сделано только для tk.Toplevel()
:
Окно слева в root
окне, а то, что справа, находится tk.Toplevel()
Но есть ли какой-либо способ удалить кнопки ▭
и -
в корневом окне?
Когда я это сделаю:
....
label1 = tk.Label(root, text='Click the button')
label1.pack()
root.transient(root)
b1=tk.Button(root,text='New Window',command=create_new_window)
b1.pack()
...
Я получаю сообщение об ошибке:
Traceback (most recent call last):
File "c:/Users/91996/Documents/Visual studio code/cd.py", line 15, in <module>
root.transient(root)
File "C:Program FilesPython3.8.6libtkinter__init__.py", line 2233, in wm_transient
return self.tk.call('wm', 'transient', self._w, master)
_tkinter.TclError: can't make "." its own master
Я знаю, что мог бы просто сделать root.resizable(0, 0)
или root.withdraw()
после этого. Но я изучаю tkinter
и хотел бы увидеть реализацию root.transient()
Если чего-то очевидного не хватает, пожалуйста, будьте нежны.
Заранее большое спасибо!
Комментарии:
1.
Tk
Объект является родителем, в то времяToplevel
как объект является дочерним. Попытка сделать родителяtransient
должна привести к такой ошибке._tkinter.TclError: can't make "." its own master
2. Я думаю, что только
Toplevel
окна могут бытьtransient
. Вы не можете использовать его дляTk()
Windows.
Ответ №1:
Это код:
import tkinter as tk
root = tk.Tk()
root.geometry('200x200')
def create_new_window():
win=tk.Toplevel()
win.attributes('-toolwindow',True)
win.geometry('200x200')
tk.Label(win,text=' Hello World ').pack()
label1 = tk.Label(root, text='Click the button')
label1.pack()
b1=tk.Button(root,text='New Window',command=create_new_window)
b1.pack()
root.mainloop()
Комментарии:
1. Эй, там, в квартале! Твой код помог мне. Мне просто нужно было расположиться
root.attributes('-toolwindow',True)
вне функции дляroot
. И это сработало! Только дизайн немного странный, но все в порядке
Ответ №2:
Вот довольно стандартная реализация родительского и временного дочернего виджета.
Дочерние виджеты всегда находятся перед родительскими. Если родитель обозначен ( parent.withdraw
), то и ребенок тоже, но ребенок может быть отозван или деиконифицирован, не затрагивая родителя с помощью child.withdraw
и child.deiconify
.
Вы можете создать множество дочерних виджетов для каждого родителя.
import tkinter as tk
# Create parent
parent = tk.Tk()
parent.title("Parent")
parent.geometry("400x400")
# give tkinter time to create and position parent
parent.update()
# get parent position and size
x, y = parent.winfo_x(), parent.winfo_y()
w, h = parent.winfo_width() 5, parent.winfo_height()
# Create child
child = tk.Toplevel(parent)
child.title("Child")
# make child invisible
child.withdraw()
# make child the child of parent
child.transient(parent)
# set size and position of child
child.geometry(f"200x300 {x w} {y}")
# give tkinter time to create and position child
child.update()
# make child visible
child.deiconify()
parent.mainloop()