LINUX.ORG.RU

Вопросы по PyGTK


0

1

1) Убрать рамку окна
2) Назначить появление/скрытие формы по щелчку на иконку в трее (gtk.status_icon): как назначить действие при щелчке?
3) Переместить форму под курсор:
3а) Определить координаты курсора
3б) gtk.Window.move (x, y) (это ясно, я прав?)
4) gtk.Window.resize (25, 160) Что мешает форме сузиться? Она явно шире.

Все это на gambas элементарно сделал, что не знал - узнал.
А вот с питоном как-то не дружится, что-ли? Помогите...

если 3 пункт предполагается реализовывать для уже существующего и отрисованного окна, то за такое копчик массировать надо. если же необходимо открытие окна в зависимости от положения указателя мыши - gtk.Window.set_position(gtk.WIN_POS_MOUSE)

ananas ★★★★★
()
Ответ на: комментарий от fat_angel

За первую ссылку спасибо.
А вот во второй я не понимаю (из-за некомпетентности в англ. языке и питоне), можно пример?

For 4) На форме всего один объект:

	window = gtk.Window()
	window.set_decorated(False)
	vscale = gtk.VScale()
	vscale.set_range(0, 25)
	vscale.set_size_request(150, 15)
	vscale.set_digits(0)
	vscale.set_value(25-int(re.match('Value of mixer control (.*) is currently set to (.*).. \(dB\)', getoutput('ossmix '+mxr)).group(2)))
	vscale.connect("value-changed", vol)
	window.add(vscale)
	window.show()
	vscale.show()
	window.resize (25, 160)
	gtk.status_icon_new_from_file("./icon.svg")

Если еще не поняли это регулятор громкости для oss в трей, часть кода.

moscwich
() автор топика
Ответ на: комментарий от moscwich

> А вот во второй я не понимаю (из-за некомпетентности в англ. языке и питоне), можно пример?

запусти pygtk-demo, будет тебе масса примеров

ananas ★★★★★
()
Ответ на: комментарий от ananas

Такая блин масса, что по теме всего один пример, да и то нужного в нем нет.

moscwich
() автор топика
Ответ на: комментарий от ananas

Хотя кое-что мне этот пример подсказал, и я благодаря этому нашел через гугл то, что надо.

def test(icon):
	print "test" #действие, которое будет исполнятся по нажатию
...
icon.connect('activate', test)
moscwich
() автор топика

Вот так:

	def test(icon):
		print "test"
		window.show
		vscale.show
		window.resize (25, 160)
	global window
	window = gtk.Window()
	window.set_decorated(False)
	window.set_position(gtk.WIN_POS_MOUSE)
	global vscale
	vscale = gtk.VScale()
	vscale.set_range(0, 25)
	vscale.set_size_request(150, 15)
	vscale.set_digits(0)
	vscale.set_value(25-int(re.match('Value of mixer control (.*) is currently set to (.*).. \(dB\)', getoutput('ossmix '+mxr)).group(2)))
	vscale.connect("value-changed", vol)
	window.add(vscale)
	icon = gtk.status_icon_new_from_file("./icon.svg")
	icon.connect('activate', test)

Почему не работает???

moscwich
() автор топика
Ответ на: комментарий от ananas

ok, я перепутал ширину и высоту.

Теперь вот:

	global sw
	sw = False
	def test(icon):
		if sw == True:
			window.hide()
			sw = False
		else:
			window.set_position(gtk.WIN_POS_MOUSE)
			vscale.show()
			window.show()
			window.resize (25, 160)
			sw = True
Ругается так:
UnboundLocalError: local variable 'sw' referenced before assignment

moscwich
() автор топика
Ответ на: комментарий от moscwich

варвар

if window.get_visible():
    window.show()
else
    window.hide()

а resize(), set_position() и vscale.show() надо дергать только один раз, при создании окна. и лучше использовать не resize(), а set_default_size()

ananas ★★★★★
()
Ответ на: комментарий от moscwich

и еще, если пытаешься сделать всплывающее окно по щелчку на иконку в трее, окно лучше создавать с типом GTK_WINDOW_POPUP, и использовать не GtkVScale, а GtkScaleButton

ananas ★★★★★
()
Ответ на: комментарий от ananas

А что вы хотите) Первый раз с pyGtk на питоне, и практически второй с python вообще :)

Ну и наверное последний вопрос: не отображать в панели задач.

moscwich
() автор топика
Ответ на: комментарий от moscwich

> не отображать в панели задач

при использовании GTk_WINDOW_POPUP не надо будет заморачиваться ни с панелью, ни с обрамлением, ни с положением.

