
我正在嘗試製作一個 Ubuntu 應用程式。我需要將透明按鈕放置在 Glade 中背景圖像的特定位置上,以便圖像在單擊按鈕時發生變化。
到目前為止我還沒能做到這一點。我的按鈕根本沒有落在圖像上。此外,我還無法讓按鈕完全透明(即按下時可見)。
答案1
- 對於固定按鈕位置,最好使用
GtkFixed
orGtkLayout
(帶滾動) - 對於按鈕透明度,對我來說它應該正常工作。如果沒有嘗試:
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>
第一次,我以為你指的是桌面背景。所以,我只是留下它可能對其他人有幫助。
我不確定 Quickly 在(Ubuntu 13.04)中使用的是哪個版本的 PyGTK。最好用0.1的不透明度來測試。 Glade 不提供設定keep_below
屬性的選項。
pyGTK 3
添加:
<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()
pyGTK 2
添加:
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 __name__ == "__main__":
hello = HelloWorld()
hello.main()