首页 > 解决方案 > 版本之间的 Python / Tkinter grid_rowconfigure 问题

问题描述

在处理一些示例时,我在 Python 3.9 中遇到了奇怪的行为。
grid_rowconfigure没有像我期望的那样扩展行。

不幸的是,在 Python3.9.2 或 Tk8.6 中寻找已报告的错误无济于事。
请在下面找到复制代码。

#!/usr/bin/python
"""
Code Stripped for Stackoverflow.
"""
from sys import hexversion
if hexversion < 0x03000000:
    # pylint: disable=import-error
    # if we are in 0x02whaterver that works
    import Tkinter as tk
    import ttk
else:
    import tkinter as tk
    from tkinter import ttk

class ScrolledTree(ttk.Frame):
    """ A Scrolled Treeview
    """
    def __init__(self, *args, **kwargs):
        # pylint: disable=unused-argument
        if hexversion < 0x03000000:
            ttk.Frame.__init__(self, *args, **kwargs)
        else:
            super().__init__()
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

        self.tree = ttk.Treeview(self)

        self.tree.grid(row=0, column=0, sticky=tk.NW+tk.SE)

        ttk.Style().configure("TFrame", background="red")
        ttk.Style().configure("ScrolledTree.TFrame", background="blue")

class ScrolledFilterTree(ttk.Frame):
    """ A Scrolled Tree with Filters
    """
    def __init__(self, *args, **kwargs):
        # pylint: disable=unused-argument
        if hexversion < 0x03000000:
            ttk.Frame.__init__(self, *args, **kwargs)
        else:
            super().__init__()
        ttk.Label(self, text="asdf").grid(row=0, column=0)
        self.tree = ScrolledTree(self)
        self.tree.grid(row=1, column=0, sticky=tk.NW+tk.SE)
        self.grid_rowconfigure(1, weight=1)
        self.grid_columnconfigure(0, weight=1)

        ttk.Style().configure("TFrame", background="red")
        ttk.Style().configure("ScrolledTree.TFrame", background="blue")

def test_show():

    root = tk.Tk()
    root.grid_rowconfigure(0, weight=1)
    root.grid_columnconfigure(0, weight=1)
    root.title("Show - ScrolledTree")
    app = ScrolledTree(root)
    app.grid(row=0, column=0, sticky=tk.NW+tk.SE)
    root.mainloop()

    root = tk.Tk()
    root.grid_rowconfigure(0, weight=1)
    root.grid_columnconfigure(0, weight=1)
    root.title("Show - ScrolledFilterTree")
    app = ScrolledFilterTree(root)
    app.grid(row=0, column=0, sticky=tk.NW+tk.SE)
    root.mainloop()
#end test_show

if __name__ == "__main__":
    test_show()

什么看起来很奇怪?

ScrolledText classes左边的(Python2.7 / Tk8.5)(Python 3.9 / Tk8.6)都很好。 使用它们会导致: (Python2.7 / Tk8.5) 在左边 (Python 3.9 / Tk8.6) 在右边
ScrolledFilteredText(Python2.7 / Tk8.5) 在左边 (Python 3.9 / Tk8.6) 在右边

有什么解释为什么这些看起来不同?或者 - 更准确地说 - 在重新调整根窗口时表现不同?

更新 1

操作系统: Windows 10 20H2(19042.985)x64
Python: 2.7.16 x64(v2.7.16:413a49145e,2019 年 3 月 4 日,01:37:19)
Python: 3.9.2 x64(标签/v3.9.2:1a79785,2021 年 2 月 19 日, 13:44:55)
Tk/Tcl: 来自 python 发行版的股票版本。

很感谢任何形式的帮助。

标签: python-2.7tkintertkpython-3.9

解决方案


由于您没有传递*argsand **kwargsto super().__init__(),即没有传递 parent 参数,ScrolledTree将被放置在根窗口而不是ScrolledFilterTreePython 3 中的框架中。

添加回来*args**kwargs解决super().__init__()问题。


推荐阅读