2016-04-13 1 views
0

Bonsoir/matinée,L'application wxpython s'éteint à l'écran sur des résolutions plus basses

J'ai travaillé sur un programme décent en profondeur sur mon moniteur 1920x1080. J'ai tout mis en place pour s'adapter à mon moniteur lorsqu'il est agrandi. J'ai quelques problèmes que je pense sont liés à la façon dont j'ai configuré mes calibreurs. Tout d'abord, lorsque je diminue la taille réelle de l'écran, le contenu de la fenêtre ne diminue pas avec elle, mais ils sont simplement coupés du côté droit. Ainsi, un écran plus petit signifie la moitié du contenu, pas la moitié de la taille du contenu.

Ce problème se répercute aussi lorsque j'ajuste la résolution. Avec des résolutions plus faibles, je n'ai que la moitié du contenu qui correspond à mon écran. Je ne sais pas comment je suis censé mettre en place mes calibreurs pour résoudre ce problème, alors voici une brève description de la façon dont je les ai maintenant:

import wx 

class simpleapp_wx(wx.Frame): 
    def __init__(self,parent,id,title): 
     wx.Frame.__init__(self,parent,id,title,(-1,-1)) 
     self.parent = parent 
     self.initialize() 

    """ Create All of the pieces for the GUI """ 
    def initialize(self): 
     sizer = wx.GridBagSizer() 
     panel = wx.Panel(self) 

     # Handles the creation of all of the buttons 
     def make_button(text, starty, startx, height, width): 
      button = wx.Button(self, -1, text) 
      sizer.Add(button, (starty, startx), (height, width), wx.EXPAND) 
      return button 

     # Handles the c reation of all of the static text labels 
     def make_label(text, starty, startx, height, width): 
      self.label = wx.StaticText(self, -1, text, wx.DefaultPosition, wx.DefaultSize) 
      sizer.Add(self.label, (starty, startx), (height, width), wx.EXPAND) 
      return self.label 

     # Create all of the labels for each slot and buttons 
     for i in range(0, 4): 
      # all the labels 
      make_label('Voltage', 7, i*5, 1, 1) 
      make_label('Current', 8, i*5, 1, 1) 
      make_label('Power', 9, i*5, 1, 1) 
      make_label('Rail 1', 6, (i*5)+1, 1, 1) 
      make_label('Rail 2', 6, (i*5)+2, 1, 1) 
      make_label('Rail 3', 6, (i*5)+3, 1, 1) 
      make_label('Total Power', 6, (i*5)+4, 1, 1) 
      make_label('Status:', 14, (i*5), 1, 1) 
      # Global Rail commands for all 4 slots 
      make_button("Margin Low", 1, (i*5)+2, 1, 1) 
      make_button("Margin High", 1, (i*5)+3, 1, 1) 
      make_button("Margin Off", 1, (i*5)+4, 1, 1) 
      # Rail 1 for all 4 slots 
      make_button("Margin High", 11, (i*5)+1, 1, 1) 
      make_button("Margin Low", 12, (i*5)+1, 1, 1) 
      make_button("Margin Off", 13, (i*5)+1, 1, 1) 
      # Rail 2 for all 4 slots 
      make_button("Margin High", 11, (i*5)+2, 1, 1) 
      make_button("Margin Low", 12, (i*5)+2, 1, 1) 
      make_button("Margin Off", 13, (i*5)+2, 1, 1) 
      # Rail 3 for all 4 slots 
      make_button("Margin High", 11, (i*5)+3, 1, 1) 
      make_button("Margin Low", 12, (i*5)+3, 1, 1) 
      make_button("Margin Off", 13, (i*5)+3, 1, 1) 
      # Create the Configure buttons for each slot (only needs to run three times so needs if statement 
      if i < 3: 
       # Make the Configure buttons for Slot 1 
       make_button("Configure", 10, i+1, 1 ,1) 
       # Make the Configure buttons for Slot 2 
       make_button("Configure", 10, i+6, 1, 1) 
       # Make the Configure buttons for Slot 3 
       make_button("Configure", 10, i+11, 1, 1) 
       # Make the Configure buttons for Slot 4 
       make_button("Configure", 10, i+16, 1, 1) 

     self.SetSizerAndFit(sizer) 
     self.SetSizeHints(-1,-1) 
     self.Show(True) 
     self.Maximize(True) 

if __name__ == "__main__": 
    app = wx.App() 
    frame = simpleapp_wx(None,-1,'Add-in Card GUI') 
    app.MainLoop() 

J'ai lu autour, et je lis quelque part à mettre l'gridbagsizer dans un groupe et qui devrait fonctionner, donc mon en-tête modifié et plus étaient:

sizer = wx.GridBagSizer() 
    panel = wx.Panel(self) 

    panel.SetSizer(sizer) 
    panel.Fit() 
    self.Fit() 
    self.Show(True) 
    self.Maximize(True) 

Cela ne change rien non plus. J'ai essayé de définir SetSizeHints à des résolutions spécifiques, mais cela n'a pas fonctionné non plus.

Alors, quel est le problème? J'ai le sentiment que ça a quelque chose à voir avec moi, juste en utilisant un calibreur pour tout le contenu. Si c'est le cas, quel est le moyen le plus simple pour résoudre ce problème sans avoir à reconstruire complètement de nouveaux calibreurs et à casser le contenu?

+0

Pourriez-vous créer un petit exemple exécutable qui illustre le problème? –

+0

J'ai posté un petit exemple de travail. Désolé de l'indentation cependant, je ne pouvais pas pour la vie de moi obtenir ce droit. Cela ressemble physiquement à la pile, mais pour une raison quelconque, lorsque je la copie sur gedit, ça gâche, alors faites juste attention à cela. L'exemple est dans la première zone de texte ci-dessus et a remplacé mon ancien. –

+1

Je ne suis pas sûr de la façon dont vous voulez qu'il se comporte dans un espace plus petit, mais vous pouvez utiliser un 'scrolledpanel'. 'panel = wx.lib.scrolledpanel.ScrolledPanel (self) panel.SetupScrolling()' –

Répondre

0

Vous devez marquer les colonnes et les lignes du calibreur comme Growable:

... 
for i in range(0, 20): 
    sizer.AddGrowableCol(i, 1) 
for i in range(0, 15): 
    sizer.AddGrowableRow(i, 1) 

self.SetSizerAndFit(sizer) 
... 

fonctionne sur votre exemple. Maintenant, il ne rétrécira pas encore très loin, parce que vous avez beaucoup de widgets, et ils ont tous des tailles minimales, mais ça va au moins un peu plus serré. (Et étendre pour occuper plus d'espace, si disponible.)

Pour au moins wxPython> = 3, vous devez vous assurer que vous essayez seulement de rendre une ligne ou une colonne exploitable si elle existe.