【问题标题】:Positioning custom widget in tkinter在 tkinter 中定位自定义小部件
【发布时间】:2021-08-14 00:43:49
【问题描述】:

我正在尝试在一个窗口中定位自定义小部件的多个实例,目的是让用户将项目从一个小部件的 Listbox 移动到另一个小部件的位置。

我的小部件类:

import tkinter as tk

class DistriBox(tk.Frame):
    def __init__(self, parent, name):
        tk.Frame.__init__(self, parent)
        self.parent = parent
        self.label = tk.Label(self, text=name, anchor="center")
        self.label.grid(column=0, row=0)
        self.lb_locs = tk.Listbox(self, width=15, height=5)
        self.lb_locs.grid(column=0, row=1)

    def __iter__(self):
        return self

    def __getitem__(self, key):
        return self.lb_locs.size()

    def __setitem__(self, key, value):
        print('entering __setitem__ with %4d and %s' % (key, value))
        items_already = self.lb_locs.size()
        self.lb_locs.insert(items_already, value)

和应用程序:

import tkinter as tk
import DistriBox as db

class App(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.parent = parent

        group1 = []
        for i in range(0,3):
            group1.append(db.DistriBox(self, 'group 1'))
            group1[i].grid(column=0, row=i)

        group1[0] = 'California'
        group1[1] = 'Utah'

if __name__ == "__main__":
    root = tk.Tk()
    root.geometry('650x600')
    App(root).grid(column=0, row=0)
    root.mainloop()

问题:

  • 只绘制了 3 个小部件,而循环指定了 4 个。
  • 我无法将项目插入特定小部件的 Listbox

【问题讨论】:

  • 您知道range(0,3) 返回 0、1 和 2 但不是 3吗?

标签: python class tkinter indexing


【解决方案1】:

正如@Bryan Oakley 在评论中提到的那样,如果您想要四个小部件,则没有正确使用range()(当它为零时也没有必要指定起始值)。诚然,文档很模糊,所以我理解你的困惑。

至于为什么没有插入项目,这是因为您没有正确引用 DistriBox 小部件的实例 - group1 是它们的列表,因此引用其中一个并调用它的 __setitem__()方法,您需要有 两个 级别的索引,如下所示。请注意,我还更改了每个自定义小部件的 name,以便更容易区分它们。

import tkinter as tk
import DistriBox as db

class App(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.parent = parent

        group1 = []
        for i in range(4):  # CHANGED.
            group1.append(db.DistriBox(self, f'group {i}'))  # CHANGED.
            group1[i].grid(column=0, row=i)

        group1[0][0] = 'California'  # FIXED INDEXING.
        group1[0][1] = 'Utah'        # FIXED INDEXING.

if __name__ == "__main__":
    root = tk.Tk()
    root.geometry('650x600')
    App(root).grid(column=0, row=0)
    root.mainloop()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 2011-03-30
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多