Получение 'Gtk:ERROR' при попытке запустить WxRuby
Я использую Ubuntu 10.04 и пытаюсь запустить пример WxRuby, который я скопировал с этого сайта WxRubyWiki. Я искал помощи по сети, но я не мог найти ничего подобного...
Я получаю эту ошибку...
Gtk:ERROR:/build/buildd/gtk+2.0-2.20.1/gtk/gtkwindow.c:6789:IA__gtk_window_present_with_time: assertion failed: (widget->window != NULL)
Aborted
Эти версии я использую...
ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]
gem list
...
wxruby (2.0.1 x86-linux)
...
И это код, который я пытаюсь запустить...
require 'rubygems' if RUBY_VERSION < '1.9'
require 'wx'
class EventFrame < Wx::Frame
def initialize()
super(nil, -1, "Event Frame")
@idleCounter = 0
evt_close {|event| on_close(event)}
evt_idle {|event| on_idle(event)}
evt_size {|event| on_size(event)}
evt_key_down {|event| on_key(event)}
evt_left_down {|event| on_left_down(event)}
# You can still process these events, you just need to define a separate callback for middle_down and right_down
# to process them as separate events
evt_middle_down {|event| on_middle_down(event)}
evt_right_down {|event| on_right_down(event)}
button = Wx::Button.new(self, -1, "Push me")
evt_button(button.get_id()) {|event| on_button(event)}
show()
end
def message(text, title)
m = Wx::MessageDialog.new(self, text, title, Wx::OK | Wx::ICON_INFORMATION)
m.show_modal()
end
def on_close(event)
message("This frame will be closed after you push ok", "Close event")
#close(true) - Don't call this - it will call on_close again, and your application will be caught in an infinite loop
# Either call event.skip() to allow the Frame to close, or call destroy(), as follows
destroy()
end
def on_idle(event)
@idleCounter += 1
if @idleCounter > 15 # Without the counter to slow this down, Idle events would be firing every second
message("The system is idle right now", "Idle event")
@idleCounter = 0
end
event.request_more() # You must include this, otherwise the Idle event won't occur again
end
def on_size(event)
size = event.get_size()
x = size.x
y = size.y
message("X = " + x.to_s + ", Y = " + y.to_s, "Size event")
end
def on_key(event)
message("Key pressed", "Key Event")
end
def on_left_down(event)
button = ""
if event.left_down()
button = "Left"
end
message(button + " button was clicked", "Mouse event")
end
def on_middle_down(event)
# This method hasn't been implemented yet...
#if event.middle_down()
#button = "Middle"
#end
message("Middle button was clicked", "Mouse event")
end
def on_right_down(event)
# This method hasn't been implemented yet...
#if event.right_down()
#button = "Right"
#end
message("Right button was clicked", "Mouse event")
end
def on_button(event)
message("Button was clicked", "Button event")
end
end
class MyApp < Wx::App
def on_init
EventFrame.new()
end
end
MyApp.new.main_loop
Заранее спасибо!
2 ответа
Это скорее понимание того, как работает GTK+2/wx/wxRuby. Таким образом, приведенный выше код не работает в вашей конфигурации на машине Virtual Box, которую я настроил для тестирования, ни на Ubuntu 11.10 x86_64 моей машины для разработки с опцией компиляции ядра 1000 Гц и ruby 1.9.3 p21.
Ошибка GTK + 2 возникает, когда происходит событие on_size во время создания кадра. Создание еще не завершено, поэтому у окна сообщения на тот момент не было родителя. Вы можете проверить это, закомментировав (в def on_size(событие):
message("X = " + x.to_s + ", Y = " + y.to_s, "Size event")
и пытается:
puts "Size event: X = #{x}, Y = #{y}"
чтобы увидеть детали события на стандартном выходе. Вы заметите, что во время создания было запущено два события; событие начального размера и событие изменения размера
Еще одна оговорка - это простой цикл, который блокирует Unity в моей системе. Вы можете проверить, что событие простоя происходит без блокировки, изменив код, как показано ниже:
в def initialize добавьте это перед show():
create_status_bar(2)
self.status_text = "Welcome to wxRuby!"
тогда в idle_event:
def on_idle(event)
@idleCounter += 1
#if @idleCounter > 15 # Without the counter to slow this down, Idle events would be firing every second
# message("The system is idle right now", "Idle event")
# @idleCounter = 0
#end
set_status_text @idleCounter.to_s, 1
event.request_more() # You must include this, otherwise the Idle event won't occur again
end
Последнее предостережение о коде - вы можете заметить, что вы не видите событий нажатия клавиш или мыши, создающих их окно сообщения. Это происходит потому, что элемент управления кнопками заполняет клиентскую область и перехватывает события фрейма для клавиш и кнопок. Если вы изменяете размер фрейма во время работы приложения, кнопка не будет изменять его размер по умолчанию (платформа GTK + 2). Если вы затем щелкните внутри рамки клиентской области, но не на кнопке, вы увидите события мыши.
Удачи!