动态调整Gtk.Frame的大小

时间:2018-02-05 13:51:12

标签: python-3.x gtk3

最初的目标是降低框架的高度以隐藏其下半部分。只要区域中仍有活动的小部件,这似乎不起作用。所以我使用'visible'属性来隐藏这些小部件,使用'height_request'来管理框架的高度。声明

self.frSaisie.set_property('height_request', 160)

(启动代码部分和回调部分)完全不起作用。我甚至试图隐藏盒子......仍然没有结果。 此外,屏蔽通过CheckButton激活(但不是调整大小)时有效,但在启动应用程序时(代码底部)不会考虑屏蔽。 如果有人有想法,请提前感谢。 对不起代码长度。

import gi
gi.require_version('Gtk','3.0')
from gi.repository import Gtk

class Appli(Gtk.Window):
  def __init__(self):
    Gtk.Window.__init__(self, window_position = 1)
    self.connect('delete-event', Gtk.main_quit)

    # wid actifs
    etNom = Gtk.Entry()
    etPrenom = Gtk.Entry()
    btValider = Gtk.Button('Valider')
    btEnregistrer = Gtk.Button('Enregistrer')
    btSupprimer = Gtk.Button('Supprimer')
    btEffacer = Gtk.Button('Effacer')
    self.ckGerer = Gtk.CheckButton('Gérer...', margin = 12)
    self.ckGerer.connect('toggled', self.Gerer)

    # wid container
    gdIdentite = Gtk.Grid(margin = 6)
    self.gdFonctions = Gtk.Grid(margin = 6, halign = 3, row_spacing = 6, column_spacing = 6)
    self.frSaisie = Gtk.Frame(label = '   Saisie   ', margin = 6, height_request = 400)

    # Remplissage Grid
    gdIdentite.attach(Gtk.Label('Nom', xalign = 1,margin_right = 6),0,0,1,1)
    gdIdentite.attach(etNom,1,0,1,1)
    gdIdentite.attach(Gtk.Label('Prénom', xalign = 1,margin_right = 6),0,1,1,1)
    gdIdentite.attach(etPrenom,1,1,1,1)
    self.gdFonctions.attach(btValider,0,0,1,1)
    self.gdFonctions.attach(btEnregistrer,1,0,1,1)
    self.gdFonctions.attach(btSupprimer,0,1,1,1)
    self.gdFonctions.attach(btEffacer,1,1,1,1)

    # Remplissage Box + Frame
    self.bxSaisie = Gtk.Box(orientation = Gtk.Orientation(1))
    self.bxSaisie.pack_start(gdIdentite, False, False, 0)
    self.bxSaisie.pack_start(self.ckGerer, False, False, 0)
    self.bxSaisie.pack_start(self.gdFonctions, True, True, 0)
    self.frSaisie.add(self.bxSaisie)
    self.add(self.frSaisie)

    # Start
    self.gdFonctions.set_property('visible', False) # not running at start
    self.frSaisie.set_property('height_request', 160) # never running
    self.show_all()

  def Gerer(self, etat):
    if self.ckGerer.get_active():
      self.gdFonctions.set_property('visible', True)
    else:
      self.gdFonctions.set_property('visible', False) # running
      self.frSaisie.set_property('height_request', 160) # never running

Appli()
Gtk.main()

2 个答案:

答案 0 :(得分:2)

最好调整顶部窗口的大小:

  def Gerer(self, etat):
    if self.ckGerer.get_active():
      self.gdFonctions.set_property('visible', True)
    else:
      self.gdFonctions.set_property('visible', False) # running
      self.resize(50, 50) # never running

答案 1 :(得分:0)

最后,我使用Gtk.AspectFrame小部件解决了这个问题。这种行为是我的预期。 我取代了框架的声明:

self.frSaisie = Gtk.Frame(label = '   Saisie   ', margin = 6, height_request = 300)

通过

self.frSaisie = Gtk.AspectFrame(label = '   Saisie   ', margin = 6, \
                                    height_request = 100, yalign = 0.001)

我稍微修改了回调以简化操作。

但是,我仍然不明白为什么这种格式 - 现在由函数femMini触发 - 不适用于启动。 如果有人可以向我解释......提前谢谢你

class Appli(Gtk.Window):
  def __init__(self):
    Gtk.Window.__init__(self, window_position = 1, height_request = 400)
    self.connect('delete-event', Gtk.main_quit)
    # wid actifs
    etNom = Gtk.Entry()
    etPrenom = Gtk.Entry()
    btValider = Gtk.Button('Valider')
    btEnregistrer = Gtk.Button('Enregistrer')
    btSupprimer = Gtk.Button('Supprimer')
    btEffacer = Gtk.Button('Effacer')
    self.ckGerer = Gtk.CheckButton('Gérer...', margin = 12)
    self.ckGerer.connect('toggled', self.Gerer)
    # wid container
    gdIdentite = Gtk.Grid(margin = 6)
    self.gdFonctions = Gtk.Grid(margin = 6, halign = 3, row_spacing = 6, column_spacing = 6)
    #self.frSaisie = Gtk.Frame(label = '   Saisie   ', margin = 6, height_request = 300)
    self.frSaisie = Gtk.AspectFrame(label = '   Saisie   ', margin = 6, \
                                    height_request = 100, yalign = 0.001)
    # Remplissage Grid
    gdIdentite.attach(Gtk.Label('Nom', xalign = 1,margin_right = 6),0,0,1,1)
    gdIdentite.attach(etNom,1,0,1,1)
    gdIdentite.attach(Gtk.Label('Prénom', xalign = 1,margin_right = 6),0,1,1,1)
    gdIdentite.attach(etPrenom,1,1,1,1)
    self.gdFonctions.attach(btValider,0,0,1,1)
    self.gdFonctions.attach(btEnregistrer,1,0,1,1)
    self.gdFonctions.attach(btSupprimer,0,1,1,1)
    self.gdFonctions.attach(btEffacer,1,1,1,1)
    # Remplissage Box + Frame
    self.bxSaisie = Gtk.Box(orientation = Gtk.Orientation(1))
    self.bxSaisie.pack_start(gdIdentite, False, False, 0)
    self.bxSaisie.pack_start(self.ckGerer, False, False, 0)
    self.bxSaisie.pack_start(self.gdFonctions, True, True, 0)
    self.frSaisie.add(self.bxSaisie)
    self.add(self.frSaisie)

    # Start
    self.fenMini()
    self.show_all()

  # Méthodes
  def fenMini(self):
    self.gdFonctions.set_property('visible', False)
    self.frSaisie.set_property('height_request', 120)

  def fenMaxi(self):
    self.gdFonctions.set_property('visible', True)

  # Callbacks
  def Gerer(self, etat):
    if self.ckGerer.get_active():
      self.fenMaxi()
    else:
      self.fenMini()

Appli()
Gtk.main()