2015-06-25 2 views
0

Когда я создаю этот же ui в Glade (программа), полученный в результате код безупречен, когда я его кодирую вручную, все работает, кроме одного, set_position (670) игнорируется, и в результате окно появляется примерно в 1" квадрат на моем экране.Почему сбой set_position в этом коде

Моя цель состоит в том, чтобы получить в левой панели создать экземпляр на 670 пикселей в ширину. Я не интересуюсь блокированием ширину.

Я попытался помещая позвоните по адресу set_position (670):

  • где показано сейчас
  • 2 линии дальше
  • После self.top.show_all()
  • как раз перед self.top.show_all()
  • Только после того, как вызов pack1

Поиск Google привела никаких результатов полезных, и нет никаких полезных ответов здесь которые я нашел до сих пор.

Сайт pyGtk указывает, что вызов можно разместить практически в любом месте. Сайт gtk не содержит ограничений. Большинство обнаруженных вещей, похоже, указывают на то, что это связано с атрибутами изменения размера/сжатия одного из других виджетов, но после многочисленных попыток изменения значений всего на левой панели я все еще не в порядке. (Обратите внимание, что изменения значений были опробованы один или два за один раз.)

import gtk 
import gobject 


class Source(gobject.GObject): 

    def _emit_signal(self, button, value): 
     self.emit('choice_changed', self, value) 

    def __init__(self): 
     self.__gobject_init__() 
     # packing treee 
     # top 
     # main 
     #  inst_align 
     #  inst_window 
     #   instructions 
     #  opt_align 
     #  opt_buttons 
     #   opt_0 (through opt_5) 
     #   doit_box 
     #   doit 
     self.top = gtk.Alignment(0.0, 0.0, 1.0, 1.0) 
     self.main = gtk.HPaned() 
     self.main.set_position(670) 
     self.top.add(self.main) 
     # Build left side components 
     self.inst_align = gtk.Alignment(0.0, 0.0, 1.0, 1.0) 
     self.inst_window = gtk.ScrolledWindow(None, None) 
     self.inst_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) 
     self.instructions = gtk.TextView(None) 
     self.instructions.get_buffer().set_text(
      "Very long (1200 char) string snipped.") 
     #pack pane 1 
     self.inst_window.add(self.instructions) 
     self.inst_align.add(self.inst_window) 
     self.main.pack1(self.inst_align, True, False) 
     # build right side components 
     self.opt_align = gtk.Alignment(1.0, 0.0, 0.0, 0.0) 
     self.opt_buttons = gtk.VButtonBox() 
     self.opt_buttons.set_layout(gtk.BUTTONBOX_START) 
     self.opt_buttons.set_homogeneous(True) 
     self.opt_0 = gtk.RadioButton(
      None, 
      "Label 0", 
      True) 
     self.opt_1 = gtk.RadioButton(
      self.opt_0, 
      "Label 1", 
      True) 
     self.opt_2 = gtk.RadioButton(
      self.opt_0, 
      "Label 2", 
      True) 
     self.opt_3 = gtk.RadioButton(
      self.opt_0, 
      "label 3", 
      True) 
     self.opt_4 = gtk.RadioButton(
      self.opt_0, 
      "Label 4", 
      True) 
     self.opt_5 = gtk.RadioButton(
      self.opt_0, 
      "Label 5", 
      True) 
     self.doit_box = gtk.HButtonBox() 
     self.doit = gtk.Button("Do It !", None, True) 
     self.doit.expand = False 
     self.doit.fill = False 
     self.doit.set_alignment(0.5, 0.0) 
     # Put the buttons in the box and while were at it, bind their 
     # released, and pressed options 
     for i in range(0, 6): 
      s = "self.opt_" + str(i) 
      self.opt_buttons.pack_start(eval(s), True, False, 0) 
      s1 = s + '.connect("released", self._emit_signal, i)' 
      s2 = s + '.connect("pressed", self._emit_signal, i)' 
      exec(s1) 
      exec(s2) 

     self.doit_box.pack_start(self.doit, True, False, 0) 
     self.opt_buttons.pack_start(self.doit_box, True, False, 0) 
     self.opt_align.add(self.opt_buttons) 
     self.main.pack2(self.opt_align, True, False) 

     self.top.show_all() 




gobject.type_register(Source) 
gobject.signal_new('choice_changed', 
        Source, 
        gobject.SIGNAL_RUN_FIRST, 
        gobject.TYPE_NONE, (Source, gobject.TYPE_INT)) 


if __name__ == "__main__": 
    def cb_test(widget, event, value): 
     print "widget is", widget 
     print "Value is ", value 
     return 

    test = Source() 
    win = gtk.Window() 
    win.add(test.top) 
    win.show_all() 
    test.connect('choice_changed', cb_test) 
    gtk.main() 
+0

Окно слишком маленькое. Если вы установите размер фитинга в окно (ширина 800), он будет работать. – elya5

+0

@ elya54 - понял, что около 40 минут назад. Код не был ошибкой, тест был. Если вы положите это как на ответ, то плохо согласитесь с ним и съешь свой скромный пирог для глупого вопроса дня ... – Jase

ответ

0

Вы должны установить окно с более чем положение HPane делителя. Ниже приведен пример:

import gtk 

class Source(gtk.Window): 

    def __init__(self): 
     super(Source, self).__init__() 
     label1 = gtk.Label("The first label") 
     label2 = gtk.Label("The second label") 

     paned = gtk.HPaned() 
     paned.add1(label1) 
     paned.add2(label2) 
     paned.set_position(600) 

     self.add(paned) 
     self.set_size_request(800, 400) # needs sufficient width here 
     self.connect('delete-event', gtk.main_quit) 
     self.show_all() 


if __name__ == "__main__": 
    test = Source() 
    gtk.main() 
+0

Gads это на вкус ужасно .... – Jase

Смежные вопросы