PyGTK:创建一个行为类似于OpenOffice的TextView

2024-09-20 07:35:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个“像办公室一样”的文本视图。即:

  • TextView本身有一个固定的宽度(因此它可以显示文本在一张纸上的样子)
  • 如果窗口(在其上压缩TextView)小于固定宽度:TextView应该是可滚动的
  • 如果窗口较大,请在左/右添加页边距以保持固定的宽度

这就是我想到的,它的实际行为和它应该的一样,只是如果你的光标离开了视窗,它就不会滚动,例如当你写一条需要比窗口当前宽度更多的空间的线。在

保持视口“同步”的最佳方法是什么?是否必须创建自定义视口?在

提前谢谢!在

#!/usr/bin/env python2
# encoding: utf-8

import gtk


class SheetTextView(gtk.TextView):
    WIDTH = 700

    def __init__(self):
        gtk.TextView.__init__(self)
        self.set_wrap_mode(gtk.WRAP_WORD)
        self.set_size_request(self.WIDTH, -1)
        self.connect('size-allocate', self._on_size_allocate)

    def _on_size_allocate(self, widget, event, data=None):
        # Reset left/right margin to simulate a fixed line width
        x, y, width, height = self.get_allocation()
        if width > self.WIDTH:
            margin = (width - self.WIDTH) / 2
            self.set_left_margin(margin)
            self.set_right_margin(margin)


if __name__ == "__main__":
    window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    window.connect('delete_event', gtk.main_quit)

    view = SheetTextView()

    scroll = gtk.ScrolledWindow()
    scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
    scroll.add_with_viewport(view)

    window.add(scroll)
    window.show_all()
    gtk.main()

Tags: margin文本selfgtksize宽度mainwindow