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 кнопки рядом с текстовым виджетом
Начиная с версии 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 ()
. Если кто-то готов поделиться советом по этому поводу, не стоит ценить.
Обычно существует два решения этого типа проблем. Ни один из них не лучше другого ни при любых обстоятельствах, ни в этом конкретном примере. Оба решения вполне приемлемы.
Решение 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)
В этом конкретном случае я бы выбрал первый метод, с пакетом. Для более сложных конструкций я почти всегда использую сочетание сетки и упаковки. Используйте пакет для элементов, которые естественным образом укладываются горизонтально или вертикально (например, панели инструментов). Используйте сетку для более сложных макетов (например, для всего приложения, виджетов с полосами прокрутки, диалоговых окон и т.д.). Нельзя использовать и сетку, и упаковку для одного контейнера, но можно использовать упаковку для одного контейнера, сетку для другого и т.д.