How to set justification on Tkinter Text box

前端 未结 4 1430
青春惊慌失措
青春惊慌失措 2020-12-02 00:51

Question

  1. How can I change the justification of specific lines in the ScrolledText widget in Tkinter?
  2. What was the reason
相关标签:
4条回答
  • 2020-12-02 01:33

    You're using an option named justify, but no such option exists for the text widget. Are you reading some documentation somewhere that says justify is a valid option? If so, you need to stop reading that documentation.

    There is, however, a justify option for text tags. You can configure a tag to have a justification, then apply that tag to one or more lines. I've never used a ScrolledText widget so I don't know if it has the same methods as a plain text widget, but with a plain text widget you would do something like this:

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

    In the above example, we are creating and configuring a tag named "center". Tags can have any name that you want. For the "center" tag we're giving it a justification of "center", and then applying that tag to all the text in the widget.

    You can tag individual lines by adjusting the arguments to the tag_add method. You can also give a list of tags when inserting text using the insert method.

    0 讨论(0)
  • 2020-12-02 01:34

    It is easy to understand why trying to set justify=CENTER for a Text widget fails: there is no such option for the widget.

    What you want is to create a tag with the parameter justify. Then you can insert some text using that tag (or you can insert any text and later apply the tag to a certain region):

    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()
    
    0 讨论(0)
  • 2020-12-02 01:37

    What maybe confusing people is that the documentation at http://effbot.org/tkinterbook/text.htm, referred to above, does in fact list justify as an option for the Text widget and maybe there was at one time, (seems like an option a text widget should have) but the documentation at http://www.tcl.tk/man/tcl8.4/TkCmd/text.htm does not list a justify option, only the -justify tag. Note that a Label widget can handle multi-line text and does have a -justify option.

    0 讨论(0)
  • 2020-12-02 01:50

    The problem is your Python syntax, not anything related to tkinter:

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

    That's not how you pass a keyword argument justify with value CENTER; you're passing a positional argument, with value justify(CENTER). So, Python tries to calculate justify(CENTER) by looking for a function named justify, doesn't find one, and raises a NameError.

    Moving it doesn't help, it just means you get a SyntaxError before you can even get to the NameError, because you've got a positional argument justify(CENTER) after the keyword argument font, and that's not allowed.

    The right way to do it is the same way you're passing all the other keyword arguments in the very next line:

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

    By the way changing the justification to CENTER isn't going to change anything from left-aligned to right-aligned; it's going to change it from left-aligned to centered. Are you sure you didn't want RIGHT?


    Once you've fixed the syntax problems, you've got a new problem, which is related to tkinter. The ScrolledText class just passes through its keyword params to the Text class, and the Text widget doesn't have a justify parameter.

    If you read the docs, justify is used as a tag associated with a range of text, not with the widget. So, you have to use tag_config with the justify property to create a named tag config, then you can apply it to ranges of text inside the widget, as the examples show. So:

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

    And of course this directly answers your other question:

    How can I change the justification of specific lines in the ScrolledText widget in Tkinter?

    Either insert them with the right tag in the first place, or select them and apply the tag after the fact.

    0 讨论(0)
提交回复
热议问题