Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在文本小部件中折叠/展开文本_Python_Python 3.x_Tkinter - Fatal编程技术网

Python 在文本小部件中折叠/展开文本

Python 在文本小部件中折叠/展开文本,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我有一个文本小部件,上面打印了很多信息。我想有它的部分最小化,这样我可以隐藏信息,直到我需要它 from tkinter import * main = Tk() list1 = ['blah', 'blah', 'blah', 'blah', 'blah', 'blah', "\n" 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', "\n", 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', "\n

我有一个文本小部件,上面打印了很多信息。我想有它的部分最小化,这样我可以隐藏信息,直到我需要它

from tkinter import *

main = Tk()
list1 = ['blah', 'blah', 'blah', 'blah', 'blah', 'blah', "\n" 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', "\n", 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', "\n",'blah', 'blah', 'blah', 'blah', 'blah', 'blah' , "\n"]
list2 = ['blah', 'blah', 'blah', 'blah', 'blah', 'blah', "\n" 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', "\n", 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', "\n",'blah', 'blah', 'blah', 'blah', 'blah', 'blah' , "\n"]
list3 = ['blah', 'blah', 'blah', 'blah', 'blah', 'blah', "\n" 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', "\n", 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', "\n",'blah', 'blah', 'blah', 'blah', 'blah', 'blah' , "\n"]

textwin = Text(main, height=20, width=150)
textwin.grid(rowspan=5, columnspan=5)
textwin.config(state='normal')

textwin.insert('end', "+--------------------------------------------------------------------------------- \n")
textwin.insert('end', list1)
textwin.insert('end', "+--------------------------------------------------------------------------------- \n")
textwin.insert('end', list2)
textwin.insert('end', "+--------------------------------------------------------------------------------- \n")
textwin.insert('end', list3)


main.mainloop()
我试着在文本小部件中放置一个按钮,但它将文本小部件缩小到按钮的大小,并且不显示任何其他内容。我研究了链接文本,以便使“+”运行一个函数,删除/隐藏文本部分,但我只找到了超链接指令


如果这在文本小部件中不可行,我愿意接受其他想法。也许我必须将所有内容都移动到树视图小部件

您可以配置文本标记以隐藏一系列字符。然后,您可以通过应用或删除此标记来隐藏或显示一系列字符。如果要在文本中插入按钮,则需要使用文本小部件的
窗口\u create
方法

您必须编写代码来应用或删除标记。例如,您可以使用“block_start”或“heading”之类的标记块的开头,然后在该标记上添加双击绑定以查找它与下一个标题之间的所有代码,然后添加或删除“hidden”标记。或者,您可以嵌入一个按钮小部件来做同样的事情

配置标签:

textwin.tag_configure("hidden", elide=True)
隐藏文本块,其中
开始
结束
表示要隐藏的字符范围:

textwin.tag_add("hidden", start, end)
显示文本块,其中
开始
结束
表示要显示的字符范围:

textwin.tag_remove("hidden", start, end)
例子 以下代码是一个精心设计的示例,允许您双击标题以隐藏或显示标题下的文本:

import tkinter as tk
from tkinter import font

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent, borderwidth=1, relief="sunken")

        self.text = tk.Text(self, borderwidth=0, highlightthickness=0, wrap="word")
        self.vsb = tk.Scrollbar(self, command=self.text.yview)
        self.text.configure(yscrollcommand=self.vsb.set)

        self.vsb.pack(side="right", fill="y")
        self.text.pack(side="left", fill="both", expand=True)

        self.text.tag_configure("hidden", elide=True)
        self.text.tag_configure("header", background="black", foreground="white", spacing1=10, spacing3=10)
        self.text.tag_bind("header", "<Double-1>", self._toggle_visibility)

        for i in range(3):
            self.text.insert("end", "Header %s\n" % i, "header")
            self.text.insert("end", "blah blah blah blah\nblah blah blah\n\n")

    def _toggle_visibility(self, event):
        block_start, block_end = self._get_block("insert")
        # is any of the text tagged with "hidden"? If so, show it
        next_hidden = self.text.tag_nextrange("hidden", block_start, block_end)
        if next_hidden:
            self.text.tag_remove("hidden", block_start, block_end)
        else:
            self.text.tag_add("hidden", block_start, block_end)


    def _get_block(self, index):
        '''return indicies after header, to next header or EOF'''
        start = self.text.index("%s lineend+1c" % index)
        next_header = self.text.tag_nextrange("header", start)
        if next_header:
            end = next_header[0]
        else:
            end = self.text.index("end-1c")
        return (start, end)

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()
将tkinter作为tk导入
从tkinter导入字体
类示例(tk.Frame):
定义初始化(自身,父级):
tk.Frame.\uuuuu init\uuuuuuuuuuuuuuuuuuuuu(自、父、边界宽度=1,relief=“sunken”)
self.text=tk.text(self,borderwidth=0,highlightthickness=0,wrap=“word”)
self.vsb=tk.Scrollbar(self,command=self.text.yview)
self.text.configure(yscrollcommand=self.vsb.set)
自包装(side=“right”,fill=“y”)
self.text.pack(side=“left”,fill=“both”,expand=True)
self.text.tag_configure(“隐藏”,elide=True)
self.text.tag_configure(“header”,background=“black”,foreground=“white”,spacing1=10,spacing3=10)
self.text.tag\u bind(“header”,“”,self.\u切换\u可见性)
对于范围(3)中的i:
self.text.insert(“结束”,“标题%s\n”%i,“标题”)
self.text.insert(“结束”,“诸如此类”\n诸如此类\n\n)
定义切换可见性(自身、事件):
块开始,块结束=self.\u获取块(“插入”)
#是否有任何文本标记为“隐藏”?如果是的话,展示出来
next\u hidden=self.text.tag\u nextrange(“隐藏”,块开始,块结束)
如果下一个_隐藏:
self.text.tag\u remove(“隐藏”,块开始,块结束)
其他:
self.text.tag\u add(“隐藏”,块开始,块结束)
def_get_块(自,索引):
''返回标题后的标记,到下一个标题或EOF''
start=self.text.index(“%s lineend+1c”%index)
next\u header=self.text.tag\u nextrange(“header”,开始)
如果下一个_标题:
结束=下一个_头[0]
其他:
end=self.text.index(“end-1c”)
返回(开始、结束)
如果名称=“\uuuuu main\uuuuuuuu”:
root=tk.tk()
示例(root).pack(fill=“both”,expand=True)
root.mainloop()

当我点击“标题”右侧时,它只会最小化下面的部分文本。这是被通缉的行为吗?@double_j:我不知道,我没怎么想。重点不是为您提供生产就绪的代码,而是说明如何在标签上使用
elide
选项。你需要想出自己的方法来决定隐藏什么。真的。我不认为这是生产准备,但我看不到的行为代码,并好奇它是如何发生的。无论如何,谢谢你的例子。这完全回答了我的问题。谢谢。插入新行后,我如何在输入时隐藏它而不首先双击它?