1

我正在练习基于 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 应用程序这样做。

4

0 回答 0