ananas ★★★★★
()
Ответ на: комментарий от moscwich

как-то так, если не заморачиваться с классами

import gtk

def activate (icon, w):
if not w.get_visible():
w.show()
else:
w.hide()

def set_pos (w, icon):
r = gtk.status_icon_position_menu(gtk.Menu(), icon)
w.move(r[0], r[1])

icon = gtk.status_icon_new_from_icon_name("audio-volume-high")

window = gtk.Window(gtk.WINDOW_POPUP)
window.set_position(gtk.WIN_POS_MOUSE)
window.set_default_size (25, 160)

vscale = gtk.VScale()
vscale.set_inverted(True)
vscale.set_range(0, 25)
vscale.set_digits(0)
vscale.show()
window.add(vscale)

window.connect('show', set_pos, icon)
icon.connect('activate', activate, window)

gtk.main()
ananas ★★★★★
()
Ответ на: комментарий от ananas

табы похерились, но, я думаю, и так понятно

ananas ★★★★★
()
Ответ на: комментарий от ananas
gtk.Window(gtk.WINDOW_POPUP)

Этой строчки было бы достаточно.

Но! По щелчку на иконку окно вылезает поверх даже панели и заслоняет иконку!!!

moscwich
() автор топика
Ответ на: комментарий от moscwich

код тут как раз причем. потому что я привел пример, который должен работать везде, вне зависимости от вм и его настроек. используя же обычное, не попап окно, можно нарваться на косяки, так как некоторые оконные менеджеры очень любят при определенных настройках плевать на хитрые запросы приложений типа модальности, орбрамления и т.п.

ananas ★★★★★
()
Ответ на: комментарий от ananas

http://itmages.ru/image/view/74364/40998e8d
И никак ее не закрыть т.к. она поверх иконки.

Полный код:

import gtk
import re
import os
from commands import *

sw = False
mxr = "vmix0-outvol "

def vol(widget):
	vol = str(25-widget.get_value())
	os.system ("ossmix "+mxr+vol)

class App():
	def swh(icon):
		if not window.get_visible():
			window.set_position(gtk.WIN_POS_MOUSE)
			window.show()
		else:
		    window.hide()
	
	global window
	global vscale
	
	window = gtk.Window(gtk.WINDOW_POPUP)
	#window.set_decorated(False)
	#window.resizable = False
	window.set_default_size (25, 160)
	window.set_position(gtk.WIN_POS_MOUSE)
	
	vscale = gtk.VScale()
	vscale.set_range(0, 25)
	vscale.set_digits(0)
	vscale.set_value(25-int(re.match('Value of mixer control (.*) is currently set to (.*).. \(dB\)', getoutput('ossmix '+mxr)).group(2)))
	vscale.connect("value-changed", vol)
	vscale.set_size_request(15, 150)
	vscale.show()
	
	window.add(vscale)
	
	icon = gtk.status_icon_new_from_file("./icon.svg")
	icon.connect('activate', swh)
	
if __name__ == "__main__":
	App()
	gtk.main()

moscwich
() автор топика
Ответ на: комментарий от moscwich

ты невнимателен.

выкинуть. и добавить обработчик сигнала show для window. смотри код, который я запостил, там он есть.

ananas ★★★★★
()
Ответ на: комментарий от moscwich

Окончательно (убрал лишнее):

#!/usr/bin/python

import gtk
import re
import os
from commands import *

mxr = "vmix0-outvol "

def vol(widget):
	vol = str(25-widget.get_value())
	os.system ("ossmix "+mxr+vol)

def swh(icon):
	if not window.get_visible():
		#window.set_position(gtk.WIN_POS_MOUSE)
		window.show()
	else:
	    window.hide()

def set_pos (w, icon):
	r = gtk.status_icon_position_menu(gtk.Menu(), icon)
	w.move(r[0], r[1])

global window
global vscale

vscale = gtk.VScale()
vscale.set_range(0, 25)
vscale.set_digits(0)
vscale.set_value(25-int(re.match('Value of mixer control (.*) is currently set to (.*).. \(dB\)', getoutput('ossmix '+mxr)).group(2)))
vscale.connect("value-changed", vol)
vscale.set_size_request(15, 150)
vscale.show()

icon = gtk.status_icon_new_from_file("./icon.svg")
icon.connect('activate', swh)

window = gtk.Window(gtk.WINDOW_POPUP)
window.set_default_size (25, 160)
window.connect('show', set_pos, icon)
window.add(vscale)

gtk.main()
moscwich
() автор топика
Ответ на: комментарий от ananas

Хотя global-ы точно надо выкинуть, window и так глобальная)

moscwich
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.