Как я могу поместить 2 кнопки друг рядом с другом?

b = Button(root, text="Enter", width=10, height=2, command=button1)
b.config()
b.pack(side=LEFT)

c = Button(root, text="Clear", width=10, height=2, command=clear)
c.pack(side=LEFT)


scrollbar = Scrollbar(root)
scrollbar.pack(side=RIGHT, fill=Y)
text.config(width=35, height=15)
text.pack(side=RIGHT, fill=Y)
scrollbar.config(command=text.yview)
text.config(yscrollcommand=scrollbar.set)

Как я могу поместить эти 2 кнопки друг рядом с другом ontop текстового виджета? когда я установил "side=LEFT", он просто помещает эти 2 кнопки рядом с текстовым виджетом

6
задан sourD 14 February 2010 в 13:29
поделиться

1 ответ

Начиная с версии 5.10, можно также использовать именованные буферы захвата :

#!/usr/bin/perl

use strict; use warnings;

my %data;

my $s = 'abcdefghijklmnopqr';

if ($s =~ /abc (?<first>def) ghi (?<second>jkl) mno (?<third>pqr)/x ) {
    push @{ $data{$_} }, $+{$_} for keys %+;
}

use Data::Dumper;
print Dumper \%data;

Output:

$VAR1 = {
          'first' => [
                       'def'
                     ],
          'second' => [
                        'jkl'
                      ],
          'third' => [
                       'pqr'
                     ]
        };

Для более ранних версий можно использовать следующее, что позволяет избежать необходимости добавлять строку для каждого захваченного буфера:

#!/usr/bin/perl

use strict; use warnings;

my $s = 'abcdefghijklmnopqr';

my @arrays = \ my(@first, @second, @third);

if (my @captured = $s =~ /abc (def) ghi (jkl) mno (pqr) /x ) {
    push @{ $arrays[$_] }, $captured[$_] for 0 .. $#arrays;
}

use Data::Dumper;
print Dumper @arrays;

Output:

$VAR1 = [
          'def'
        ];
$VAR2 = [
          'jkl'
        ];
$VAR3 = [
          'pqr'
        ];

Но мне нравится сохранять связанные данные в одной структуре данных, поэтому лучше всего вернуться к использованию Это требует дополнительного массива, однако:

my %data;
my @keys = qw( first second third );

if (my @captured = $s =~ /abc (def) ghi (jkl) mno (pqr) /x ) {
    push @{ $data{$keys[$_]} }, $captured[$_] for 0 .. $#keys;
}

Или, если имена переменных действительно первый , второй и т.д., или если имена буферов не имеют значения, но только порядок делает, вы можете использовать:

my @data;
if ( my @captured = $s =~ /abc (def) ghi (jkl) mno (pqr) /x ) {
    push @{ $data[$_] }, $captured[$_] for 0 .. $#captured;
}
-121--2393385-

Просто в случае, если кому-то это нужно, я уточнил решение Джона немного так

// jquery_trigger_ready.js
// this function is added to jQuery, it allows access to the readylist
// it works for jQuery 1.3.2, it might break on future versions
$.getReadyList = function() {
  if(this.readyList != null) { this.myreadylist = [].concat(this.readyList); }
  return this.myreadylist;
};

$(document).ready(function() {
  readylist = $.getReadyList();
});

$.triggerReady = function() {
  $(readylist).each(function(){this();});
}

Включение этого файла после включения jquery позволяет запустить ready путем вызова $ .triggerReady () . Пример:

<html>
  <head>
    <title>trigger ready event</title>
    <script src="test2_files/jquery-1.js" type="text/javascript"></script>
    <script src="jquery_trigger_ready.js" type="text/javascript"></script>
  </head>
  <body>
    <input onclick="$.triggerReady();" value="trigger ready" type="button">
    <script type="text/javascript">
      $(document).ready(function(){
          alert("blah");
      });
    </script>
  </body>
</html>

Кстати, я хотел сделать его $ (документ) .triggerReady () . Если кто-то готов поделиться советом по этому поводу, не стоит ценить.

-121--1305305-

Обычно существует два решения этого типа проблем. Ни один из них не лучше другого ни при любых обстоятельствах, ни в этом конкретном примере. Оба решения вполне приемлемы.

