Если у меня есть главное окно в tkinter, то я нажимаю кнопку, и оно открывает другое окно (дополнительное окно) и сворачивает первое, а затем я решаю нажать кнопку в этом втором окне, чтобы вернуться к первому окну (например, «кнопка возврата»), как я могу сделать этот вариант возврата к первому окну, нажав кнопку во втором окне в tkinter? Спасибо!
import tkinter as tk
def funcion():
otra_ventana = tk.Toplevel(root)
root.iconify()
def funcion2():
vuelta_ventana.iconify()
root.deiconify()
root = tk.Tk()
boton = tk.Button(root, text = "Abrir otra ventana", command=funcion)
boton2 = tk.Button(root, text = "return", command=funcion2)
boton.pack()
root.mainloop()
Это почти то же самое, что и с первой функцией «funcion». Однако вы должны упаковать кнопку, вызывающую funcion2, в свой tk.Toplevel.
Группировка Windows/Frame в классы поможет вам в долгосрочной перспективе, когда ваше приложение станет больше.
import tkinter as tk
def main():
app = App()
app.mainloop()
class App(tk.Tk):
def __init__(self):
super().__init__()
self.geometry("300x300")
self.popup = None
self.buton = tk.Button(
self,
text = "Abrir otra ventana",
command=self.funcion
)
self.buton.pack()
def funcion(self):
self.iconify()
if self.popup is None:
self.popup = MyToplevel(self)
else:
self.popup.deiconify()
class MyToplevel(tk.Toplevel):
def __init__(self, master):
super().__init__()
self.master = master
self.buton = tk.Button(
self,
text = "Return",
command=self.funcion2
)
self.buton.pack()
def funcion2(self):
print("hello")
self.master.deiconify()
#self.destroy()#maybe more useful?
self.iconify()
if __name__ == '__main__':
main()
В дополнение к ответу @caskuda ваш непосредственно исправленный код будет
import tkinter as tk
def funcion():
global otra_ventana
otra_ventana = tk.Toplevel(root)
return_button=tk.Button(otra_ventana,text='Return',command=funcion2).pack()
root.iconify()
def funcion2():
otra_ventana.iconify()
root.deiconify()
root = tk.Tk()
boton = tk.Button(root, text = "Abrir otra ventana", command=funcion)
boton.pack()
root.mainloop()
И если ваша цель состоит только в переключении окон, вы также можете попробовать этот подход.
import tkinter as tk
def switch(target,window):
target.iconify()
window.deiconify()
root=tk.Tk()
button=tk.Button(root,text = "Abrir otra ventana",command=lambda:switch(root,otra_ventana)).pack()
otra_ventana=tk.Toplevel(root)
return_button=tk.Button(otra_ventana,text='Return',command=lambda:switch(otra_ventana,root)).pack()
otra_ventana.withdraw()
root.mainloop()
Здесь я вначале инициализировал оба окна, а затем использовал метод .withdraw()
, чтобы скрыть/удалить второе окно из видимости. Использование функции lambda
позволяет нам вызывать нужную функцию вместе с параметрами, когда это необходимо. Функция switch()
принимает 2 параметра: первый — это окно, которое нужно иконизировать, а второй — окно, которое нужно деиконизировать.