2017-10-16 24 views
-1

Je crée un petit jeu en utilisant python avec pygame.Python - Comment exécuter un fichier dans une fenêtre tkinter d'un autre fichier

Il y a un petit problème: J'ai mon interfarce dans un fichier python et le jeu dans un autre fichier. Le problème est que lorsque je clique sur jouer sur mon interface, il charge le fichier du jeu dans une seconde fenêtre et je veux exécuter ce fichier dans la fenêtre courante de l'interfarce. Merci pour votre temps!

code partie intéressante:

Le fichier d'interface (en cliquant sur le bouton solo, exécutez la définition solo)

def solo(): 
import Solo 
fenetre.mainloop() 

solo=Button(fenetre, image = pho15, width = 280, height = 81, borderwidth = 0, cursor = "hand2", command = solo) 

Le fichier solo (générer une nouvelle fenêtre)

fen=Tk() 
fen.title("Super Crash") 

coords = (175, 345) 
image = Image.open("on.png") 
photo = ImageTk.PhotoImage(image) 
score=0 

pygame.mixer.init() 
crash = pygame.mixer.Sound("crash.ogg") 
crash.set_volume(0.1) 
bruit = pygame.mixer.Sound("bip.ogg") 
bruit.set_volume(0.01) 

ima1 = Image.open("Rejouer.jpg") 
pho1 = ImageTk.PhotoImage(ima1) 
ima2 = Image.open("Menu.jpg") 
pho2 = ImageTk.PhotoImage(ima2) 

can=Canvas(fen,bg="white", height=800, width=1000) 
can.create_image(0,0, anchor = NW, image = photo) 
can.focus_set() 
can.bind("<KeyPress>", monter) 
can.pack() 

anim() 

init() 
+0

double possible de [Intégration d'une fenêtre Pygame dans un Tkinter ou un cadre WxPython] (https://stackoverflow.com/questions/23319059/embedding-a-pygame-window-into-a-tkinter-or -wxpython-frame) –

Répondre

0

Le raison pour laquelle il crée une autre fenêtre est parce que fen = Tk() va créer une nouvelle fenêtre d'application. Si vous effectuez une recherche autour de vous, vous pouvez trouver quelques exemples, mais voici comment lancer une application tkinter externe dans une autre.

fichier principall'exécution de ce fichier (main.py ou autre), puis cliquez sur le bouton

from tkinter import * 
from subprocess import Popen 

def launchExternal(parent): 

    container = Frame(parent, container=True) 
    container.pack(expand=True, fill='both') 
    ''' Pass the window id of the container frame in this main application 
     to the external program. See solo.py for putting content in the 
     container. 
    ''' 
    process = Popen(['python', 'solo.py', str(container.winfo_id())]) 

# Create the main application GUI (this file) 
root = Tk() 
# Define the external program name (will be solo.py) 
program = 'solo' 
# For fun, click this button multiple times to see what happens. 
solo = Button(root, text="Launch solo", width = 10, height = 10, borderwidth = 0, 
    cursor = "hand2", command = lambda r=root: launchExternal(r)) 
solo.pack() 

root.mainloop() 

Ceci est le fichier externe (solo.py).

from tkinter import * 
import sys 

def createInnerUI(master): 
    canvas = Canvas(master, bg='blue') 
    canvas.pack(pady=5) 
    label = Label(master, text="Demonstrate embedded application", bg='green') 
    label.pack() 

if len(sys.argv) < 1: 
    root=Tk() 
else: 
    target_window_id = sys.argv[-1] 
    root = Tk(use=target_window_id) 

createInnerUI(root) 
root.mainloop() 
+0

Merci, donc le solo complet est dans la fonction createInnerUI? Cela ne fonctionne pas pour l'ensemble du programme –

+0

Pas nécessairement. D'autres fonctions peuvent être créées pour ajouter des éléments à l'interface graphique si vous le souhaitez. Par exemple, le canevas pourrait avoir été créé juste après 'root = Tk (use = target_window_id)' et avant l'appel à 'createInnerUI (root)', mais j'ai choisi de le placer dans une fonction avec l'étiquette. Essayez de déplacer les choses pour voir ... –

+0

En ce qui concerne * cela ne fonctionne pas pour l'ensemble du programme * Je ne suis pas sûr de ce que vous voulez dire. –