Вы можете создать привязку к событию
:
self.text_input.bind("",
lambda event: self.executecommand())
См. bind
и keysyms
. Обратите внимание, что в отличие от атрибута command
, привязки вызываются с аргументом события, поэтому используется лямбда.
subprocess.call
ожидает последовательность в качестве аргумента команды, поэтому вы, вероятно, используете что-то вроде этого:
call([self.command], shell=True)
(В общем, shell=True
небезопасно, но это в этом контексте, вероятно, все в порядке.)
Это проблема, потому что обратная косая черта (\) служит escape-символом для регулярных выражений и строк. Вы можете использовать специальную переменную \ & amp; уменьшить количество обратных косых черт в строке замены gsub.
foo.gsub(/\\/,'\&\&\&') #for some string foo replace each \ with \\\
РЕДАКТИРОВАТЬ: я должен упомянуть, что значение \ & amp; это от соответствия регулярному выражению, в данном случае один обратный слеш.
Кроме того, я подумал, что существует особый способ создания строки, которая отключает escape-символ, но, очевидно, нет. Ни один из них не вызовет две косые черты:
puts "\\"
puts '\\'
puts %q{\\}
puts %Q{\\}
puts """\\"""
puts '''\\'''
puts <<EOF
\\
EOF
Ага, сразу после того, как я все это напечатал, я понял, что \
используется для ссылки на группы в строке замены. Я предполагаю, что это означает, что вам нужен литерал \\
в строке замены, чтобы получить один замененный \
. Чтобы получить литерал \\
, вам нужно четыре \
с, поэтому для замены одного на два вам действительно нужно восемь (!).
# Double every occurrence of \. There's eight backslashes on the right there!
>> puts '\\'.sub(/\\/, '\\\\\\\\')
Что-то я пропустил? Есть ли более эффективные способы?
книга кирки упоминает именно эту проблему, на самом деле. вот еще один вариант (со страницы 130 последнего издания)
str = 'a\b\c' # => "a\b\c"
str.gsub(/\\/) { '\\\\' } # => "a\\b\\c"
Устранение небольшой путаницы во второй строке кода автора.
Вы сказали:
>> puts '\\ <- 2x a, because 2 backslashes get replaced'.sub(/\\/, 'aa')
# aa <- 2x a, because two backslashes get replaced
Две обратные косые черты здесь не заменяются. Вы заменяете 1 экранированную обратную косую черту двумя буквами a ('aa'). То есть, если вы использовали .sub (/ \\ /, 'a')
, вы бы увидели только один 'a'
'\\'.sub(/\\/, 'anything') #=> anything