2009-12-31 4 views
0

J'essaye de construire un éditeur de niveau pour un jeu sur lequel je travaille. Il extrait les données d'un fichier plat puis, basé sur une recherche octet par octet, il assemble une grille à partir de mosaïques prédéfinies. Cette partie de l'application, je ne devrais avoir aucun problème avec. Le problème est que ma version de test de l'éditeur qui charge juste une grille de test de 16x16 de 00 à FF se charge au mauvais endroit.wxPython GridSizer non attaché au panneau?

Exemple: Le cadre de l'application ressemble à ceci:

|-T-------| 
| |  | 
| |  | 
| |  | 
| |  | 
|---------| 

Excuser mon horreur art ASCII, le cadre a essentiellement un sizer horizontal sur elle, avec 2 calibreurs verticales, l'une pour la gauche et l'autre pour le droit . Chacun de ceux-ci a un panneau, qui ont chacun un second calibreur. Le calibreur de gauche a une entretoise de 64 pixels de large, puis un gridsizer qui est ensuite rempli d'images. Le deuxième calibreur de droite est un format de l'utilisateur, mais au minimum 960 pixels via une entretoise, puis un calibreur qui est déterminé par la largeur et la hauteur du niveau dans le code. Essentiellement, pour chaque côté - il y a un gridsizer à l'intérieur d'un calibreur qui a une entretoise pour la largeur de la section, qui sont sur un panneau qui est à l'intérieur d'un calibreur pour la moitié du calibreur qui est sur le cadre principal. J'espère que cela a du sens, car il me confond parfois: P

Voici le code qui fait tout cela:

#Horizontal sizer 
    self.h_sizer = wx.BoxSizer(wx.HORIZONTAL) 
    #Vertical sizer 
    self.v_sizer_left = wx.BoxSizer(wx.VERTICAL) 
    self.v_sizer_right = wx.BoxSizer(wx.VERTICAL) 

    #Create the 2 panels 
    self.leftPanel = wx.ScrolledWindow(self, style = wx.VSCROLL | wx.ALWAYS_SHOW_SB) 
    self.leftPanel.EnableScrolling(False, True) 
    self.rightPanel = wx.ScrolledWindow(self, style = wx.VSCROLL | wx.ALWAYS_SHOW_SB) 
    self.rightPanel.EnableScrolling(False, True) 

    #Create a sizer for the contents of the left panel 
    self.lps = wx.BoxSizer(wx.VERTICAL) 
    self.lps.Add((64, 0)) #Add a spacer into the sizer to force it to be 64px wide 
    self.leftPanelSizer = wx.GridSizer(256, 1, 2, 2) # horizontal rows, vertical rows, vgap, hgap 
    self.lps.Add(self.leftPanelSizer) #Add the tiles grid to the left panel sizer 
    self.leftPanel.SetSizerAndFit(self.lps) #Set the leftPanel to use LeftPanelSizer (it's not lupus) as the sizer 
    self.leftPanel.SetScrollbars(0,66,0, 0) #Add the scrollbar, increment in 64 pixel bits plus the 2 spacer pixels 
    self.leftPanel.SetAutoLayout(True) 
    self.lps.Fit(self.leftPanel) 


    #Create a sizer for the contents of the right panel 
    self.rps = wx.BoxSizer(wx.VERTICAL) 
    self.rps.Add((960, 0)) #Set it's width and height to be the window's, for now, with a spacer 
    self.rightPanelSizer = wx.GridSizer(16, 16, 0, 0) # horizontal rows, vertical rows, vgap, hgap 
    self.rps.Add(self.rightPanelSizer) #Add the level grid to the right panel sizer 
    self.rightPanel.SetSizerAndFit(self.rps) #Set the rightPanel to use RightPanelSizer as the sizer 
    self.rightPanel.SetScrollbars(64,64,0, 0) #Add the scrollbar, increment in 64 pixel bits - vertical and horizontal 
    self.rightPanel.SetAutoLayout(True) 
    self.rps.Fit(self.rightPanel) 


    #Debugging purposes. Colours :) 
    self.leftPanel.SetBackgroundColour((0,255,0)) 
    self.rightPanel.SetBackgroundColour((0,128,128)) 

    #Add the left panel to the left vertical sizer, tell it to resize with the window (0 does not resize, 1 does). Do not expand the sizer on this side. 
    self.v_sizer_left.Add(self.leftPanel, 1) 
    #Add the right panel to the right vertical sizer, tell it to resize with the window (0 does not resize, 1 does) Expand the sizer to fit as much as possible on this side. 
    self.v_sizer_right.Add(self.rightPanel, 1, wx.EXPAND) 

    #Now add the 2 vertical sizers to the horizontal sizer. 
    self.h_sizer.Add(self.v_sizer_left, 0, wx.EXPAND) #First the left one... 
    self.h_sizer.Add((0,704))       #Add in a spacer between the two to get the vertical window size correct... 
    self.h_sizer.Add(self.v_sizer_right, 1, wx.EXPAND) #And finally the right hand frame. 

