Tkinter Python 在画布中管理列表框内的滚动条

0 投票
1 回答
1529 浏览
提问于 2025-04-17 16:14

我有一段代码,里面有一个列表框放在一个画布里。我想把滚动条放在列表框里面,但现在的情况是,滚动条总是出现在整个窗口上。你能帮我把滚动条放在列表框里,而不是整个画布上吗?

def __init__(self):
    self.form = Tk()
    self.form.title("Admin");
    self.form.geometry('608x620+400+50')
    self.form.option_add("*font",("Monotype Corsiva",13))
    self.form.overrideredirect(True)
    self.form.resizable(width=FALSE, height=FALSE)
    self.canvas = Canvas(self.form)
    self.canvas.pack(expand=YES,fill=BOTH)
    self.photo = PhotoImage(file='src/back3.gif')
    self.canvas.create_image(-7,-8,image=self.photo,anchor=NW)

    self.scrollbar = tk.Scrollbar(self.canvas, orient="vertical")
    self.lb = tk.Listbox(self.canvas, width=78, height=15,yscrollcommand=self.scrollbar.set)
    self.lb.place(relx=0.04,rely=0.17)
    self.scrollbar.config(command=self.lb.yview)
    self.scrollbar.pack(side="right", fill="none")

1 个回答

1

我建议你创建一个 Frame 来把 ListboxScrollbar 包起来。下面是我写的一个类,功能和你想要的差不多,虽然它的代码和你的不完全一样——我用的是 grid() 而不是 pack(),但你可以理解这个思路。

class ScrollableListbox(tk.Listbox):
    def __init__(self, master, *arg, **key):
        self.frame = tk.Frame(master)
        self.yscroll = tk.Scrollbar(self.frame, orient=tk.VERTICAL)
        tk.Listbox.__init__(self, self.frame, yscrollcommand=self.yscroll.set, *arg, **key)
        self.yscroll['command'] = self.yview

    def grid(self, *arg, **key):
        self.frame.grid(*arg, **key)
        tk.Listbox.grid(self, row=0, column=0, sticky='nswe')
        self.yscroll.grid(row=0, column=1, sticky='ns')

撰写回答