我是这个地方和tkinter的新手。我坚持制作可滚动的列表框或画布。我已经尝试了两个小部件。在此列表框或画布中,我有几个条目和标签小部件。原点为R0,C0。我使用了行/列配置来拉伸列表框或画布。
在主窗口中,我在第四行至第四列有4个按钮(0,4-> 4,4)。我将滚动条放在第5列上。我尝试使用grid方法。我遇到的问题是使滚动条起作用。
注意:将大型机转变为类只是我尝试过的方法之一。包装右边的滚动条已成功,列表框/画布包装在左边。但是,命令滚动条的列表框/画布小部件不会滚动列表框/画布。另外,添加许多输入框不会导致列表框/画布滚动。请帮助。
from tkinter import *
from tkinter.ttk import *
Style().configure("B.TFrame", relief="flat",
background="blue")
Style().configure("R.TFrame", relief="flat",
background="red")
Style().configure("R.TLabel", background="red")
class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master, style="B.TFrame")
self.grid(sticky=N+S+E+W)
self.mainframe()
def mainframe(self):
top=self.winfo_toplevel()
self.menuBar = Menu(top)
top["menu"] = self.menuBar
self.subMenu = Menu(self.menuBar, tearoff=0)
self.subMenu2 = Menu(self.menuBar, tearoff=0)
self.menuBar.add_cascade(label="File", menu=self.subMenu)
self.menuBar.add_cascade(label="About", menu=self.subMenu2)
self.subMenu.add_command(label="Open")
self.subMenu.add_command(label="Save")
self.subMenu.add_command(label="Exit")
self.subMenu2.add_command(label="About")
self.subMenu2.add_command(label="Help")
self.data = Listbox (self, bg='red')
scrollbar = Scrollbar(self.data, orient=VERTICAL)
self.add = Button(self, text="")
self.remove = Button(self, text="")
self.run = Button(self, text="")
self.stop = Button(self, text="")
self.data.grid (row=0, column=0, rowspan=4, columnspan=4, sticky=N+E+S+W)
self.data.columnconfigure(1, weight=1)
self.data.columnconfigure(3, weight=1)
self.add.grid(row=4,column=0,sticky=EW)
self.remove.grid(row=4,column=1,sticky=EW)
self.run.grid(row=4,column=2,sticky=EW)
self.stop.grid(row=4,column=3,sticky=EW)
scrollbar.grid(column=5, sticky=N+S)
列表框中没有任何内容,没有可滚动的内容...
尽管这似乎行得通(简化了示例)。另请参见scrollbar documentation中的示例。
class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.grid(sticky=N+S+E+W)
self.mainframe()
def mainframe(self):
self.data = Listbox(self, bg='red')
self.scrollbar = Scrollbar(self.data, orient=VERTICAL)
self.data.config(yscrollcommand=self.scrollbar.set)
self.scrollbar.config(command=self.data.yview)
for i in range(1000):
self.data.insert(END, str(i))
self.run = Button(self, text="run")
self.stop = Button(self, text="stop")
self.data.grid(row=0, column=0, rowspan=4,
columnspan=2, sticky=N+E+S+W)
self.data.columnconfigure(0, weight=1)
self.run.grid(row=4,column=0,sticky=EW)
self.stop.grid(row=4,column=1,sticky=EW)
self.scrollbar.grid(column=2, sticky=N+S)
a = Application()
a.mainframe()
a.mainloop()
您必须为滚动条定义command
属性,并且必须向列表框提供yscrollcommand
属性。这两个属性共同作用以使某些内容可滚动。
[yscrollcommand
选项告诉列表框“当您在Y方向上滚动时,请调用此命令。这通常是滚动条的set
方法,因此,当用户通过箭头键滚动时,滚动条会更新
scorllbar的command
属性显示为“当用户移动您时,请调用此命令”。这通常是窗口小部件的yview
或xview
方法,这将导致窗口小部件在Y或X方向上更改其视图参数。
根据您的情况,在创建窗口小部件后,您可以这样做:
self.data.config(yscrollcommand=self.scrollbar.set)
scrollbar.config(command=self.data.yview)
此线程很旧,但如果有人像我一样碰到它,则需要一些精度。
Junuxx的答案按原样不起作用,不仅是因为在这里难以捕获代码(从“大型机”功能的一部分“ self.run”中提取代码)导致缩进问题,而且还因为似乎有必要放置列表框和滚动条放在自己的框架中。
这里是适用于Python 2和3的工作代码:
#!/usr/bin/env python2
try:
# for Python2
from Tkinter import *
except ImportError:
# for Python3
from tkinter import *
class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.grid(sticky=N+S+E+W)
self.mainframe()
def mainframe(self):
frame = Frame(self)
scrollbar = Scrollbar(frame, orient=VERTICAL)
data = Listbox(frame, yscrollcommand=scrollbar.set,
bg='red')
scrollbar.config(command=data.yview)
scrollbar.pack(side=RIGHT, fill=Y)
data.pack(side=LEFT, fill=BOTH, expand=1)
for i in range(1000):
data.insert(END, str(i))
self.run = Button(self, text="run")
self.stop = Button(self, text="stop")
frame.grid(row=0, column=0, rowspan=4,
columnspan=2, sticky=N+E+S+W)
frame.columnconfigure(0, weight=1)
self.run.grid(row=4,column=0,sticky=EW)
self.stop.grid(row=4,column=1,sticky=EW)
a = Application()
a.mainframe()
a.mainloop()
您可以在这里找到更多信息:https://www.effbot.org/tkinterbook/listbox.htm。希望这会有所帮助。