2017-07-16 6 views
0

J'ai créé un jeu "dice poker" en utilisant le logiciel graphique de Zelle, et j'ai un bouton sur l'écran principal qui ouvre un fichier texte. Le fichier texte s'ouvre lorsque le bouton est cliqué, mais la fenêtre principale se ferme. Comment puis-je garder la fenêtre parent ouverte?Ouvrir le fichier exécutable à partir du bouton graphique sans fermer la fenêtre parente

La classe bouton est ci-dessous:

from graphics import * 
from tkinter import Button as tkButton 

class Button(): 

    """A button is a labeled rectangle in a window. 
    It is activated or deactivated with the activate() 
    and deactivate() methods. The clicked(p) method 
    returns true if the button is active and p is inside it.""" 

    def __init__(self, win, center, width, height, label): 
     """ Creates a rectangular button, eg: 
     qb = Button(myWin, centerPoint, width, height, 'Quit') """ 

     w,h = width/2.0, height/2.0 
     x,y = center.getX(), center.getY() 
     self.xmax, self.xmin = x+w, x-w 
     self.ymax, self.ymin = y+h, y-h 
     p1 = Point(self.xmin, self.ymin) 
     p2 = Point(self.xmax, self.ymax) 
     self.rect = Rectangle(p1,p2) 
     self.rect.setFill('lightgray') 
     self.rect.draw(win) 
     self.label = Text(center, label) 
     self.label.draw(win) 
     self.deactivate() 

    def clicked(self, p): 
     "Returns true if button active and p is inside" 
     return (self.active and 
       self.xmin <= p.getX() <= self.xmax and 
       self.ymin <= p.getY() <= self.ymax) 

    def getLabel(self): 
     "Returns the label string of this button." 
     return self.label.getText() 

    def activate(self): 
     "Sets this button to 'active'." 
     self.label.setFill('black') 
     self.rect.setWidth(2) 
     self.active = True 

    def deactivate(self): 
     "Sets this button to 'inactive'." 
     self.label.setFill('darkgrey') 
     self.rect.setWidth(1) 
     self.active = False 

Comment puis-je inclure un argument command qui peut ouvrir un fichier exécutable de façon similaire à cette mise en œuvre de tkinter:

import Tkinter as tk 

def create_window(): 
    window = tk.Toplevel(root) 

root = tk.Tk() 
b = tk.Button(root, text="Create new window", command=create_window) 
b.pack() 

root.mainloop() 

Lorsque la commande peut être subprocess.run(['open', '-t', 'poker_help.txt']) et garde toujours la fenêtre d'origine ouverte?

Répondre

1

je dois faire quelques hypothèses puisque vous n'avez pas inclus le code de niveau supérieur (par exemple, vous êtes sur un Mac):

graphiques Zelle, à la différence tkinter et la tortue, qui est également construit sur tkinter, n » t avoir un appel explicite win.mainloop() pour rendre le contrôle au gestionnaire d'événements Tk en attente d'attente d'événements. Au lieu de cela, vous devez patcher un ensemble vous-même, sinon une fois que vous obtenez le clic de la souris qui se déclenche votre bouton, le programme tombe jusqu'à la fin du fichier et la fenêtre principale se ferme:

import subprocess 
from graphics import * 
from button import Button 

win = GraphWin() 

help_button = Button(win, Point(150, 150), 50, 50, "Help") 
help_button.activate() 

quit_button = Button(win, Point(50, 50), 50, 50, "Quit") 
quit_button.activate() 

while True: 
    point = win.getMouse() 

    if help_button.clicked(point): 
     subprocess.call(['open', '-t', 'poker_help.txt']) 
    elif quit_button.clicked(point): 
     win.close() 

from button import Button apporte dans votre code du bouton ci-dessus. Une autre chose à vérifier est que votre fenêtre est en train de se fermer, et non pas simplement d'être obscurcie par la nouvelle fenêtre ouverte dessus.