coder_not_found
coder_not_found

Reputation: 200

How to make a tkinter button open only one Toplevel?

I need a tkinter button to open only one Toplevel but I tried using a counter that changes to 2 when one Toplevel is made and a if loop so it checks if the counter is 1, (it will make a Toplevel window if its 1)

but when I run the program I can make many windows by clicking the button multiple times

I think the solution of using a counter doesn't work

    def menu_window(self): # this is in a class

    self.frame4 = tk.Frame(self.master, padx=30, pady=30)
    self.frame4.grid()

    Counter = 1  ### COUNTER 
    button2 = tk.Button(self.frame4, text="Review your Quiz", command=lambda: PreviewQuiz(self.master, self.frame4,
                                                                                          Counter))
    button2.grid(row=3, column=2, padx=40, pady=15, ipadx=28)
    button3 = tk.Button(self.frame4, text=" Start your Quiz ")
    button3.grid(row=4, column=2, padx=40, pady=5, ipadx=30)


class PreviewQuiz:
    def __init__(self, master, frame4, Counter):
        if Counter == 1:   # CHECK IF COUNTER IS 1
            self.master = master
            self.review_q = tk.Toplevel(self.master)
            self.frame5 = tk.Frame(self.master, padx=50, pady=20)
            self.frame5.grid()
            self.Counter = 2  # SET COUNTER TO 2

Upvotes: 0

Views: 756

Answers (2)

JacksonPro
JacksonPro

Reputation: 3275

Just disable the button when the user clicks on it and enable it only when the top-level is closed.

Here is an example taken from the code you provided in your newest post:

import tkinter as tk

class Run:
    def __init__(self, master):

        self.master = master
        
        self.button = tk.Button(master, text="TopLevel", command=self.make_new)
        self.button.pack()

    def make_new(self):
        self.button['state'] = 'disabled'

        new = tk.Toplevel(self.master)

        lbl = tk.Label(new, text='only one topLevel')
        lbl.pack()

        new.protocol("WM_DELETE_WINDOW", lambda : self.button.configure(state='normal') or new.destroy()) # or make a method to change the state
        

master1 = tk.Tk()
i = Run(master1)
master1.mainloop()

Upvotes: 2

figbeam
figbeam

Reputation: 7176

Your code does not run, which makes it difficult to debug. There are however a few things:

When you assingn a value to counter in menu_window() you end the value with a ".", which makes it a float, not an integer.

You call PreviewQuiz with the counter argument, but when you update the counter you do it to an instance variable of PreviewQuiz, not of menu_window() class so next time you call PreviewQuiz you will still use 1.0.

Upvotes: 1

Related Questions