如何根据窗口内的鼠标移动和鼠标位置显示/隐藏工具栏?

时间:2014-10-09 07:30:13

标签: python user-interface gtk gtk3

我喜欢使用Python和GTK +。在我的GUI中我有2个工具栏我想要显示第一个工具栏只有当用户移动鼠标而不是几秒后再次隐藏它时第二个工具栏我想在用户处于特定的x,y坐标时显示它。我怎么能实现它? / p>

编辑:

我创建了某种媒体播放器,所以我希望工具栏在玩家不使用鼠标的情况下消失,如果是playerMenu工具栏,或者如果用户没有将其移动到特定位置(如果是带状框工具栏)。我在这里使用GTK +是我的工具栏代码:

class Player(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
    def build_UI(self):
        container=Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        ribbonBar=Gtk.Toolbar()
        playerMenu=Gtk.Toolbar()

   def mouse_moved(self):
       #TO-DO here I should check cordinates for example I want to see if mouse.y=window.height-50px and I would like to show ribbonaBar
       #after that Gdk.threads_add_timeout(1000,4000,ribbonBar.hide)

       #TO-DO here I show playerMenu toolbar if mouse is moved
       # smt like playerMenu.show() 
       #after that I would call Gdk.threads_add_timeout(1000,4000,playerMenu.hide)
       # to hide it again after 4 seconds 

我应该将我的窗口连接到一些鼠标事件,但我不知道事件名称,我怎么能得到mouse.x和mouse.y?

1 个答案:

答案 0 :(得分:1)

你为什么要这样做?试着使用当你不移动鼠标时消失的小部件是相当烦人的,恕我直言。

但无论如何......

要切换窗口小部件的可见性,请使用show()和hide()方法,或者如果您不希望窗口中的其他窗口小部件移动,请使用map()和unmap()。要处理时间,请使用gobject.timeout_add(),并且您需要将()窗口连接到(" motion_notify_event"并设置适当的事件掩码:gtk.gdk.POINTER_MOTION_MASK,可能还有gtk.gdk.POINTER_MOTION_HINT_MASK。您的motion_notify回调接收的Event对象将包含x,y鼠标坐标。

至少,这是我在GTK2中的表现方式;我不懂GTK3。

如果您需要更具体的帮助,您需要发布一些代码。


我看到你发布了一些代码,但它没有很多细节......但我知道GTK可能有点压倒性。在过去的5年里,我还没有使用它,所以我有点生疏,但几个月前我刚开始接触它,并认为你的问题会给我一些好的练习。 :)

我不会声称下面的代码是执行此操作的最佳方式,但它确实有效。希望有GTK专家的人会有一些改进。

该程序使用几个按钮构建一个简单的工具栏。它将工具栏放入框架中以使其看起来更好,并将框架放入事件框中,以便我们可以接收框架中所有内容的事件,即工具栏及其工具项目。工具栏仅在鼠标指针移动时显示,并在几秒钟后消失,除非指针悬停在工具栏上。

此代码还向您展示了如何获取和处理鼠标x,y坐标。

#!/usr/bin/env python

''' A framed toolbar that disappears when the pointer isn't moving
    or hovering in the toolbar.

    A response to the question at
    http://stackoverflow.com/questions/26272684/how-can-i-show-hide-toolbar-depending-on-mouse-movements-and-mouse-position-insi

    Written by PM 2Ring 2014.10.09
'''

import pygtk
pygtk.require('2.0')
import gtk
import gobject

if gtk.pygtk_version < (2, 4, 0):
    print 'pygtk 2.4 or better required, aborting.'
    exit(1)


class ToolbarDemo(object):
    def button_cb(self, widget, data=None):
        #print "Button '%s' %s clicked" % (data, widget)
        print "Button '%s' clicked" % data
        return True

    def show_toolbar(self, show):
        if show:
            #self.frame.show()
            self.frame.map()
        else:
            #self.frame.hide()
            self.frame.unmap()

    def timeout_cb(self):
        self.show_toolbar(self.in_toolbar)
        if not self.in_toolbar:
            self.timer = False
        return self.in_toolbar

    def start_timer(self, interval):
        self.timer = True
        #Timer will restart if callback returns True
        gobject.timeout_add(interval, self.timeout_cb)

    def motion_notify_cb(self, widget, event):
        if not self.timer:
            #print (event.x, event.y)
            self.show_toolbar(True)
            self.start_timer(self.time_interval)
        return True

    def eventbox_cb(self, widget, event):
        in_toolbar = event.type == gtk.gdk.ENTER_NOTIFY
        #print event, in_toolbar
        self.in_toolbar = in_toolbar

        #### self.show_toolbar(in_toolbar) does BAD things :)
        if in_toolbar:
            self.show_toolbar(True)
        return True

    def quit(self, widget): gtk.main_quit()

    def __init__(self):
        #Is pointer over the toolbar Event box?
        self.in_toolbar = False

        #Is pointer motion timer running?
        self.timer = False

        #Time in milliseconds after point stops before toolbar is hidden
        self.time_interval = 3000


        self.window = win = gtk.Window(gtk.WINDOW_TOPLEVEL)
        width = gtk.gdk.screen_width() // 2
        height = gtk.gdk.screen_height() // 5
        win.set_size_request(width, height)
        win.set_title("Magic Toolbar demo")
        win.set_border_width(10)

        win.connect("destroy", self.quit)
        #self.motion_handler = win.connect("motion_notify_event", self.motion_notify_cb)
        win.connect("motion_notify_event", self.motion_notify_cb)
        win.add_events(gtk.gdk.POINTER_MOTION_MASK |
            gtk.gdk.POINTER_MOTION_HINT_MASK)

        box = gtk.VBox()
        box.show()
        win.add(box)

        #An EventBox to capture events inside Frame,
        # i.e., for the Toolbar and its child widgets.
        ebox = gtk.EventBox()
        ebox.show()
        ebox.set_above_child(True)
        ebox.connect("enter_notify_event", self.eventbox_cb)
        ebox.connect("leave_notify_event", self.eventbox_cb)
        box.pack_start(ebox, expand=False)

        self.frame = frame = gtk.Frame()
        frame.show()
        ebox.add(frame)

        toolbar = gtk.Toolbar()
        #toolbar.set_border_width(5)
        toolbar.show()
        frame.add(toolbar)

        def make_toolbutton(text):
            button = gtk.ToolButton(None, label=text)
            #button.set_expand(True)
            button.connect('clicked', self.button_cb, text)
            button.show()
            return button

        def make_toolsep():
            sep = gtk.SeparatorToolItem()
            sep.set_expand(True)
            #sep.set_draw(False)
            sep.show()
            return sep

        for i in xrange(5):
            button = make_toolbutton('ToolButton%s' % (chr(65+i)))
            toolbar.insert(button, -1)
            #toolbar.insert(make_toolsep(), -1)

        for i in xrange(1, 9, 2):
            toolbar.insert(make_toolsep(), i)

        button = gtk.Button('_Quit')
        button.show()
        box.pack_end(button, False)
        button.connect("clicked", self.quit)

        win.show()
        frame.unmap()


def main():
    ToolbarDemo()
    gtk.main()


if __name__ == "__main__":
    main()