J'essaie d'utiliser la fonctionnalité du module Tkinter (Python 2.7) pour créer une interface graphique qui a huit widgets placés sur une grille de 7 lignes par 5 colonnes (désolé de ne pas avoir inclus d'image; la boîte de dialogue ne me permet pas pour parcourir et télécharger l'image enregistrée).
(Widget, start_row, start_col, row_span, column_span):
Pourtant, lorsque j'exécute mon code, les boutons et Frame3 sont rendus bien, mais Frame1 "écrase" verticalement Frame2. Toutes les suggestions seraient grandement appréciées. (J'ai lu les réponses suggérées de StackOverflow et aucune ne semble fournir d'informations pouvant être utilisées pour résoudre mon problème. De plus, j'ai effectué de nombreuses recherches en ligne en vain.)
from Tkinter import *
class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master.title("Grid Manager")
self.master.rowconfigure(0, weight=1)
self.master.columnconfigure(0, weight=1)
for i in range(5):
self.master.button = Button(master, text = "Button {0}".format(i))
self.master.button.grid(row=6, column=i, sticky=W+E)
self.Frame1 = Frame(master, bg="red")
self.Frame1.grid(row = 0, column = 0, rowspan = 3, columnspan = 2, sticky = W+E+N+S)
self.Frame2 = Frame(master, bg="blue")
self.Frame2.grid(row = 2, column = 0, rowspan = 3, columnspan = 2, sticky = W+E+N+S)
self.Frame3 = Frame(master, bg="green")
self.Frame3.grid(row = 0, column = 2, rowspan = 6, columnspan = 3, sticky = W+E+N+S)
root = Tk()
app = Application(master=root)
app.mainloop()
MISE À JOUR: Maintenant que je suis sur mon ordinateur personnel, voici les images du résultat que je veux et du résultat que j'obtiens, respectivement:
Après avoir joué avec mon code pendant quelques heures, j'ai finalement pu créer l'interface graphique que je voulais. La clé faisait une boucle sur les lignes et les colonnes et définissait leurs poids en utilisant respectivement rowconfigure et columnconfigure. Le code est ci-dessous:
from tkinter import *
class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.grid()
self.master.title("Grid Manager")
for r in range(6):
self.master.rowconfigure(r, weight=1)
for c in range(5):
self.master.columnconfigure(c, weight=1)
Button(master, text="Button {0}".format(c)).grid(row=6,column=c,sticky=E+W)
Frame1 = Frame(master, bg="red")
Frame1.grid(row = 0, column = 0, rowspan = 3, columnspan = 2, sticky = W+E+N+S)
Frame2 = Frame(master, bg="blue")
Frame2.grid(row = 3, column = 0, rowspan = 3, columnspan = 2, sticky = W+E+N+S)
Frame3 = Frame(master, bg="green")
Frame3.grid(row = 0, column = 2, rowspan = 6, columnspan = 3, sticky = W+E+N+S)
root = Tk()
root.geometry("400x200+200+200")
app = Application(master=root)
app.mainloop()
Étant donné que les images 1, 2 et 3 ne contiennent pas de widgets et que vous ne leur avez donné aucune hauteur, leur taille naturelle sera d'un pixel. Si vous mettez quelque chose dans frame2, ou donnez une hauteur à frame2, il apparaîtra.
Si vous aimez essayez pytkgen (https://github.com/tmetsch/pytkgen ou http://pypi.python.org/pypi/pytkgen/ ) - qui génère des interfaces graphiques Tkinter à partir de fichiers JSON et prend soin du poids, de la hauteur et de la configuration des rangées/colonnes. Voir les exemples ici: https://github.com/tmetsch/pytkgen/tree/master/examples