J'aimerais modifier mon code pour que lorsque je clique sur le bouton rose en haut à gauche, au lieu d'afficher une seconde fenêtre en plus de la première, la première affiche autre chose.
J'apprends Python3, et la programmation en général, depuis peu, et par tatonnement, en suivant différents tutoriaux trouvé un peu partout. J'ai trouvé plusieurs pages sur internet qui montrent différents codes, mais sans expliquer le code vraiment, du coup je n'arrive pas à l'appliquer à ce que j'ai fais.
Est-ce que je suis totalement mal parti et je dois reprendre à zéro, ou est-ce que je peux faire quelque chose à partir de ce que j'ai déjà ?
A terme je voudrais plusieurs boutons en haut, avec le bouton rose de test "Hub ?" pour aller dans les différentes parties du jeu (arène, boutique, exploration, inventaire....).
J'ai trouvé un bout de code que j'essaie d'adapter, pour le moment j'essaie seulement de la comprendre. Je vois bien le fonctionnement pour passer de Empty à Hub, mais pas encore comment l'appliquer au reste de mon interface.
def change_ui(frame):
frame.tkraise()
root = Tk()
f_empty = Frame(root)
f_hub = Frame(root)
f_arena = Frame(root)
f_shop = Frame(root)
for frame in (f_empty, f_hub, f_arena, f_shop):
frame.grid(row=0, column=0, sticky='news')
Button(f_empty, text="Go to Hub", command=lambda:change_ui(f_hub)).pack()
Label(f_empty, text="Here is Empty").pack()
Label(f_hub, text="Go to Empty").pack()
Button(f_hub, text="Here is Hub", command=lambda:change_ui(f_empty)).pack()
change_ui(f_empty)
root.mainloop()
Bon je n'ai pas lu ton code mais selon ton titre je propose ce qui suit:
Tu peux créer une liste des widgets présents sur la première page et puis utilise cette fonction (en passant en paramètre la liste des widgets précédente) :
def effWidgets(liste_widgets):
"""Vider la fenêtre des widgets"""
if liste_widgets != []:
for (i, j) in enumerate(liste_widgets):
j.grid_forget()
else: pass
et créer une nouvelle liste pour tes nouveaux widgets à placer.
La méthode grid_forget() ici te permettra non seulement de vider la fenêtre mais aussi de ne pas détruire les widgets de la première page et les réutiliser facilement.
Cette fonction je l'utilise moi-même dans mes programmes, elle fonctionne correctement.
Bonjour, tes deux classes sont des instances de tkinter.Tk, donc forcement, tu auras une fenêtre pour chacune. Si tu veux pouvoir afficher ces pages dans une seule fenêtre, je pense que tu devrais faire hériter tes classes de tkinter.Frame et pack() tes classes dans une fenetre (ou une 3eme classe qui hérite de tkinter.Tk)
Donc ne t'inquiète pas ton code n'est pas perdu et peut être réutilisé faudra juste changer ton __init__ en rajoutant un paramètre master, que tu donnera au __init__ de tkinter.Frame
Une question qui se rapproche de la tienne a déjà été posée dans les derniers jours, rien ne t'empêche de te rendre ICI pour jeter un coup d'oeil
Sur ce, bonne soirée
Si je suis tête en l'air, c'est par habitude de viser le sommet
J'ai tenté d'appliquer plusieurs explications, et j'ai simplifié mon code précédent pour "y voir plus clair" tout en gardant la structure, parce que j'ai du mal à appliquer un "exemple type" à un "cas concret"... Je n'apprends qu'en bidouillant. Pas optimal du tout, mais pour le moment mon cerveau fonctionne ainsi.
J'ai compris le principe, les pages sont toutes superposées, et le programme n'affiche que celle "du dessus". Seulement, quand je crois l'appliquer à mon programme, évidemment ça coince.
J'ai fait vaguement ça, mais à l'exécution, Python n'est pas content car
> Traceback (most recent call last): File "/usr/lib/python3.4/tkinter/__init__.py", line 1536, in __call__ return self.func(*args) File "aaa.py", line 55, in <lambda> but_two = Button(frame_up, text="-> Page Two", command=lambda: controller.show_frame("PageTwo"), **but_cfg) NameError: name 'controller' is not defined
Pourriez vous m'aiguiller encore ?
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
coulbg = "dark grey"
coultxt = "black"
winx = "1024"
winy = "576"
import tkinter
from tkinter.filedialog import *
class InterGeneric(tkinter.Tk): # this class manages the pages, and the upper part of the interface with the tabs to swith pages
def __init__(self, *args, **kwargs):
tkinter.Tk.__init__(self, *args, **kwargs)
self.minsize(width=winx, height=winy)
self.grid()
self.resizable(True, True)
container = tkinter.Frame(self)
container.grid()
self.frames = {}
for F in (PageOne, PageTwo):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = frame
frame.grid(row=1, column=0, sticky="nsew")
self.show_frame("PageOne")
def show_frame(self, page_name):
'''Show a frame for the given page name'''
frame = self.frames[page_name]
frame.tkraise()
self.update()
self.geometry(self.geometry())
self.columnconfigure(0, weight=6)
self.columnconfigure(1, weight=1)
self.rowconfigure(1, weight=1)
frame_up = tkinter.Frame(self, bg="green", height=50, borderwidth=0) # upper part of the window, with all buttons in a green frame
frame_up.grid(column=0, row=0, sticky="we")
but_cfg = dict(borderwidth=1, fg='grey', bg='black', activeforeground='grey99', activebackground='black')
but_one = Button(frame_up, text="-> Page One", command=lambda: controller.show_frame("PageOne"), **but_cfg)
but_one.grid(column=0, row=0, padx=10, pady=10, sticky="nsew") # button to go to PageOne
but_two = Button(frame_up, text="-> Page Two", command=lambda: controller.show_frame("PageTwo"), **but_cfg)
but_two.grid(column=1, row=0, padx=10, pady=10, sticky="nsew") # button to go to PageTwo
frame_upq = tkinter.Frame(self, bg="purple", height=50, borderwidth=0) # frame top right with Quit button
frame_upq.grid(column=2, row=0, sticky="we")
but_quitter = Button(frame_upq, text="-> Quit", command=self.quit, **but_cfg)
but_quitter.grid(column=0, row=0, padx=10, pady=10, sticky="e") # button to quit
for i in range(2):
frame_up.grid_columnconfigure(i, weight=1)
frame_up.grid_rowconfigure(0, weight=1)
frame_upq.grid_columnconfigure(0, weight=1)
frame_upq.grid_rowconfigure(0, weight=1)
class PageOne(tkinter.Frame):
def __init__(self, parent, controller):
tkinter.Frame.__init__(self, parent)
self.controller = controller
frame_pageone = tkinter.Frame(self, bg="blue", height=200) # should be PageOne full of blue
class PageTwo(tkinter.Frame):
def __init__(self, parent, controller):
tkinter.Frame.__init__(self, parent)
self.controller = controller
frame_pagetwo = tkinter.Frame(self, bg="red", height=200) # should be PageTwo full of red
if __name__ == "__main__":
app = InterGeneric()
app.title("DraDro_160524.01")
app.mainloop()
Sur GitHub j'ai mis mon fichier pré-superpose de pages, avec le menu en haut et la page principale en bas : http://github.com/Jeux1d100/InterGeneric/blob/master/gomutant.py
l'erreur provient de la ligne 48 & 51 où dans le lambda, tu as écrit controller au lieu de self (la méthode show_frame appartient à ta classe)
Mais avant tout espoir, laisse moi te prévenir que rien ne s'affichera en mettant self à la place, tu n'auras juste plus d'erreur.
Si je comprends bien tu souhaites que sur la page principale, il y ait deux bouton qui affichent le frame souhaité sur cette meme page? Du coup tu bidouille un code qui n'est pas à toi pour y arriver.. C'est pas la bonne méthode, tu devrais essayer de garder en tête l'idée principale de ce code, et d'essayer de faire un code minimaliste qui marche pour TON idée. Ensuite tu adaptes ton ancien code en prenant ton nouveau code comme modèle.
EDIT: d'ailleurs le modèle que t'as trouvé a pour fonction principale de pouvoir atteindre n'importe quelle page depuis n'importe quelle page. Est-ce vraiment ce que tu cherches? depuis une sous-page as tu besoin de réatteindre la page de départ ou tu veux un menu de bouton qui affiche la page que tu veux et que ce menu soit présent au-dessus de chaque page?
- Edité par WexyR 3 septembre 2016 à 19:04:40
Si je suis tête en l'air, c'est par habitude de viser le sommet
Hm, c'est ce que j'essaie de faire. J'ai dépouillé le code-exemple, j'ai dépouillé mon code, j'ai refait une page en adaptant l'un à l'autre. Pour le moment sans succès, semble-t-il.
Je vais reprendre sur une page vierge pour voir à quoi j'arrive.
Je veux ma barre noire en haut avec différents "onglets" (boutons), qui "restent" là dans une frame.
Dans la grande zone grise, les frames qui correspondent à chaque onglets quand je clique sur les boutons correspondants.
Pour alléger le code et mieux comprendre, je l'ai aménagé et dépouillé avant de poster ici.
Sur cette image, ma barre noire est "fonctionnelle" dans le sens où elle est alignée comme je veux. Les boutons cliquent dans le vide pour le moment, sauf Menu pour quitter. La barre noire est une frame, et la grande zone grise est une autre frame, fixe et vide pour le moment, qui quand j'aurai compris, affichera les frames relatives à chaque boutons du haut.
tkinter, modifier code pour afficher page 2 ?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
M-EH