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? =/
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
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
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