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

6

问题

  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个回答

15
您正在使用名为justify的选项,但文本小部件中不存在此选项。您是否在阅读某个文档,该文档说justify是一个有效的选项?如果是这样,请停止阅读该文档。
然而,对于文本标签,存在justify选项。您可以配置标签以具有对齐方式,然后将该标签应用于一个或多个行。我从未使用过ScrolledText小部件,因此不知道它是否具有与普通文本小部件相同的方法,但对于普通文本小部件,您可以执行以下操作:
t = tk.Text(...)
t.tag_configure("center", justify='center')
t.tag_add("center", 1.0, "end")

在上面的示例中,我们正在创建和配置名为“center”的标签。标签可以有任何你想要的名称。对于“center”标签,我们将其对齐方式设置为“center”,然后将该标签应用于小部件中的所有文本。
通过调整方法的参数,您可以标记单个行。您还可以在使用方法插入文本时给出标签列表。

“标签”是什么意思?你是说它可以让我更精确地格式化文档,还是其他什么?无论如何,请进一步阐述! - xxmbabanexx
@xxmbabanexx: 标签允许您按字符和按行关联字体、颜色、边距、对齐方式、基线偏移、自动换行等属性。在此处搜索“标签”:http://effbot.org/tkinterbook/text.htm - Bryan Oakley

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()

1
“标签”是什么意思?你是说它可以让我更精确地格式化文档,例如(在SO中,“** **”可以让我将某些内容加粗),还是其他什么?无论如何,请进一步阐述! - xxmbabanexx

2
问题出在你的 Python 语法上,与 tkinter 没有任何关系:
self.write = ScrolledText(self.maintextFrame,
                          justify(CENTER),
                          width = 100, height = 35, relief = SUNKEN,

这不是传递关键字参数justify值为CENTER的正确方式;您正在传递一个位置参数,其值为justify(CENTER)。因此,Python 尝试通过查找名为justify的函数来计算justify(CENTER),但未找到该函数,并引发了一个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_config和justify属性创建命名标记配置,然后可以像示例中那样将其应用于小部件内的文本范围。所以:
self.write.tag_config('justified', justify=RIGHT)
self.write.insert(INSERT, 'Ancients of Mu-Mu', 'justified')

当然,这直接回答了你的另一个问题:
“如何在Tkinter中更改ScrolledText小部件中特定行的对齐方式?”
要么在一开始插入时使用正确的标签,要么选择它们并在事后应用标签。

1
我在代码中添加了 justify = CENTER,但是却得到了另一个错误。我正在运行 Python 2.7.3,如果有关系的话。 - xxmbabanexx

1
可能会让人困惑的是,在上面提到的http://effbot.org/tkinterbook/text.htm的文档中,实际上确实将justify列为Text小部件的选项之一,也许曾经有过(似乎一个文本小部件应该有的选项),但http://www.tcl.tk/man/tcl8.4/TkCmd/text.htm的文档中没有列出justify选项,只有-justify标签。请注意,Label小部件可以处理多行文本,并且具有-justify选项。

不,该文档未将“justify”列为小部件选项。但是,它确实将其列为标签选项。搜索单词“justify”,唯一出现的地方是与标签相关的部分。该页面非常清楚地说明:“以下选项与tag_config一起使用,以指定使用某个标签的文本的视觉样式。” - Bryan Oakley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接