我正在练习基于 Gtk 和 Ruby 的 GUI。我计划制作一个带有 TextView 和按钮的小窗口。当您在 TextView 中输入文本并按下按钮时,它会调用 Twitter gem 的方法并向 Twitter 发送推文。
成功之后,我想制作一个键盘快捷键来做到这一点:比如,当你按下 Ctrl+Enter 时,它会发推文。
这是我编写的部分源代码。(仅在 GUI 附近)
# require "gtk2"
# require "twitter"
## error classes and methods first
class Error_pop
def initialize(text)
@pop = Gtk::Dialog.new(
"Error",
nil,
Gtk::Dialog::MODAL,
[Gtk::Stock::OK, Gtk::Dialog::RESPONSE_OK]
)
@pop.default_response = Gtk::Dialog::RESPONSE_OK
@pop.set_size_request(400, 100)
@label = Gtk::Label.new("#{ text }")
@table = Gtk::Table.new(3, 1, false)
@table.attach_defaults(@label, 0, 1, 0, 2)
@pop.vbox.add(@table)
end
attr_accessor :pop, :table, :label
end
module Tueet
def tueet(text, account)
begin
account.rest_api.update(text) # calls gem: twitter
rescue => reason
error_pop = Error_pop.new(reason)
error_pop.pop.show_all
error_pop.pop.run do |response|
if response == Gtk::Dialog::RESPONSE_OK
end
end
error_pop.pop.destroy
return text
else
return nil
end
end
module_function :tueet
end
## making gui
window = Gtk::Window.new(Gtk::Window::TOPLEVEL)
window.title = "Tweet Box"
window.set_size_request(300, 150)
window.resizable = false
window.signal_connect('delete_event') do
Gtk.main_quit
false
end
inputter = Gtk::TextView.new
inputter.editable = true
inputter.wrap_mode = Gtk::TextTag::WRAP_WORD_CHAR
inputter_event = Gtk::EventBox.new # for key binding
inputter_event.events = Gdk::Event::KEY_PRESS_MASK
tweetbutton = Gtk::Button.new("tweet")
table = Gtk::Table.new(4, 9, true)
table.attach(inputter, 0, 9, 0, 3, Gtk::FILL||Gtk::EXPAND, Gtk::FILL||Gtk::EXPAND, 5, 5)
table.attach(tweetbutton, 3, 6, 3, 4)
inputter_event.add(table)
window.add(inputter_event)
inputter_event.realize
## signals and stuff
text = nil
tweetbutton.signal_connect('clicked') do
text = inputter.buffer.text
returned_text = Tueet.tueet(text, client[0]) # client[n] holds the authorized account information
inputter.buffer.text = String(returned_text)
end
inputter_event.signal_connect('key-press-event') do |wdt, evt|
key = Gdk::Keyval.to_name(evt.keyval)
p ("KeyPress: #{ key }was pressed") # these lines
p evt.state # are for
p evt.keyval # debugging
if key == 'Return' && # when "Ctrl + Return", do Tueet.tueet
( evt.state & Gdk::Window::CONTROL_MASK ==
Gdk::Window::ModifierType::CONTROL_MASK )
Tueet.tueet(text, client[0])
end
end
window.show_all
Gtk.main
而且,这行不通。当我按 Ctrl + Enter 时,它只是在 TextView 内换行。
只有在这样做时:
inputter = Gtk::TextView.new
inputter.editable = false # <- making this false
inputter.wrap_mode = Gtk::TextTag::WRAP_WORD_CHAR
使键绑定工作,但使我无法输入要向 TextView 发送的内容。
我怎样才能解决这个问题?我想知道有多少 GUI 应用程序这样做。