Après avoir obtenu toutes les données, l'application utilisera ensuite pour générer la mise en page de niveau avec .png tuiles à partir d'un répertoire spécifié, mais à des fins de test, je suis juste générer une grille de 16x16 de 00 à FF, comme mentionné ci-dessus - via une option de menu que j'appelle cette méthode:

def populateLevelGrid(self, id): 
    #This debug method fills the level grid scrollbar with 256 example image tiles 
    levelTileset = self.levelTilesetLookup[id] 
    #levelWidth = self.levelWidthLookup[id] 
    #levelHeight = self.levelHeightLookup[id] 
    #levelTileTotal = levelWidth * levelHeight 

    levelTileTotal = 256 #debug line 

    self.imgPanelGrid = [] 
    for i in range(levelTileTotal): 
     self.imgPanelGrid.append(ImgPanel.ImgPanel(self, False)) 
     self.rightPanelSizer.Add(self.imgPanelGrid[i]) 
     self.imgPanelGrid[i].set_image("tiles/"+ levelTileset + "/" + str(i) + ".png") 
    self.rightPanelSizer.Layout() 
    self.rightPanelSizer.FitInside(self.rightPanel) 

cela fonctionne, mais les broches la grille en haut à gauche de l'ensemble du cadre, pas en haut à gauche de la droite ha Si le cadre est en place, il devrait être allumé. Il y a un code similaire pour faire une grille de 1x256 sur le cadre de gauche mais je n'ai aucun moyen de dire si cela souffre du même problème pour des raisons évidentes. Les deux ont des barres de défilement fonctionnelles, mais ont des problèmes de redessin lors du défilement, ce qui me fait me demander si cela dessine les images sur l'ensemble de l'application et ignore simplement la disposition de l'application.

Y a-t-il quelque chose qui me manque ici? C'est la première fois que j'ai fait quelque chose avec des gridsizers, des images et des GUI en général en python, ayant récemment commencé avec le langage après avoir voulu écrire quelque chose d'un peu plus multiplateforme que VB6 - des pensées? =/

Répondre

1

C'est beaucoup de code et beaucoup de calibreurs! Mais je pense que peut-être votre ImgPanels devrait avoir le droitPanel comme parent, et pas soi-même.

De même, appelez-vous jamais self.SetSizer (self.h_sizer)? Je n'ai vu ça nulle part.

Je recommande de créer des parties de la mise en page dans des fonctions séparées. Ensuite, vous n'avez pas à vous soucier de la pollution de votre espace de noms local par tous ces noms de classeurs farfelus. Ainsi, pour chaque partie de la hiérarchie de dimensionnement, vous pourriez avoir une fonction.

create_controls 
    create_left_panel 
     create_grid 
    create_right_panel 

Aussi, je l'habitude d'utiliser setMinSize sur l'enfant contrôle au lieu d'ajouter des entretoises factices aux calibreurs aux contraintes de taille de configuration. Alors Fit le fera pour vous. Parlant de Fit, je ne savais même pas qu'il pourrait prendre des arguments!

+0

Je n'appelle self.SetSizer (self.h_sizer), oui - \t \t self.SetSizer (auto.h_sizer) \t \t la taille de # Définition de la fenêtre à la taille minimale capable \t \t self.SetSize (self.h_sizer.GetMinSize()) \t \t la taille # Définition minimum la fenêtre peut être dimensionné pour \t \t auto .SetMinSize (self.h_sizer.GetMinSize()) est directement sous la première section de code. Désolé, aurait dû inclure cela. : P Quant à votre suggestion ImgPanel, je suis confus - quelle ligne devrais-je changer et à quoi? si elle est \t \t self.imgPanelGrid.append (ImgPanel.ImgPanel (self, Faux)) J'ai essayé plusieurs façons de mettre rightPanel et ne le faire fonctionner ... – user241308

+0

Mépris commentaire ci-dessus à demander ce que je dois en train de changer - je l'ai changé \t \t \t self.imgPanelGrid.append (ImgPanel.ImgPanel (self.rightPanel, Faux)) Et cela fonctionne, le problème de défilement disparu! Je vous remercie! En ce qui concerne l'idée de fonction séparée - c'est quelque chose que je pourrais bien examiner, merci pour la suggestion. – user241308

+0

En fait, le seul problème est que, pour une raison ou une autre, la barre de défilement horizontale ne semble pas fonctionner alors que la verticale fait ... Elle se déplace dans la bonne quantité d'incréments qu'elle devrait faire pour les données disponibles (3 positions possibles) mais la grille ne bouge pas. – user241308

Questions connexes