web-dev-qa-db-fra.com

Comment créer une fenêtre popup dans tkinter?

J'ai un problème lors de la création d'une fenêtre contextuelle pour un programme.

Code:

from tkinter import *
from tkinter import ttk
import tkinter as tk

def popupBonus():
    popupBonusWindow = tk.Tk()
    popupBonusWindow.wm_title("Window")
    labelBonus = Label(popupBonusWindow, text="Input")
    labelBonus.grid(row=0, column=0)
    B1 = ttk.Button(popupBonusWindow, text="Okay", command=popupBonusWindow.destroy())
    B1.pack()

class Application(ttk.Frame):
    def __init__(self, master):
        ttk.Frame.__init__(self, master)
        mainwindow = ttk.Frame(self)

        self.buttonBonus = ttk.Button(self, text="Bonuses", command=popupBonus)
        self.buttonBonus.pack()

Le code génère une fenêtre avec un bouton et lorsque vous appuyez sur le bouton, il est censé générer une fenêtre contextuelle avec le titre "Fenêtre", le texte "Entrée", et avoir un bouton disant "OK" pour quitter la fenêtre contextuelle et revenir à la fenêtre principale . Cependant, je reçois cette erreur.

 Traceback (most recent call last):
  File "D:\Softwares\Python 3.6.0\lib\tkinter\__init__.py", line 1699, in __call__
return self.func(*args)
  File "C:\Users\J---- M--\Desktop\Python\GUI-Messagebox 5.py", line 12, in popupBonus
B1 = ttk.Button(popupBonusWindow, text="Okay", command=popupBonusWindow.destroy())
  File "D:\Softwares\Python 3.6.0\lib\tkinter\ttk.py", line 614, in __init__
Widget.__init__(self, master, "ttk::button", kw)
  File "D:\Softwares\Python 3.6.0\lib\tkinter\ttk.py", line 559, in __init__
tkinter.Widget.__init__(self, master, widgetname, kw=kw)
  File "D:\Softwares\Python 3.6.0\lib\tkinter\__init__.py", line 2293, in __init__
(widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: NULL main window

Je n'ai aucune idée du problème. J'ai essayé de trouver la réponse pendant 4 heures et j'ai essentiellement abandonné.

De plus, je ne veux pas utiliser la fonctionnalité de boîte de message de tkinter parce que je ne veux pas l'image du point d'exclamation et je veux inclure plusieurs cases à cocher dans la fenêtre contextuelle plus tard.

5
Jason M

J'ai trouvé 3 erreurs

  • utilisez Toplevel() au lieu de Tk() pour créer une deuxième/troisième fenêtre
  • command= Attend un rappel - nom de la fonction sans ()
    (mais vous utilisez popupBonusWindow.destroy())
  • ne mélangez pas pack() et grid() dans une fenêtre ou un cadre
    (mais vous utilisez grid() et pack() dans la fenêtre contextuelle)

Mais vous pouvez également utiliser des boîtes de message intégrées comme showinfo()

import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showinfo

def popup_bonus():
    win = tk.Toplevel()
    win.wm_title("Window")

    l = tk.Label(win, text="Input")
    l.grid(row=0, column=0)

    b = ttk.Button(win, text="Okay", command=win.destroy)
    b.grid(row=1, column=0)

def popup_showinfo():
    showinfo("Window", "Hello World!")

class Application(ttk.Frame):

    def __init__(self, master):
        ttk.Frame.__init__(self, master)
        self.pack()

        self.button_bonus = ttk.Button(self, text="Bonuses", command=popup_bonus)
        self.button_bonus.pack()

        self.button_showinfo = ttk.Button(self, text="Show Info", command=popup_showinfo)
        self.button_showinfo.pack()

root = tk.Tk()

app = Application(root)

root.mainloop()

BTW: Je l'ai mis sur la page: Tkinter: Comment créer une fenêtre popup ou une boîte de message

12
furas