gpt4 book ai didi

python - 在 PyGObject/GTK+3 中格式化旋转按钮的显示

转载 作者:行者123 更新时间:2023-12-01 06:03:46 29 4
gpt4 key购买 nike

我正在将应用程序从 PyGTK 移植到 PyGObject。主要是进展顺利,因为我主要用 PyGTK 做了常规的事情。但是我使用了一个有点难看的 hack 将 SpinButton 的值显示为货币(前面有一个 $)。

我最初从 the PyGTK mailing list 得到这个解决方案早在 Stack Overflow 之前的日子里。正如您所看到的,神奇的事情发生在输入和输出信号上:

import gtk, ctypes

def _currency_input(spinbutton, gpointer):
text = spinbutton.get_text()
if text.startswith('$'):
text = text[1:]
double = ctypes.c_double.from_address(hash(gpointer))
double.value = float(text)
return True

def _currency_output(spinbutton):
text = '$%.*f' % (int(spinbutton.props.digits),
spinbutton.props.adjustment.value)
spinbutton.set_text(text)
return True

def format_spinbutton_currency(spinbutton):
spinbutton.connect('input', _currency_input)
spinbutton.connect('output', _currency_output)

def _test():
s = gtk.SpinButton(gtk.Adjustment(value=1, lower=0, upper=1000,
step_incr=1))
s.props.digits = 2
format_spinbutton_currency(s)
w = gtk.Window()
w.props.border_width = 12
w.add(s)
w.show_all()
w.connect('destroy', gtk.main_quit)
gtk.main()

if __name__ == '__main__':
_test()

尽我所能将其转换为 PyGObject,我想出了:

from gi.repository import Gtk
import ctypes

def _currency_input(spinbutton, gpointer):
text = spinbutton.get_text()
if text.startswith('$'):
text = text[1:]
double = ctypes.c_double.from_address(hash(gpointer))
double.value = float(text)
return True

def _currency_output(spinbutton):
text = '$%.*f' % (int(spinbutton.props.digits),
spinbutton.get_value())
spinbutton.set_text(text)
return True

def format_spinbutton_currency(spinbutton):
spinbutton.connect('input', _currency_input)
spinbutton.connect('output', _currency_output)

def _test():
s = Gtk.SpinButton()
s.set_adjustment(Gtk.Adjustment(value=1, lower=0, upper=1000,
step_increment=1))
s.props.digits = 2
format_spinbutton_currency(s)
w = Gtk.Window()
w.props.border_width = 12
w.add(s)
w.show_all()
w.connect('destroy', Gtk.main_quit)
Gtk.main()

if __name__ == '__main__':
_test()

不幸的是,这不起作用。它最初显示得很好,但是当我单击向上或向下错误时,它崩溃了,我看到:

/usr/lib/python2.7/dist-packages/gi/types.py:43: Warning: g_value_get_double: assertion `G_VALUE_HOLDS_DOUBLE (value)' failed
return info.invoke(*args, **kwargs)
Segmentation fault

知道这个错误消息是什么意思吗?

或者我的代码的哪一部分可能无法在 PyGObject 下工作?

或者,更好的是,如何修复此错误?

或者,更好的是,对我原来的问题有一个更直接的解决方案(在 SpinButton 内容前面显示 $)?

最佳答案

来自 PyGtk 文档:

http://developer.gnome.org/pygtk/stable/class-gtkspinbutton.html#signal-gtkspinbutton--input

当值改变时,会发出“输入”信号。 value_ptr 是一个指向无法从 PyGTK 访问的值的 GPointer。 此信号无法在 PyGTK 中处理

所以,我很惊讶地看到这样的事情:

double = ctypes.c_double.from_address(hash(gpointer))

这是一个真正的黑客,所以你得到了可怕的错误“段错误”,这意味着你不必要地弄乱了内存,而且它非常通用,例如当你在 C 中尝试手动访问时就会发生这种情况您的应用程序不处理的内存指针。

这将是一个困难的问题,我尝试了一个小时,我尝试的所有方法都有问题。我知道不是和答案,但作为一种解决方法,如果您只需要货币符号(而不是分组),您可以尝试将货币符号图像添加到继承的 Gtk.Entry set_icon_from_pixbuf():

enter image description here

(明显设置图片为货币图片)

亲切的问候

关于python - 在 PyGObject/GTK+3 中格式化旋转按钮的显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9051163/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com