RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 635144
Accepted
insolor
insolor
Asked:2020-03-04 02:47:10 +0000 UTC2020-03-04 02:47:10 +0000 UTC 2020-03-04 02:47:10 +0000 UTC

当内容适合文本框时自动隐藏滚动条

  • 772

我在 tkinter 中实现了我自己的带有垂直和水平滚动条的文本字段类:

import tkinter as tk
import tkinter.ttk as ttk

class CustomText(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent)

        yscrollbar = ttk.Scrollbar(self, orient=tk.VERTICAL)
        xscrollbar = ttk.Scrollbar(self, orient=tk.HORIZONTAL)

        self._text = tk.Text(self, *args,
                                xscrollcommand=xscrollbar.set,
                                yscrollcommand=yscrollbar.set,
                                **kwargs)

        yscrollbar['command'] = self._text.yview
        xscrollbar['command'] = self._text.xview

        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)
        self._text.grid(row=0, column=0, sticky='NSEW')
        yscrollbar.grid(row=0, column=1, sticky='NS')
        xscrollbar.grid(row=1, column=0, sticky='EW')

    def write(self, s):
        self._text.insert(tk.END, s)

    def clear(self):
        self._text.delete(0.0, tk.END)

root = tk.Tk()

text = CustomText(root, wrap=tk.NONE)
text.pack()

text.write('*\n' * 100)

tk.mainloop()

当文本水平或垂直完全适合该字段时,相应的滚动条将变为非活动状态。如何在不需要时完全隐藏滚动条?

窗口截图

python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    insolor
    2020-03-04T02:47:10Z2020-03-04T02:47:10Z

    tkinter 中的控件可以通过多种方式隐藏。让我们考虑其中两个:

    1. 方法.grid_forget()或.pack_forget()(取决于使用的放置方法),然后用相同的方法再次放置。这种方法的不便之处在于,例如使用.pack()新放置的控件放置时,会被添加到“最后”(例如,如果元素严格按照从上到下放置,则widget将被“拉出”从中间加上.pack_forget()然后加到最底部的方法.pack)。在放置 via 时.grid(),您可以明确指定隐藏后再次放置小部件的位置,但这个地方必须是硬编码或在某处“记住”。
    2. 方法.grid_remove()- 仅在使用 放置时有效.grid(),但在隐藏然后.grid()不带参数放置后,控件将准确返回到它被“拉出”的位置。

    以上信息取自En.SO 答案:显示和隐藏小部件 @BryanOakley

    由于我们使用 将滚动条放置在框架内.grid(),因此我们将使用第二种隐藏方法。

    当类小部件Text想要发出其内容已更改并且需要重新绘制滚动条的信号时,它会调用通过xscrollcommand和参数指定的适当函数yscrollcommand。.set()滚动条方法通常在那里被替换。

    该方法.set()采用两个参数:滚动条“滑块”的开始和结束位置(浮点格式从0.0to1.0转换为字符串,即 from '0.0'to '1.0')。当内容完全适合时,那么这些参数是相等的,分别是'0.0'- 开始,和'1.0'- 结束。

    在我们的实现中,我们将直接传递我们的函数,而不是指定方法,.set()该函数将检查参数是否相等'0.0'和'1.0',如果它们匹配,则隐藏滚动条,反之亦然显示它。

    import tkinter as tk
    import tkinter.ttk as ttk
    
    class CustomText(tk.Frame):
        def _scrollbar_switcher(self, scrollbar, first, last):
            scrollbar.set(first, last)
            if first == '0.0' and last == '1.0':
                scrollbar.grid_remove()
            elif not scrollbar.grid_info():
                scrollbar.grid()
        
        def __init__(self, parent, *args, **kwargs):
            super().__init__(parent)
    
            yscrollbar = ttk.Scrollbar(self, orient=tk.VERTICAL)
            xscrollbar = ttk.Scrollbar(self, orient=tk.HORIZONTAL)
    
            self._text = tk.Text(self, *args,
                xscrollcommand=lambda first, last: self._scrollbar_switcher(xscrollbar, first, last),
                yscrollcommand=lambda first, last: self._scrollbar_switcher(yscrollbar, first, last),
                **kwargs)
    
            yscrollbar['command'] = self._text.yview
            xscrollbar['command'] = self._text.xview
    
            self.grid_columnconfigure(0, weight=1)
            self.grid_rowconfigure(0, weight=1)
            self._text.grid(row=0, column=0, sticky='NSEW')
            yscrollbar.grid(row=0, column=1, sticky='NS')
            xscrollbar.grid(row=1, column=0, sticky='EW')
        
        def write(self, s):
            self._text.insert(tk.END, s)
        
        def clear(self):
            self._text.delete(0.0, tk.END)
    
    root = tk.Tk()
    
    text = CustomText(root, wrap=tk.NONE)
    text.pack(expand=1)
    
    # Просто для демонстрации циклически вносим много символов горизонтально, потом вертикально
    
    def vertical_text():
        text.clear()
        text.write('*\n' * 100)
        root.after(2000, horizontal_text)
    
    def horizontal_text():
        text.clear()
        text.write('*' * 100)
        root.after(2000, vertical_text)
    
    vertical_text()
    
    tk.mainloop()
    

    实施缺陷:隐藏滚动条时,父框架的大小会减小其宽度/高度(从下面的屏幕截图中的窗口大小可以看出)。

    更新:删除了向滚动条对象中插入字段visible,添加了方法返回的结果可见小部件的定义.grid_info()(如果小部件未打包到单元格中,则返回空字典)。

    横排文字

    垂直文本

    • 5

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5