试图从 "for" 循环滚动两个列表框

Stuck trying to scroll two Listboxes from "for" loop

我正在尝试学习如何在 Tkinter 中创建更高级的小部件组合,但由于文档稀少,我遇到了困难。每个框架都有一个日期和余额列表框,以及一个滚动条,该滚动条应在每个框架中滚动两个列表框。目前每个滚动条只能通过鼠标中键滚动或拖动滚动。使用滚动条箭头没有任何作用,每个列表框都独立滚动。我不确定我在下面的代码中做错了什么。

class BalanceLog:
    def month(self):
        month = [
            ['January', 31],
            ['February', 28],  # Check for leap year
            ['March', 31],
            ['April', 30],
            ['May', 31],
            ['June', 30],
            ['July', 31],
            ['August', 31],
            ['September', 30],
            ['October', 31],
            ['November', 30],
            ['December', 31]
        ]
        year = 2020

        mainFrame = tk.Frame(tkRoot)
        mainFrame.config(bd=2, relief='groove')
        mainFrame.grid(row=0, column=0, padx=70)

        trxLabel = tk.Label(mainFrame, text='Transactions ' + str(year), font='courierNew 20 bold')
        trxLabel.grid(row=0, columnspan=12, pady=(20, 0))

        # Hold each month frame
        self.monthFrame = []
        self.dayList = []
        self.endBalList = []
        self.vScroll = []

        for i in range(12):
            monthLabel = tk.Label(mainFrame, text=month[i][0], font='courierNew 12 bold')
            monthLabel.grid(row=1, column=i, pady=(20, 0))

            self.monthFrame.append(tk.Frame(mainFrame))
            self.monthFrame[i].config(bd=2, relief='groove')
            self.monthFrame[i].grid(row=2, column=i, sticky=tk.W)

            dayLabel = tk.Label(self.monthFrame[i], text='Day', font='courierNew 8 bold')
            dayLabel.config(relief='raised')
            dayLabel.grid(row=0, column=0, sticky=tk.W)

            endBalLabel = tk.Label(self.monthFrame[i], text='Ending Balance', font='courierNew 8 bold')
            endBalLabel.config(relief='raised')
            endBalLabel.grid(row=0, column=1, sticky=tk.W)

            self.dayList.append(tk.Listbox(self.monthFrame[i], width=3))
            self.dayList[i].config(bd=2, relief='sunken')
            self.dayList[i].grid(row=1, column=0, sticky=tk.W)

            self.endBalList.append(tk.Listbox(self.monthFrame[i], width=16))
            self.endBalList[i].config(bd=2, relief='raised', background='DARK GRAY')
            self.endBalList[i].grid(row=1, column=1, sticky=tk.W)

            self.vScroll.append(tk.Scrollbar(self.monthFrame[i], orient='vertical'))
            self.vScroll[i].grid(row=1, column=2, sticky=(tk.N, tk.S, tk.E))

            self.getFrame(idx=i)

            # Insert data
            for j in range(month[i][1]):
                self.dayList[i].insert(tk.END, 1 + j)
                self.endBalList[i].insert(tk.END, '999,999,999.99')

    def getFrame(self, idx):
        self.dayList[idx].config(yscrollcommand=self.vScroll[idx].set)
        self.endBalList[idx].config(yscrollcommand=self.vScroll[idx].set)
        self.scrollAll(idx)

    def scrollAll(self, idx):
        self.dayList[idx].yview(idx)
        self.endBalList[idx].yview(idx)

您忘记为滚动条分配 command 选项。

下面修改了getFrame()scrollAll()函数:

def getFrame(self, idx):
    self.dayList[idx].config(yscrollcommand=self.vScroll[idx].set)
    self.endBalList[idx].config(yscrollcommand=self.vScroll[idx].set)
    self.vScroll[idx].config(command=lambda *args: self.scrollAll(idx, *args))

def scrollAll(self, idx, *args):
    self.dayList[idx].yview(*args)
    self.endBalList[idx].yview(*args)