2017-10-08 5 views
0

Je crée une interface graphique dans tkinter pour faire du calcul de base. Mon problème est que je ne suis pas capable de fermer certaines boîtes de dialogue. Je veux les fermer et changer la visualisation en prenant le choix de l'utilisateur. Mon code n'attend pas la fin de la fenêtre pour le faire, attendez la fin de la classe principale. J'ai besoin d'aide pour le réparer.Fermez les boîtes de dialogue multiples de Python Tkinter

class Plotia(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, *kwargs) 
     tk.Tk.wm_title(self, "Plotia") 
     s = ttk.Style() 
     s.theme_use("clam") 

     # Configuration of the window .... 
     #.... 
     #.... 
     #.... 
     ## Initial Values ############################## 

     self.Number_Graph = 1 
     self.path_file = [None for i in range(self.Number_Graph)] # Number of files 
     self.columnData = [4 for i in range(self.Number_Graph)] # Number of column of the data 
     self.column_x = [0 for i in range(self.Number_Graph)] 
     self.column_y = [0 for i in range(self.Number_Graph)] 


    def askData(self): 
     # I don't understand why ChoiceData don't close. 

     self.graph = ChoiceData(self.Number_Graph, self.columnData) 
     # Only when the main window close, this two lines executes, 
     # and change this two variables. I want that this two lines executes when 
     #Choice Data close 
     self.column_x[self.graph.selection] = self.graph.data[0] 
     self.column_y[self.graph.selection] = self.graph.data[1] 







# This is is the Dialog I can close correctly 


class ChoiceData(tk.Toplevel): 

    def __init__(self, NumberGraph, NumberData): 
     super(ChoiceData, self).__init__() 


     ## Initial Values ################################# 

     self.NumberGraph = NumberGraph 
     self.selection = None 
     self.numberData = NumberData 
     self.data = [] 

     ######################################################## 

     # Layout Configure 
     #... 


    def Select(self): 
     self.selection = int(self.BoxList.get())-1 
     selectionData = SelectData(self.numberData[self.selection]) 
     self.data.append(selectionData.xData) 
     self.data.append(selectionData.yData) 
     self.destroy() 



class SelectData(tk.Toplevel): 

    def __init__(self, numberData): 
     super(SelectData, self).__init__() 



     ## Initial Values ################################# 

     self.xData= None 
     self.yData = None 
     self.NumberData = numberData 

     ######################################################## 

     # Layout configuration.,,, 

    def Update(self): 
     self.xData = int(self.xBox.get())-1 
     self.yData = int(self.yBox.get())-1 
     self.destroy() 


if __name__ == '__main__': 
    app = Plotia() 
    app.geometry("500x500") 
    app.mainloop() 

EDIT: d'importation tkinter *

class Quit: 
    def __init__(self, root): 
     root.destroy() 


class ChoiceData: 
    def __init__(self,root): 
     self.top = Toplevel(root) 
     self.label = Label(self.top, text="ChoiceData") 
     self.button = Button(self.top, text="Ok", command=self.stuff) 
     self.top.protocol("WM_DELETE_WINDOW", lambda: Quit(self.top)) 
     self.label.pack() 
     self.button.pack() 

    def stuff(self): 
     thing = SelectData(self.top) 
     self.top.destroy() 
     print("Windows closed") 




class SelectData: 
    def __init__(self,root): 
     self.top = Toplevel(root) 
     self.label = Label(self.top, text="SelectData") 
     self.button = Button(self.top, text="Ok", command=self.closer) 
     self.top.protocol("WM_DELETE_WINDOW", lambda: Quit(self.top)) 
     self.label.pack() 
     self.button.pack() 
     self.top.mainloop() 
    def closer(self): 
     self.top.destroy() 




root = Tk() 
ChoiceData(root) 
root.mainloop() 

Ceci est une version simpliee de ce que je veux faire. Les données de choix restent ouvertes lorsque vous sélectionnez Fermer les données.

+1

