Как отобразить новое окно, когда пользователь нажимает кнопку?

#python #tkinter #python-imaging-library

Вопрос:

Я создаю базовый графический интерфейс для входа в систему на Python. Как бы я сделал так, чтобы оно открывало новое окно, когда пользователь нажимает кнопку «Зарегистрировать новую учетную запись»? Я хочу создать отдельную форму для регистрации нового пользователя. Нужна Помощь!

 from tkinter import *
from tkinter import messagebox

# pip install pillow
from PIL import Image, ImageTk

class Window(Frame):
    def __init__(self, root):
        Frame.__init__(self, root)
        self.root = root
        self.pack(fill=BOTH, expand=1)
        self.root.wm_title("Login")
        self.root.geometry("1202x632")
        self.root.resizable(False,False)

        #BG Pic
        load = Image.open("books.png")
        render = ImageTk.PhotoImage(load)
        img = Label(self, image=render)
        img.image = render
        img.place(x=0, y=0)

        #Login Frame
        Frame_login=Frame(self.root,bg="white",highlightbackground="#c4652b",highlightthickness=5)
        Frame_login.place(x=150,y=150,height=340,width=500)
        
        title=Label(Frame_login,text="Login Here", font=("Impact",35,"bold"),fg="#d77337",bg="white").place(x=72,y=20)
        desc=Label(Frame_login,text="Staff Login Area", font=("Goudy old style",15,"bold"),fg="#d25d17",bg="white").place(x=72,y=80)

        lbl_user=Label(Frame_login,text="Username", font=("goudy old style",15,"bold"),fg="gray",bg="white").place(x=72,y=110)
        self.txt_user=Entry(Frame_login,font=("times new roman",15),bg="lightgray")
        self.txt_user.place(x=72,y=140,width=350,height=35)

        lbl_passcode=Label(Frame_login,text="Passcode", font=("Goudy old style",15,"bold"),fg="gray",bg="white").place(x=72,y=180)
        self.txt_passcode=Entry(Frame_login,font=("times new roman",15),bg="lightgray")
        self.txt_passcode.place(x=72,y=208,width=350,height=35)

        Register_button=Button(Frame_login,text="Register New Account",bg="white",fg="#d77337",bd=0,font=("times new roman",12)).place(x=72,y=248)
        Login_button=Button(self.root,text="Login",fg="white",bg="#d77337",bd=0,font=("times new roman",20,"bold")).place(x=310,y=460,width=180)
    
root = Tk()
app = Window(root)
root.mainloop()

 

Ответ №1:

Используйте command опцию Button() для выполнения функции при нажатии кнопки. Внутри этой функции вы можете создать другое окно, например, создать корневое окно:

 # sample Toplevel window
class RegisterForm(Toplevel):
    def __init__(self, master, *args, **kw):
        super().__init__(master, *args, **kw)
        self.title("Register")
        self.geometry("800x600")
        self.resizable(0, 0)
        self.config(bg="white")

        # other register form widgets
        Label(self, text="Registration", font="Impact 32 bold", fg="#c4652b", bg="white").pack()

        self.wait_visibility()
        self.transient(master)
        self.focus_set()

class Window(Frame):
    def __init__(self, root):
        ...
        Button(Frame_login,text="Register New Account",...,command=self.register).place(x=72,y=248)
        ...

    def register(self):
        RegisterForm(self.root)
 

Ответ №2:

На этой странице есть действительно хорошее объяснение вашей проблемы. введите описание ссылки здесь

Одно из возможных решений:

 
# This will import all the widgets
# and modules which are available in
# tkinter and ttk module
from tkinter import * 
from tkinter.ttk import *
  
  
class NewWindow(Toplevel):
      
    def __init__(self, master = None):
          
        super().__init__(master = master)
        self.title("New Window")
        self.geometry("200x200")
        label = Label(self, text ="This is a new Window")
        label.pack()
  
  
# creates a Tk() object
master = Tk()
  
# sets the geometry of 
# main root window
master.geometry("200x200")
  
label = Label(master, text ="This is the main window")
label.pack(side = TOP, pady = 10)
  
# a button widget which will
# open a new window on button click
btn = Button(master, 
             text ="Click to open a new window")
  
# Following line will bind click event
# On any click left / right button
# of mouse a new window will be opened
btn.bind("<Button>", 
         lambda e: NewWindow(master))
  
btn.pack(pady = 10)
  
# mainloop, runs infinitely
mainloop()
 

Комментарии:

1. Это хорошая идея, чтобы предоставить пример рабочего кода на SO, даже если вы ссылаетесь на страницу

2. Почему бы просто не использовать эту command опцию вместо привязки события щелчка мыши?