如何设置Tkinter文本框的对齐方式

6 投票
4 回答
51249 浏览
提问于 2025-04-17 16:42

问题

  1. 我怎么才能改变Tkinter中ScrolledText小部件中特定行的对齐方式?
  2. 我之前出错的原因是什么?

背景

我现在正在做一个Tkinter文本框的应用,想找办法改变某一行的对齐方式。最终,我希望能把特定的行从左对齐改成右对齐等。目前,我只需要知道怎么改变整个文本框的对齐方式,当然如果能得到更多帮助就更好了。我一直在使用Effbot.org来帮助我解决问题。这是我为ScrolledText小部件写的代码:

代码

def mainTextFUN(self):
    self.maintextFrame = Frame (root, width = 50, height = 1,
                           )

    self.maintextFrame.grid(row = 1, column = 1, sticky = N, columnspan = 1,
                            rowspan = 1)

    self.write = ScrolledText(self.maintextFrame,
                              justify(CENTER),
                              width = 100, height = 35, relief = SUNKEN,
                              undo = True, wrap = WORD,
                              font = ("Times New Roman",12),
                              )
    self.write.pack()

当我运行这个时,我遇到了一个错误。

Traceback (most recent call last):
  File "D:\Python Programs\Text Editor\MyTextv5.py", line 132, in <module>
    app = Application(root)
  File "D:\Python Programs\Text Editor\MyTextv5.py", line 16, in __init__
    self.mainTextFUN()
File "D:\Python Programs\Text Editor\MyTextv5.py", line 57, in mainTextFUN
justify(CENTER),
NameError: global name 'justify' is not defined
>>> 

如果我把justify这个参数放在font参数之后,我又得到了一个不同的错误,显示在一个消息框里。

There's an error in your program:
*** non-keyword arg after keyword arg (MyTextv5.py, line 61)

编辑

我根据abarnert的建议修改了代码。我在self.maintextFrame之后添加了justify = CENTER,。尽管如此,我还是遇到了另一个错误。

Traceback (most recent call last):
  File "D:\Python Programs\Text Editor\MyTextv5.py", line 132, in <module>
    app = Application(root)
  File "D:\Python Programs\Text Editor\MyTextv5.py", line 16, in __init__
    self.mainTextFUN()
  File "D:\Python Programs\Text Editor\MyTextv5.py", line 60, in mainTextFUN
    font = ("Times New Roman",12),
  File "C:\Python27\lib\lib-tk\ScrolledText.py", line 26, in __init__
    Text.__init__(self, self.frame, **kw)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 2827, in __init__
    Widget.__init__(self, master, 'text', cnf, kw)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1974, in __init__
    (widgetName, self._w) + extra + self._options(cnf))
TclError: unknown option "-justify"

4 个回答

2

问题出在你的Python语法上,而不是和tkinter有关:

self.write = ScrolledText(self.maintextFrame,
                          justify(CENTER),
                          width = 100, height = 35, relief = SUNKEN,

你传递justify这个关键字参数时,值应该是,但你实际上传递的是一个位置参数,值是justify(CENTER)。所以,Python试图计算justify(CENTER),它在找一个叫justify的函数,但找不到,就报了NameError错误。

把它移动位置也没用,这样做只是让你在遇到NameError之前就先碰到SyntaxError,因为你在关键字参数font后面放了一个位置参数justify(CENTER),这是不允许的。

正确的做法是和你在下一行传递其他关键字参数的方式一样:

self.write = ScrolledText(self.maintextFrame,
                          justify = CENTER,
                          width = 100, height = 35, relief = SUNKEN,

顺便说一下,把对齐方式改成CENTER并不会把内容从左对齐改成右对齐,而是把内容从左对齐改成居中对齐。你确定你不想要RIGHT吗?


一旦你修正了语法问题,你会遇到一个新问题,这个问题和tkinter有关。ScrolledText类只是把它的关键字参数传递给Text类,而Text这个小部件并没有justify这个参数。

如果你查看文档,会发现justify是用来标记一段文本的,而不是用在小部件上的。所以,你需要使用tag_configjustify属性来创建一个命名的标签配置,然后你可以把它应用到小部件内的文本范围,就像示例所展示的那样。所以:

self.write.tag_config('justified', justify=RIGHT)
self.write.insert(INSERT, 'Ancients of Mu-Mu', 'justified')

当然,这也直接回答了你的另一个问题:

我如何在Tkinter的ScrolledText小部件中改变特定行的对齐方式?

要么一开始就用正确的标签插入它们,要么选择它们后再应用标签。

5

我们很容易明白,为什么在一个 Text 组件上设置 justify=CENTER 会失败:这个组件根本没有这个选项。

你想要做的是创建一个带有 justify 参数的标签。然后你可以使用这个标签插入一些文本(或者你可以先插入任何文本,之后再对某个区域应用这个标签):

import Tkinter

root = Tkinter.Tk()
text_widget = Tkinter.Text()
text_widget.pack(fill='both', expand=True)

text_widget.tag_configure('tag-center', justify='center')
text_widget.insert('end', 'text ' * 10, 'tag-center')

root.mainloop()
15

你在使用一个叫 justify 的选项,但这个选项在文本小部件中并不存在。你是不是在某个地方看到了说 justify 是有效选项的文档?如果是这样的话,你得停止看那个文档了。

不过,文本标签是有 justify 这个选项的。你可以设置一个标签来指定对齐方式,然后把这个标签应用到一行或多行文本上。我从来没有使用过 ScrolledText 小部件,所以不确定它是否和普通文本小部件有相同的方法,但在普通文本小部件中,你可以这样做:

t = tk.Text(...)
t.tag_configure("center", justify='center')
t.tag_add("center", 1.0, "end")

在上面的例子中,我们创建并配置了一个叫 "center" 的标签。标签的名字可以随便取。对于 "center" 标签,我们设置了对齐方式为 "center",然后把这个标签应用到小部件中的所有文本。

你可以通过调整 tag_add 方法的参数来给单独的行打标签。使用 insert 方法插入文本时,也可以给出一个标签列表。

撰写回答