Veuillez ne pas partager de code depuis un site externe. Vous devriez le coller ici après avoir lu [MCVE]. – Lafexlos

+0

Que signifie "incapable de"? Pourquoi ne pouvez-vous pas? Qu'est-ce qui se passe quand vous essayez? –

+0

Lorsque j'appuie sur le bouton Ok, la boîte de dialogue de sélection des données se ferme, mais la boîte de dialogue Choix des données reste ouverte. . self.column_x [self.graph.selection] = self.graph.data [0]; self.column_y [self.graph.selection] = self.graph.data [1] Cette ligne ne s'exécute pas tant que je ne ferme pas la fenêtre principale (Plotia) même si je ferme manuellement les données de choix. Je souhaite fermer ChoiceData automatiquement lorsque je ferme Select Data, puis exécute ces deux lignes. – samuel

Répondre

0

Si tout ce que vous cherchez à faire est d'avoir une action sur deux widgets Toplevel, fermez les deux widgets Toplevel et lancez un extrait de code, quelque chose comme ce qui suit obtient le résultat souhaité.

from tkinter import * 

class App: 
    def __init__(self, root): 
     self.root = App.root = root 
     ChoiceData() 
     SelectData() 
    def close(): 
     ChoiceData.top.destroy() 
     SelectData.top.destroy() 
     print("Windows closed") 

class ChoiceData: 
    def __init__(self): 
     self.top = ChoiceData.top = Toplevel(App.root) 
     self.label = Label(self.top, text="ChoiceData") 
     self.button = Button(self.top, text="Ok", command=App.close) 
     self.top.protocol("WM_DELETE_WINDOW", App.close) 
     self.label.pack() 
     self.button.pack() 

class SelectData: 
    def __init__(self): 
     self.top = SelectData.top = Toplevel(App.root) 
     self.label = Label(self.top, text="SelectData") 
     self.button = Button(self.top, text="Ok", command=App.close) 
     self.top.protocol("WM_DELETE_WINDOW", App.close) 
     self.label.pack() 
     self.button.pack() 

root = Tk() 
App(root) 
root.mainloop() 

Nous avons ici quatre déclencheurs pour faire en sorte que la fonction App.close() à exécuter.

Les deux premiers sont les Button widgets que nous créons l'intérieur de chaque Toplevel qui ont toutes deux leurs command attributs définis à App.close qui se déroulera cette fonction, la fermeture des deux fenêtres et en cours d'exécution quel que soit extrait nous insérons.

Les deux autres sont un peu plus intéressant, nous remplaçons l'événement WM_DELETE_WINDOW, qui gère la fermeture d'une fenêtre lorsque le petit « X » rouge est pressé, et au lieu que nous disons à exécuter App.close() qui ferme les fenêtres et exécute l'extrait.

+0

La classe App ferme les fenêtres TopLevel, mais ce n'est pas mon propos. Choice Data est ouvert à l'aide d'un objet Menu dans la classe principale. Cet objet Menu est connecté à une fonction (askData) qui ouvre Données de choix. Choix des données ouvertes Sélectionnez Données à l'aide d'une affectation de bouton à une fonction qui, lorsque vous sélectionnez Fermer les données, les données de choix doivent se fermer, mais ce n'est pas le cas. – samuel

+0

Je modifie ma question avec un bref changement de votre code @Ethan Field, ce changement montre mon problème dans mon interface graphique, Choice Data Reste ouvert même si j'utilise self.top.destroy pour le fermer. – samuel

+0

@samuel Je ne comprends pas ce que vous voulez, vous voulez que les données de Choice restent ouvertes quoi que ce soit ou que vous vouliez fermer? Si vous voulez qu'il se ferme, quand devrait-il se fermer, dans quelles conditions? –

0

Enfin, j'ai trouvé ce qui était mauvais sur mon interface graphique, dans la dernière ligne, je dois utiliser:

self.quit() 

au lieu de:

self.destroy() 

self.destroy() ne laissez pas vous continuez votre programme après la boucle principale de Select Data. Et merci @Ethan Field pour m'avoir aidé.