如何设置Tkinter文本框的对齐方式
问题
- 我怎么才能改变Tkinter中
ScrolledText
小部件中特定行的对齐方式? - 我之前出错的原因是什么?
背景
我现在正在做一个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 个回答
问题出在你的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_config
和justify
属性来创建一个命名的标签配置,然后你可以把它应用到小部件内的文本范围,就像示例所展示的那样。所以:
self.write.tag_config('justified', justify=RIGHT)
self.write.insert(INSERT, 'Ancients of Mu-Mu', 'justified')
当然,这也直接回答了你的另一个问题:
我如何在Tkinter的ScrolledText小部件中改变特定行的对齐方式?
要么一开始就用正确的标签插入它们,要么选择它们后再应用标签。
我们很容易明白,为什么在一个 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()
你在使用一个叫 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
方法插入文本时,也可以给出一个标签列表。