Решение 1: используйте два контейнера (как правило, фреймы). Один для хранения горизонтальных элементов, другой для хранения вертикальных элементов. В этом случае корневое окно может служить контейнером для вертикально уложенных элементов. Поместите две кнопки в горизонтальную рамку (с помощью pack (сторона = LEFT)), затем поместите эту рамку над текстовым виджетом (с помощью pack (сторона = TOP)).

Решение 2: используйте диспетчер геометрии сетки, который размещает пользовательский интерфейс в сетке. Поместите кнопки в ячейки 0,1 и 0,2, а графический элемент текста в 1,1, охватывающий два столбца.

Как правило, для использования сети требуется несколько большее предварительное планирование. Необходимо выяснить, какие элементы должны охватывать столбцы или строки, какие столбцы или строки должны расти и сокращаться при изменении размера виджета и т.д. Решение пакета является "самым простым" (для некоторых определений "easy", в любом случае) для очень простых макетов, таких как этот.

Общая методика использования кадров для размещения групп виджетов является хорошей. Это упрощает управление целыми наборами виджетов как группой. и смешивать и сопоставлять группы виджетов слева направо и группы виджетов сверху вниз.

Вот как я бы сделал это с помощью метода нескольких кадров. Обратите внимание, как я создаю виджеты как нижестоящие элементы корня, а не как нижестоящие элементы внутренних рамок. Это немного облегчает изменение макета в будущем, так как все, что вам нужно сделать, это создать или удалить различные кадры без необходимости изменять иерархию виджетов.

# create the main sections of the layout, 
# and lay them out
top = Frame(root)
bottom = Frame(root)
top.pack(side=TOP)
bottom.pack(side=BOTTOM, fill=BOTH, expand=True)

# create the widgets for the top part of the GUI,
# and lay them out
b = Button(root, text="Enter", width=10, height=2, command=button1)
c = Button(root, text="Clear", width=10, height=2, command=clear)
b.pack(in_=top, side=LEFT)
c.pack(in_=top, side=LEFT)

# create the widgets for the bottom part of the GUI,
# and lay them out
text = Text(root, width=35, height=15)
scrollbar = Scrollbar(root)
scrollbar.config(command=text.yview)
text.config(yscrollcommand=scrollbar.set)
scrollbar.pack(in_=bottom, side=RIGHT, fill=Y)
text.pack(in_=bottom, side=LEFT, fill=BOTH, expand=True)

Ниже приведена наивная реализация с использованием сетки. Он имеет другое поведение изменения размера, которое может быть или не быть таким, каким вы хотите. Это действительно зависит от желаемого поведения изменения размера. Обычно я управляю рядом элементов управления с рамкой, а затем с помощью сетки раскладываю ее вместе с другими виджетами. В этом примере я просто использую сетку для всего.

Обратите внимание, что в дополнение к управлению строками и столбцами виджета необходимо определить весовой коэффициент для строк и столбцов. Как минимум, нужно выбрать одну строку и один столбец, чтобы "забрать слабину", что обычно означает, в каком столбце находится ваш основной виджет (читай: обычно текст, холст или другой кадр).

b = Button(root, text="Enter", width=10, height=2, command=button1)
c = Button(root, text="Clear", width=10, height=2, command=clear)
b.grid(row=0,column=0, sticky=W)
c.grid(row=0,column=1, sticky=W)

textframe = Frame(root)
textframe.grid(in_=root, row=1, column=0, columnspan=3, sticky=NSEW)
root.columnconfigure(0, weight=1)
root.rowconfigure(1, weight=1)

text = Text(root, width=35, height=15)
scrollbar = Scrollbar(root)
scrollbar.config(command=text.yview)
text.config(yscrollcommand=scrollbar.set)
scrollbar.pack(in_=textframe, side=RIGHT, fill=Y)
text.pack(in_=textframe, side=LEFT, fill=BOTH, expand=True)

В этом конкретном случае я бы выбрал первый метод, с пакетом. Для более сложных конструкций я почти всегда использую сочетание сетки и упаковки. Используйте пакет для элементов, которые естественным образом укладываются горизонтально или вертикально (например, панели инструментов). Используйте сетку для более сложных макетов (например, для всего приложения, виджетов с полосами прокрутки, диалоговых окон и т.д.). Нельзя использовать и сетку, и упаковку для одного контейнера, но можно использовать упаковку для одного контейнера, сетку для другого и т.д.

15
ответ дан 8 December 2019 в 16:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: