Ubuntuアプリケーションを作成しようとしています。 Gladeの背景画像の特定の場所に透明なボタンを配置して、ボタンをクリックすると画像が変わるようにする必要があります。
私はこれをこれまで達成できませんでした。私のボタンは単に画像に着地しません。さらに、ボタンを完全に透明にすることもできませんでした(つまり、ボタンを押すと表示されます)。
GtkFixed
またはGtkLayout
(スクロールあり)を使用することをお勧めしますBorder Relief
:フラットボタンのNone
Focus on Click
のチェックを外して、フォーカスのハイライトを回避します例:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<interface>
<requires lib="gtk+" version="3.10"/>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<child>
<object class="GtkLayout" id="layout1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">button</property>
<property name="width_request">59</property>
<property name="height_request">30</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="opacity">0</property>
</object>
<packing>
<property name="x">87</property>
<property name="y">64</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
初めて、デスクトップの背景を意味すると思いました。だから、私はそれが他の人に役立つかもしれないままにしておきます。
(Ubuntu 13.04)でQuickyが使用しているPyGTKのバージョンはわかりません。 0.1の不透明度を使用してテストすることをお勧めします。 Gladeには、keep_below
プロパティを設定するオプションはありません。
追加:
<property name="opacity">0.0</property>
<property name="decorated">False</property>
に
builder_example.glade
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<!-- <property name="keep_below">True</property> -->
<property name="opacity">0.0</property>
<property name="decorated">False</property>
<!-- <property name="position">gtk.WIN_POS_CENTER_ALWAYS</property> -->
<signal name="delete-event" handler="onDeleteWindow" swapped="no"/>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">button</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<signal name="pressed" handler="onButtonPressed" swapped="no"/>
</object>
</child>
</object>
</interface>
エラーが発生したため、これらをコメントしました(Gladeに他の方法があるかどうかはわかりません)
<!-- <property name="keep_below">True</property> -->
<!-- <property name="position">gtk.WIN_POS_CENTER_ALWAYS</property> -->
そこで、それらを.pyファイルに追加して動的に適用します。
window.set_keep_below(True)
window.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
builder_example.py
from gi.repository import Gtk
class Handler:
def onDeleteWindow(self, *args):
Gtk.main_quit(*args)
def onButtonPressed(self, button):
print("Hello World!")
builder = Gtk.Builder()
builder.add_from_file("builder_example.glade")
builder.connect_signals(Handler())
window = builder.get_object("window1")
window.set_keep_below(True)
window.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
window.show_all()
Gtk.main()
追加:
self.window.set_keep_below(True)
self.window.set_opacity(0.0)
self.window.set_decorated(False)
self.window.set_position(gtk.WIN_POS_CENTER_ALWAYS)
helloworld.py
へ
#!/usr/bin/env python
# example helloworld.py
import pygtk
pygtk.require('2.0')
import gtk
class HelloWorld:
# This is a callback function. The data arguments are ignored
# in this example. More on callbacks below.
def hello(self, widget, data=None):
print "Hello World"
def delete_event(self, widget, event, data=None):
# If you return FALSE in the "delete_event" signal handler,
# GTK will emit the "destroy" signal. Returning TRUE means
# you don't want the window to be destroyed.
# This is useful for popping up 'are you sure you want to quit?'
# type dialogs.
print "delete event occurred"
# Change FALSE to TRUE and the main window will not be destroyed
# with a "delete_event".
return False
def destroy(self, widget, data=None):
print "destroy signal occurred"
gtk.main_quit()
def __init__(self):
# create a new window
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
# Add these
self.window.set_keep_below(True)
self.window.set_opacity(0.0)
self.window.set_decorated(False)
self.window.set_position(gtk.WIN_POS_CENTER_ALWAYS)
# When the window is given the "delete_event" signal (this is given
# by the window manager, usually by the "close" option, or on the
# titlebar), we ask it to call the delete_event () function
# as defined above. The data passed to the callback
# function is NULL and is ignored in the callback function.
self.window.connect("delete_event", self.delete_event)
# Here we connect the "destroy" event to a signal handler.
# This event occurs when we call gtk_widget_destroy() on the window,
# or if we return FALSE in the "delete_event" callback.
self.window.connect("destroy", self.destroy)
# Sets the border width of the window.
self.window.set_border_width(10)
# Creates a new button with the label "Hello World".
self.button = gtk.Button("Hello World")
# When the button receives the "clicked" signal, it will call the
# function hello() passing it None as its argument. The hello()
# function is defined above.
self.button.connect("clicked", self.hello, None)
# This will cause the window to be destroyed by calling
# gtk_widget_destroy(window) when "clicked". Again, the destroy
# signal could come from here, or the window manager.
self.button.connect_object("clicked", gtk.Widget.destroy, self.window)
# This packs the button into the window (a GTK container).
self.window.add(self.button)
# The final step is to display this newly created widget.
self.button.show()
# and the window
self.window.show()
def main(self):
# All PyGTK applications must have a gtk.main(). Control ends here
# and waits for an event to occur (like a key press or mouse event).
gtk.main()
# If the program is run directly or passed as an argument to the python
# interpreter then create a HelloWorld instance and show it
if __== "__main__":
hello = HelloWorld()
hello.main()